[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"
转义
反斜杠(\\)在字符串内有特殊含义,用来表示一些特殊字符,所以又称为转义符。
\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编码
这两个方法不适合非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>
Location.href=encodeURI(http://cang.baidu.com/do/s?word=百度&ct=21);
例如:搜藏中history纪录。
escape对0-255以外的unicode值进行编码时输出%u**格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
解码
资料: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 (true) {
} // 没有分号
do {
a--;
} while(a > 0); // 分号不能省略
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]();
}