课程《重学前端》的一些记录

模块一:JavaScript


1. 为何有的编程规范要求用viod 0代替undefined

  • 因为js中,undefined不是一个关键字而是一个变量(这也是js公认的bug),为了避免undefined的值被篡改,建议使用void 0来代替undefinedvoid后跟任何值结果都是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编码,我们字符串的操作 charAtcharCodeAtlength等方法针对的都是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

5. ES6新加入的Symbol是什么

6. 为何给对象添加的方法能用在基本类型上

你可能感兴趣的:(课程《重学前端》的一些记录)