类型
内置类型
-
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