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

 更新时间:2013年04月27日 14:43:35   作者:  
Javascript通常会根据方法或运算符的需要而自动把值转成所需的类型,这可能导致各种错误,接下来为大家介绍下javascript如何强制执行toString(),感兴趣的朋友可以参考下哈
原文:Enforcing toString()
译文:javascript 中强制执行 toString()
译者:singleseeker
Javascript通常会根据方法或运算符的需要而自动把值转成所需的类型,这可能导致各种错误。 Brian McKenna (@puffnfresh) suggests 提供了下列测试代码:
复制代码 代码如下:

Object.prototype.valueOf = function () {
throw new Error('Use an explicit toString');
};
[\s\S ]*\n
这些代码会产生什么效果? 你现在再也不能用加号运算符去把一个对像转成一个字符串了:
[code]
> 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中,{}+{}等于多少?

相关文章

  • js使用栈来实现10进制转8进制与取除数及余数

    js使用栈来实现10进制转8进制与取除数及余数

    这篇文章主要介绍了js使用栈来实现10进制转8进制、js取除数、余数,需要的朋友可以参考下
    2014-06-06
  • JavaScript函数的定义和基本使用方法

    JavaScript函数的定义和基本使用方法

    函数就是一种封装,由事件驱动的或者当它被调用时执行的可重复使用的代码块,下面这篇文章主要给大家介绍了关于JavaScript函数的定义和基本使用方法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • JS图片放大效果简单实现代码

    JS图片放大效果简单实现代码

    这篇文章主要为大家详细介绍了JS实现图片放大效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 基于JS实现一个简单的投票demo

    基于JS实现一个简单的投票demo

    这篇文章主要介绍了如何利用JavaScript实现一个简单的投票demo,文中的示例代码讲解详细,对我们学习有一定参考价值,需要的可以参考一下
    2022-06-06
  • HTML+JS模拟实现QQ下拉菜单效果

    HTML+JS模拟实现QQ下拉菜单效果

    这篇文章主要为大家详细介绍了如何利用HTML+JavaScript模拟实现QQ中的下拉菜单效果。文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2022-05-05
  • 原生js验证简洁注册登录页面

    原生js验证简洁注册登录页面

    这篇文章主要为大家详细介绍了原生js验证简洁美观注册登录页面的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 微信小程序websocket实现即时聊天功能

    微信小程序websocket实现即时聊天功能

    这篇文章主要为大家详细介绍了微信小程序websocket实现即时聊天功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • JavaScript中async await更优雅的错误处理方式

    JavaScript中async await更优雅的错误处理方式

    async/await中的异常处理很让人混乱,尽管有很多种方式来应对async 函数的异常,但是连经验丰富的开发者有时候也会搞错,所以这篇文章主要给大家介绍了关于JavaScript中async await更优雅的错误处理方式的相关资料,需要的朋友可以参考下
    2021-09-09
  • javascript实现手机震动API代码

    javascript实现手机震动API代码

    一个新的API出来了。HTML5 (很快)将支持用户设备振动。这明显是很有趣的事情,比如它可以用户触发提醒,提升游戏体验,下面小编给大家整理javascript手机震动api,需要的朋友可以参考下
    2015-08-08
  • 经典的间隔时间滚动新闻(图片),可控制滚动

    经典的间隔时间滚动新闻(图片),可控制滚动

    经典的间隔时间滚动新闻(图片),可控制滚动 其实这个也挺多网站用到的,简单又实用。(
    2010-05-05

最新评论