在 JS 中,存在着 6 种原始值,分别是:
boolean
null
undefined
number
string
symbol
原始类型存储的都是值,是没有函数可以调用的,比如 undefined.toString()
但是’1’.toString() 是可以使用的。其实在这种情况下,‘1’ 已经不是原始类型了,而是被强制转换成了 String 类型也就是对象类型,所以可以调用 toString 函数。
其中 JS 的 number 类型是浮点类型的,在使用中会遇到某些 Bug,比如 0.1 + 0.2 !== 0.3
typeof null 会输出 object
这只是 JS 存在的一个悠久 Bug。在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。
转Boolean
在条件判断时,除了 undefined, null, false, NaN, ‘’, 0, -0,其他所有值都转为 true,包括所有对象。
对象转原始类型
对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数。
我们可以重写 Symbol.toPrimitive ,该方法在转原始类型时调用优先级最高。
例如:
let a = {
valueOf() {
return 0
},
toString() {
return '1'
},
[Symbol.toPrimitive]() {
return 2
}
}
1 + a // => 3
加法运算符
加法运算符不同于其他几个运算符,它有以下几个特点:
1.运算中其中一方为字符串,那么就会把另一方也转换为字符串
2.如果一方不是字符串或者数字,那么会将它转换为数字或者字符串