第三章-----------对象到原始值转换

1. JavaScript对象到原始值转换的复杂性,主要原因在于某些对象类型有不止一种原始值的表示。比如,Date对象可以用字符串表示,也可以用时间戳表示。
2. JavaScript规范定义了对象到原始值转换的3种基本算法。
①偏字符串:该算法返回原始值,而且只要可能就返回字符串。
②偏数值:该算法返回原始值,而且只要可能就返回数值。
③无偏好:该算法不倾向于任何原始值类型,而是由类定义自己的转换规则。
JavaScript内置类型除了Date类都实现了偏数值算法。Date类实现了偏字符串算法。
3. 对象转换为布尔值
所有对象都转换为true。注意,这个转换不需要使用对象到原始值的转换算法,而是直接适用于所有对象。包括空数组,甚至包括new Boolean(false)这样的包装对象。
4. 对象转换为字符串
首先使用偏字符串算法将它转换为一个原始值,然后将得到的原始值再转换为字符串。
这种转换会发生在把对象传给一个接收字符串参数的内置函数时,比如将String()作为转换函数,或者将对象插入模板字面量中时会发生这种转换。
5.对象转换为数值
首先使用偏数值算法将它转换为一个原始值,然后将得到的原始值再转换为数值。
接收数值参数的内置JavaScript函数和方法都以这种方式将对象转换为数值,而除数值操作符之外的多数JavaScript操作符也按照这种方式把对象转换为数值。
6.操作符转换特例
首先,JavaScript中的+操作符执行数值加法和字符串拼接。如果一个操作数是对象,那JavaScript会使用无偏好算法将对象转换为原始值。如果两个操作数都是原始值,则会先检查它们的类型。如果有一个参数是字符串,则把另一个原始值也转换为字符串并拼接两个字符串。否则,把两个参数都转换为数值并把它们相加。其次,==和!=操作符以允许类型转换的宽松方式执行相等和不相等测试。如果一个操作数是对象,另一个操作数是原始值,则这两个操作符会使用无偏好算法将对象转换为原始值,然后再比较两个原始值。
最后,关系操作符<、<=、>和>=比较操作数的顺序,既可以比较数值,也可以比较字符串。如果操作数中有一个是对象,则会使用偏数值算法将对象转换为原始值。不过要注意,与对象到数值转
换不同,这个偏数值算法返回的原始值不会再被转换为数值。
注意,Date对象的数值表示是可以使用<和>进行有意义的比较的,但它的字符串表示则不行。对于Date对象,无偏好算法会将其转换为字符串,而JavaScript中这两个操作符会使用偏数值算法的
事实意味着我们可以比较两个Date对象的顺序。
7. toString()和valueOf()方法
所有对象都会继承两个在对象到原始值转换时使用的方法。
第一个方法toString()的任务是返回对象的字符串表示。默认情况下,toString()方法不会返回特别的值:
8.很多类都定义了自己特有的toString()版本:
①Array类的toString()方法会将数组的每个元素转换为字符串,然后再使用逗号作为分隔符将它们拼接起来。
②Function类的toString()方法会将用户定义的函数转换为JavaScript源代码的字符串。
③Date类定义的toString()方法返回一个人类友好(且JavaScript可解析)的日期和时间字符串。④RegExp类定义的toString()方法会将RegExp对象转换为一个看起来像RegExp字面量的字符串:
9. 另一个对象转换函数叫valueOf()。大体上可以认为它是把对象转换为代表对象的原始值(如果存在这样一个原始值)。对象是复合值,且多数对象不能真正通过一个原始值来表示,因此valueOf()方法默认情况下只返回对象本身,而非返回原始值。
String、Number和Boolean这样的包装类定义的valueOf()方法也只是简单地返回被包装的原始值。Array、Function和RegExp简单地继承默认方法。
在这些类型的实例上调用valueOf()会返回对象本身。Date对象定义的valueOf()方法返回日期的内部表示形式:自1970年1月1日至今的毫秒数:
10. 对象到原始值转换算法
(1)偏字符串算法首先尝试toString()方法。
       ①如果toString()有定义且返回原始值,则JavaScript使用该原始值(即使这个值不是字符串)。
       ②如果toString()不存在,或者存在但返回对象,则JavaScript尝试valueOf()方法。如果valueOf()存在且返回原始值, 则JavaScript使用该值。否则,转换失败,报TypeError。
(2)偏数值算法与偏字符串算法类似,只不过是先尝试valueOf() 方法,再尝试toString()方法。
(3)无偏好算法取决于被转换对象的类。如果是一个Date对象, 则JavaScript使用偏字符串算法。如果是其他类型的对象,则 JavaScript使用偏数值算法。
以上规则适用于所有内置JavaScript类型,也是我们所有自定义类的默认规则。
偏数值转换规则的细节可以解释为什么空数组会转换为数值0,而单元素数组也可以转换为数值:
对象到数值的转换首先使用偏数值算法把对象转换为一个原始值,然后再把得到的原始值转换为数值。偏数值算法先尝试valueOf(),将toString()作为备用。Array类继承了默认的valueOf()方法,该方法不返回原始值。因此在尝试将数组转换为数值时,最终会调用toString()方法。空数组转换为空字符串。而空字符串转换为数值0。只有一个元素的数组转换为该元素对应的字符串。如果数组只包含一个数值,则该数值先转换为字符串,再转换回数值。
  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值