`

javascript 中强制执行 toString()

 
阅读更多

原文: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中,{}+{}等于多少?

22
4
分享到:
评论

相关推荐

    javascript中强制执行toString()具体实现

    原文:Enforcing toString() 译文:javascript 中强制执行 toString() 译者:singleseeker Javascript通常会根据方法或运算符的需要而自动把值转成所需的类型,这可能导致各种错误。 Brian McKenna (@puffnfresh) ...

    JavaScript笔记

    事件驱动:JavaScript的执行都是由事件引发 解释执行:先读到的先执行,后读到的会替代先读的 可以使用任何文本编辑工具编写 JavaScript 代码,然后由浏览器解释执行。 JavaScript常用于实现如下功能: |--控制...

    107个常用javascript语句

    48.在老的浏览器中不执行此JS:<!-- //--> 49.引用一个文件式的JS:<script type="text/javascript" src="aaa.js"> 50.指定在不支持脚本的浏览器显示的HTML:<noscript></noscript> 51.当超链和onCLICK事件都有时,则老...

    正则表达式

    JavaScript的RegExp对象和String对象定义了使用正则表达式来执行强大的模式匹配和文本检索与替换函数的方法. 在JavaScript中,正则表达式是由一个RegExp对象表示的.当然,可以使用一个RegExp()构造函数来创建RegExp...

    java源码包2

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

    JAVA上百实例源码以及开源项目源代码

     String pass=jtfPass.getPassword().toString(); //得到密码  ftpClient.openServer(serverAddr); //连接到服务器  ftpClient.login(user,pass); //在服务器上注册  InputStream is=ftpClient.list(); //...

    JAVA上百实例源码以及开源项目

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,...

    java源码包---java 源码 大量 实例

     String pass=jtfPass.getPassword().toString(); //得到密码  ftpClient.openServer(serverAddr); //连接到服务器  ftpClient.login(user,pass); //在服务器上注册  InputStream is=ftpClient.list(); //...

    java源码包3

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

    java源码包4

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu  Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    使用时候只需在控制台窗口执行jar就可以了。 Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不...

    freemarker总结

    FreeMarker对空值的处理非常严格,FreeMarker的变量必须有值,没有被赋值的变量就会抛出异常,因为FreeMarker未赋值 的变量强制出错可以杜绝很多潜在的错误,如缺失潜在的变量命名,或者其他变量错误.这里所说的空值,...

Global site tag (gtag.js) - Google Analytics