模块一:JavaScript
1. 为何有的编程规范要求用viod 0
代替undefined
?
- 因为
js
中,undefined
不是一个关键字而是一个变量(这也是js
公认的bug),为了避免undefined
的值被篡改,建议使用void 0
来代替undefined
(void
后跟任何值结果都是undefined
) - 在全局环境中,
undefined
不能被赋值;而局部环境中可以 - 举个例子:
(function(){
var a;
var undefined = 3;
if(a === undefined) {
console.log('a===undefined');
}
if(a !== undefined) {
console.log('a!==undefined');
}
})()
结果:a!==undefined
2. 字符串是否有最大长度?
String
用于表示文本数据。String
有最大长度是2^53 - 1
,这在一般开发中都是够用的,但是有趣的是,这个所谓最大长度,并不完全是你理解中的字符数。因为 String
的意义并非“字符串”,而是字符串的 UTF16
编码,我们字符串的操作 charAt
、charCodeAt
、length
等方法针对的都是UTF16
编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。
3. JS中的字符串无法变更
来看下面这个例子:
var str = 'hello';
str[0] = 1;
console.log(str); // 'hello'
str = 'hello world';
console.log(str); // 'hello world'
- 我们试图修改字符串
str
中的第一个字符,结果发现str
还是hello
,这说明字符串是无法被更改的; - 而将
str
重新赋值为hello world
,可以看到输出的为hello world
,这是否说明字符串被成功更改了呢? - 实则不然。js中字符串的拼接、重复赋值等都会引用新的地址空间来存放字符串的值(因此很消耗内存),引用字符串的变量地址变了,字符串本身并没有改变。
4. 为何0.1 + 0.2 不等于0.3
console.log(0.1 + 0.2 === 0.3); // flase;
输出的结果是false,说明两边的值不相等。这是浮点运算的特点。浮点运算的精度问题导致等式左右两端的结果并不是严格相等的,而是差了一个微小的数。
正确的比较方法是使用js提供的最小精度值:
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON); // true