Apr 21, 2020

JS 冷门 & 细碎的知识


类型

内置类型

  • JS 的数字类型是浮点类型的,没有整型

  • NaN 也属于 number 类型,并且 NaN 不等于自身

  • 对于基本类型来说,如果使用字面量的方式,那么这个变量只是个字面量,只有在必要的时候才会转换为对应的类型

    let a = 111 // 这只是字面量,不是 number 类型 a.toString() // 使用时候才会转换为对象类型

typeof

  • 对于基本类型,除了 null 都可以正确显示。对于 null 会显示 object。这是一个存在了很久的 bug
  • 没有声明的会显示 undefined
  • 对于对象,函数会显示 function,其他会显示 object
  • 如果想要正确的类型,可以通过 Object.prototype.toString.call(xx),可以得到最准确的类型
    • 每个对象都有一个 toString 方法,用于返回表示该对象的字符串。这个方法可以被覆写,所以此处用 call 方法处理,就可以得到最正确的对象类型

      const a = new Date(); a.toString = function () { return 1 }; a.toString(); // 1 Object.prototype.toString.call(a); // [object Date]

类型转换

  • 对象转基本类型

    • 对象在转换基本类型时,会按照 Symbol.toPrimitive, valueOf, toString 的顺序进行调用,其中 valueOf 和 toString 时是可以被重写的

      let a = { valueOf() { return 0; }, toString() { return '1'; }, [Symbol.toPrimitive]() { return 2; } } 1 + a // => 3 '1' + a // => '12'
  • 四则运算

    • 只有加法运算时,如果其中一方是字符串类型,就会把另一个也转为字符串。其他运算则是转为数字
    • 加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串
    1 + '1' // '11' 2 * '2' // 4 [1, 2] + [2, 1] // '1,22,1' // [1, 2].toString() -> '1,2' // [2, 1].toString() -> '2,1' // '1,2' + '2,1' = '1,22,1' // +'1' => 1

资料 & 关联阅读

bookmark