模块一: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













网友评论