2016年4月27日

[TOC]

2016年4月27日

javascript

字符串

读取注释:

(function () { /*
line 1
line 2
line 3
*/}).toString().split('\n').slice(1, -1).join('\n')
// "line 1 line 2 line 3"

转义

反斜杠(\\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。

  • \0 代表没有内容的字符(\u0000)

  • \b 后退键(\u0008)

  • \f 换页符(\u000C)

  • \n 换行符(\u000A)

  • \r 回车键(\u000D)

  • \t 制表符(\u0009)

  • \v 垂直制表符(\u000B)

  • \' 单引号(\u0027)

  • \" 双引号(\u0022)

  • \\ 反斜杠(\u005C)

  • \XXX 用三个八进制数(000到377)表示字符,XXX对应该字符的Unicode,比如\251表示版权符号。

  • \xXX 用两个十六进制数(00到FF)表示字符,XX对应该字符的Unicode,比如\xA9表示版权符号。

  • \uXXXX 用四位十六进制的Unicode编号代表某个字符,比如\u00A9表示版权符号。

'\251' // "©"
'\xA9' // "©"
'\u00A9' // "©"

'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true

字符串内部的单个字符无法改变和增删,这些操作会默默地失败。

var s = 'hello';

delete s[0];
s // "hello"

s[1] = 'a';
s // "hello"

s[5] = '!';
s // "hello"

length属性返回字符串的长度,该属性也是无法改变的。

var s = 'hello';
s.length // 5

s.length = 3;
s.length // 5

字符集

JavaScript使用Unicode字符集,也就是说在JavaScript内部,所有字符都用Unicode表示。

每个字符在JavaScript内部都是以16位(即2个字节)的UTF-16格式储存。也就是说,JavaScript的单位字符长度固定为16位长度,即2个字节。

Base64转码

Base64是一种编码方法,可以将任意字符转成可打印字符。使用这种编码方法,主要不是为了加密,而是为了不出现特殊字符,简化程序的处理。

JavaScript原生提供两个Base64相关方法。

  • btoa():字符串或二进制值转为Base64编码

  • atob():Base64编码转为原来的编码

这两个方法不适合非ASCII码的字符,会报错。

var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"

要将非ASCII码字符转为Base64编码,必须中间插入一个转码环节,再使用这两个方法。

function b64Encode(str) {
  return btoa(encodeURIComponent(str));
}

function b64Decode(str) {
  return decodeURIComponent(atob(str));
}

b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"

encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。

escape,encodeURI,encodeURIComponent

  • escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

  • encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

  • encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

区别:

  • 传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。

    <script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent ("http://cang.baidu.com/bruce42")+'">退出</a>');
    </script>
  • 进行url跳转时可以整体使用encodeURI

Location.href=encodeURI(http://cang.baidu.com/do/s?word=百度&ct=21);
  • js使用数据时可以使用escape

例如:搜藏中history纪录。

  • escape对0-255以外的unicode值进行编码时输出%u**格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。

解码

  • unescape 方法

  • decodeURI 方法

  • decodeURIComponent 方法

资料:http://www.cnblogs.com/jhxk/articles/1634359.html

三个函数主要区别在于不编码字符的不同:

document.write(encodeURIComponent("!#$&'()*+,-./:;=?@_~")+ "<br />")
document.write(escape("!#$&'()*+,-./:;=?@_~")+ "<br />")
document.write(encodeURI("!#$&'()*+,-./:;=?@_~")+ "<br />")

//结果:
//!%23%24%26'()*%2B%2C-.%2F%3A%3B%3D%3F%40_~
//%21%23%24%26%27%28%29*+%2C-./%3A%3B%3D%3F@_%7E
//!#$&'()*+,-./:;=?@_~

编程风格

不使用分号的情况

  • for和while循环

for ( ; ; ) {
} // 没有分号

while (true) {
} // 没有分号


do {
  a--;
} while(a > 0); // 分号不能省略
  • 分支语句:if,switch,try

if (true) {
} // 没有分号

switch () {
} // 没有分号

try {
} catch {
} // 没有分号
  • 函数的声明语句

function f() {
} // 没有分号


//但是函数表达式仍然要使用分号。
var f = function f() {
};

如果本行的结尾或者下一行起首的,是(、[、+、-、/这五个字符中的一个,分号不会被自动添加。

变量声明

为了避免可能出现的问题,最好把变量声明都放在代码块的头部。

for (var i = 0; i < 10; i++) {
  // ...
}

// 写成

var i;
for (i = 0; i < 10; i++) {
  // ...
}

new命令

JavaScript使用new命令,从构造函数生成一个新对象。

var o = new myObject();

一旦你忘了加上new,myObject()内部的this关键字就会指向全局对象,导致所有绑定在this上面的变量,都变成全局变量。

相等和严格相等

因为”相等”运算符会自动转换变量类型,造成很多意想不到的情况:

0 == ''// true
1 == true // true
2 == true // false
0 == '0' // true
false == 'false' // false
false == '0' // true
’ \t\r\n ' == 0 // true

switch…case结构

switch...case结构要求,在每一个case的最后一行必须是break语句,否则会接着运行下一个case。

switch...case不使用大括号,不利于代码形式的统一。

function doAction(action) {
  switch (action) {
    case 'hack':
      return 'hack';
      break;
    case 'slash':
      return 'slash';
      break;
    case 'run':
      return 'run';
      break;
    default:
      throw new Error('Invalid action.');
  }
}

上面的代码建议改写成对象结构。

function doAction(action) {
  var actions = {
    'hack': function () {
      return 'hack';
    },
    'slash': function () {
      return 'slash';
    },
    'run': function () {
      return 'run';
    }
  };

  if (typeof actions[action] !== 'function') {
    throw new Error('Invalid action.');
  }

  return actions[action]();
}

Last updated