对象调用javascript 中强制执行 toString()

PS:今天上午,非常郁闷,有很多单简基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

    原文:Enforcing toString()

    译文:javascript 中制强执行 toString()

    译者:singleseeker

    


    Javascript常通会根据法方或算运符的须要而主动把值转成所需的类型,这可能致导各种错误。 Brian McKenna (@puffnfreshsuggests 供给了列下测试代码:

    Object.prototype.valueOf = function () { throw new Error('Use an explicit toString'); };

    

    这些代码会发生什么果效? 你在现不再能用加号算运符去把一个对像转成一个字符串了:

    > var obj = {}; > 'Hello '+obj Error: Use an explicit toString > String(obj) '[object Object]' > obj.toString() '[object Object]' > 'Hello '+String(obj) 'Hello [object Object]'

    

    这个又是怎么回事呢? 要把一个对象转成一个特定的基本类型 T,首先是它的值被转化成基本类型,然后才是转换成 T,前一个转换由两步实现

    

  1. 调用 valueOf() 法方,如果回返一个基本类型,那么就结束

  2. 不然,调用法方 toString()。如果回返一个基本类型,那么结束

  3. 再不然,抛出错误

    如果最后的转换是个数值,会是上述调用 valueOf() 与 toString() 的这个序顺。

    如果最后的转换是字符串,那么 toString 会被先调用。 加号算运符可能会被值转成数值型或是字符串型,但它常通根据字数算运发生一个基本类型

    每日一道理
毅力,是千里大堤一沙一石的凝聚,一点点地累积,才有前不见头后不见尾的壮丽;毅力,是春蚕吐丝一缕一缕的环绕,一丝丝地坚持,才有破茧而出重见光明的辉煌; 毅力,是远航的船的帆,有了帆,船才可以到达成功的彼岸。

    不用在文章开始发的代码片段, Object.prototype.valueOf() 会回返这个对象本身,这个是从原生对象续继来的没有被重写的法方:

    > var obj = {}; > obj.valueOf() === obj true

    

    加号算运符终最会调用 toString()。 上面的代码片段阻挠了调用,在能调用那个法方前抛出了错误。

    注意这个错误信息不并是总完全正确。

    > Number(obj) Error: Use an explicit toString

    

    但是这一招扔然是有效的。

    如果一个对象真想被转化成字数,那么它无论如何还是要调用自己的 valueOf 法方。

    @singleseeker罗嗦:这篇文章翻译起来心真是想更种吐槽,知识点总结的倒是不错, 不过做为一个不是英语为语母的老外写的英文技术文章交给我一个语母不是英语的菜鸟翻译,实在够折磨人。 上面行进单简的总结。

    

  1. 常通 valuOf() 指示回返一个未转换的对象,也就是其本身

  2. 加号算运符除了 Date 对象外,几乎是全先调用 valueOf() 法方

  3. 如果使得 valueOf() 回返一个明白的基本数值类型,那么当一个对象与字符串相加时,toString() 将不会被调用

    

参考

    

  1. 制强转换对象(objects)为原始值(primitives)

  2. JavaScript中,{}+{}即是多少?

文章结束给大家分享下程序员的一些笑话语录: 自从有了Photoshop,我再也不相信照片了!(没有Photoshop的年代,胶片照片年代做假的也不少,那时候都相信假的!)

posted @ 2013-04-27 19:15  坚固66  阅读(172)  评论(0编辑  收藏  举报