sailei1 / blog

1 stars 0 forks source link

JS 类型转换规则 #56

Closed sailei1 closed 5 years ago

sailei1 commented 5 years ago

JS 类型转换

JavaScript 的原始类型有:number, string, boolean, null, undefined, Symbol。

三种类型转换 1 在 JS 中只有 3 种类型的转换 to string to boolean to number。 2 类型转换的逻辑在原始类型和对象类型上是不同的,但是他们都只会转换成上面 3 种类型之一。

string 类型转换

String() 方法可以用来显式将值转为字符串,隐式转换通常在有 + 运算符并且有一个操作数是 string 类型时被触发

Symbol 类型转 String 类型是比较严格的,它只能被显式的转换

Boolean 类型转换

Boolean() 方法可以用来显式将值转换成 boolean 型。

隐式类型转换通常在逻辑判断或者有逻辑运算符时被触发(|| && !)。

Boolean('') // false Boolean(0) // false
Boolean(-0) // false Boolean(NaN) // false Boolean(null) // false Boolean(undefined) // false Boolean(false) // false

以上都为false 其他的为true

Number 类型转换

Number() 方法可以用来显式将值转换成 number 类型。 number 的隐式类型转换是比较复杂的,因为它可以在下面多种情况下被触发。

比较操作(>, <, <=, >=) 按位操作(| & ^ ~) 算数操作(- + * / %), 注意,当 + 操作存在任意的操作数是 string 类型时,不会触发 number 类型的隐式转换 一 元 + 操作 非严格相等操作(== 或者 != ),注意,== 操作两个操作数都是 string 类型时,不会发生 number 类型的隐式转换

当将一个字符串转换为一个数字时,引擎首先删除前尾空格、\n、\t 字符,如果被修剪的字符串不成为一个有效的数字,则返回 NaN。如果字符串为空,则返回 0。 Number() 方法对于 null 和 undefined 的处理是不同的, null 会转换为 0, undefined 会转换为 NaN

特殊规则: 1 当将 == 应用于 null 或 undefined 时,不会发生数值转换。null 只等于 null 或 undefined,不等于其他任何值。 2 NaN 不等于任何值,包括它自己

object 类型转换

对象通过内部 [[ToPrimitive]] 方法转换为原始类型,该方法负责数字和字符串转换。 [[ToPrimitive]] 方法接受两个参数一个输入值和一个需要转换的类型(Numer or String) number 和 string的转换都使用了对象的两个方法: valueOf 和 toString。这两个方法都在 Object.prototype 上被声明,因此可用于任何派生类,比如 Date, Array等。 通常上 [[ToPrimitive]] 算法如下:

如果输入的值已经是原始类型,直接返回这个值。 输入的值调用 toString() 方法,如果结果是原始类型,则返回。 输入的值调用 valueOf() 方法,如果结果是原始类型,则返回。 如果上面 3 个步骤之后,转换后的值仍然不是原始类型,则抛出 TypeError 错误。

number 类型的转换首先会调用 valueOf() 方法,如果不在调用 toString() 方法。 string 类型的转换则相反。 大多数 JS 内置对象类型的 valueOf() 返回这个对象本身,其结果经常被忽略,因为它不是一个原始类型。所以大多数情况下当 object 需要转换成 number 或 string 类型时最终都调用了 toString() 方法。 当运算符不同时,[[ToPrimitive]] 方法接受的转换类型参数也不相同。当存在 == 或者 + 运算符时一般会先触发 number 类型的转换再触发 string 类型转换。 在 JS 中你可以通过重写对象的 toString 和 valueOf 方法来修改对象到原始类型转换的逻辑。

摘自: https://github.com/lvwxx/blog/issues/18