JS类型细节

112 阅读2分钟

Undefined 和 Null

  1. undefined表示未定义
  2. 是一个变量,并非一个关键字,在某些局部环境中可以通过 undefined = xxx 进行对 undefined 的篡改
  3. 可以使用 void 0 代替 undifined 表示未定义,不过通常情况下 undefined 不会被允许可以修改
  4. Null 是一个关键字,表示已定义,但是是一个空值

String

  • String的意义并非“字符串”,而是字符串的UTF16编码
  • 字符串的charAt、length等方法都是针对UTF16编码
  • JavaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。
var test = 'hello';
test[0] = 'a'
console.log(test)   // hello

Number

  1. JavaScript 中的 Number 类型基本符合 IEEE 754-2008 规定的双精度浮点数规则,但是 JavaScript 为了表达几个额外的语言场景(比如不让除以 0 出错,而引入了无穷大的概念),规定了几个例外情况:
    • NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字;
    • Infinity,无穷大;
    • -Infinity,负无穷大。
  1. 根据浮点数的定义,非整数的 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 对象的构造器。

结论:运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得我们能在基础类型上调用对应对象的方法。