javascript 中的隐式转换

javascript中两种数据类型:原始数据类型引用数据类型


原始数据类型:string,number,boolean,undefined,null,symbol(es6新加)

引用数据类型:object


隐式转换涉及最多的是 +(一元运算符) 和 ==,涉及到的三种转换:

1、将值转为原始值,ToPrimitive()。

2、将值转为数字,ToNumber()。

3、将值转为字符串,ToString()。


通过ToPrimitive将值转换为原始值


ToPrimitive(input, PreferredType?) javascript规范

input是要转换的值,PreferredType是可选参数,可以是Number或String类型。它只是一个转换标志,转化后的结果并不一定是这个参数所值的类型,但是转换结果一定是一个原始值(或者报错)



如果PreferredType被标记为Number,则会进行下面的操作流程来转换输入的值


1、如果输入的值已经是一个原始值,则直接返回它

2、否则,如果输入的值是一个对象,则调用该对象的valueOf()方法, 如果valueOf()方法的返回值是一个 原始值,则返回这个原始值。

3、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。

4、否则,抛出TypeError异常。



如果PreferredType被标记为String,则会进行下面的操作流程来转换输入的值。


1、如果输入的值已经是一个原始值,则直接返回它

2、否则,调用这个对象的toString()方法,如果toString()方法返回的是一个原始值,则返回这个原始值。

3、否则,如果输入的值是一个对象,则调用该对象的valueOf()方法, 如果valueOf()方法的返回值是一个原始值,则返回这个原始值。

4、否则,抛出TypeError异常。



如果PreferredType为空


1、该对象为Date类型,则PreferredType被设置为String

2、否则,PreferredType被设置为Number




转换主要涉及两个方法,valueOf,toString,所有对象都有这两个方法


valueOf()

Number、Boolean、String这三种构造函数生成的基础值的对象形式,通过valueOf转换后会变成相应的原始值。

Date这种特殊的对象,其原型Date.prototype上内置的valueOf函数将日期转换为日期的毫秒的形式的数值

除此之外返回的都为this,即对象本身


toString()

Number、Boolean、String、Array、Date、RegExp、Function这几种构造函数生成的对象,通过toString转换后会变成相应的字符串的形式,因为这些构造函数上封装了自己的toString方法

除这些对象及其实例化对象之外,其他对象返回的都是该对象的类型,都是继承的Object.prototype.toString方法。


PreferredType没有设置时,Date类型的对象,PreferredType默认设置为String,其他类型对象PreferredType默认设置为Number。



通过ToNumber 将值转换为数字


undefined => NaN

null => +0

true => 1 false => 0

'123' => 123 'abc' => NaN (string)

object => 先 ToPrimitive(obj,Number)转换得到原始值,在 ToNumber 为数字



通过ToString 将值转换为字符串


undefined => 'undefined'

null => 'null'

true => 'true' false => false

123 => '123'(number)

obj => 先进行ToPrimitive(obj,String)转换得到原始值,在进行ToString转换为字符串





== 运算符隐式转换


比较运算 x==y, 其中 x 和 y 是值,返回 true 或者 false。这样的比较按如下方式进行:


  1. 若 Type(x) 与 Type(y) 相同, 则
  2. 若 Type(x) 为 Undefined, 返回 true。
  3. 若 Type(x) 为 Null, 返回 true。
  4. 若 Type(x) 为 Number, 则
  5. 若x,y 为NaN 返回 true.
  6. 若 x 与 y 为相等数值, 返回 true。
  7. 若x,y为 +0 或 -0,返回true。
  8. 返回 false。
  9. 若 Type(x) 为 String, 则当 x 和 y 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false。
  10. 若 Type(x) 为 Boolean, 当 x 和 y 为同为 true 或者同为 false 时返回 true。 否则, 返回 false。
  11. 当 x 和 y 为引用同一对象时返回 true。否则,返回 false。
  12. 若x,y 值为 undedined或null时,返回true
  13. 若x,y 一方为Number,方为String,将String转换为Number,返回x == y的结果。
  14. 若x,y一方为Boolean,一方为Number,将Boolean转换为Number,返回x == y 的结果。
  15. 若x,y一方为String或Number,另一方为Object,先将Object转换为原始值,然后在比较,返回x == y的结果
  16. 返回 false。





引用文章:https://juejin.im/post/5a7172d9f265da3e3245cbca

确认 取消
2条评论
123456