Undefined 和 Null
- undefined表示未定义
- 是一个变量,并非一个关键字,在某些局部环境中可以通过 undefined = xxx 进行对 undefined 的篡改
- 可以使用 void 0 代替 undifined 表示未定义,不过通常情况下 undefined 不会被允许可以修改
- Null 是一个关键字,表示已定义,但是是一个空值
String
- String的意义并非“字符串”,而是字符串的UTF16编码
- 字符串的charAt、length等方法都是针对UTF16编码
- JavaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。
var test = 'hello';
test[0] = 'a'
console.log(test) // hello
Number
- JavaScript 中的 Number 类型基本符合 IEEE 754-2008 规定的双精度浮点数规则,但是 JavaScript 为了表达几个额外的语言场景(比如不让除以 0 出错,而引入了无穷大的概念),规定了几个例外情况:
-
- NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
- Infinity,无穷大;
- -Infinity,负无穷大。
- 根据浮点数的定义,非整数的 Number 类型无法用 ==(=== 也不行) 来比较
console.log(0.1 + 0.2 == 0.3);
这里输出的结果是 false,说明两边不相等的,这是浮点运算的特点,浮点数运算的精度问题导致等式左右的结果并不是严格相等,而是相差了个微小的值。所以实际上,这里错误的不是结论,而是比较的方法,正确的比较方法是使用 JavaScript 提供的最小精度值:
console.log( Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON )
检查等式左右两边差的绝对值是否小于最小精度,才是正确的比较浮点数的方法。
Object
- 对象添加的方法为什么能用在基本类型上
console.log("abc".charAt(0)); // a
JavaScript 中的几个基本类型,都在对象类型中有一个“亲戚”。它们是:
- Number;
- String;
- Boolean;
- Symbol。
所以,我们必须认识到 3 与 new Number(3) 是完全不同的值,它们一个是 Number 类型, 一个是对象类型。
Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。
Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是 Symbol 对象的构造器。
结论:运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。