valueOf与toString方法研究

 在网上看到很有意思,原文网址,http://www.cnblogs.com/rubylouvre/archive/2010/10/02/1841143.html,我根据自己的阅读习惯整理下

先看两题

var date = new Date();  
var date_string = date.toString();  
var date_value = date.valueOf();  
console.log(date == date_string);  
console.log(date == date_value );

 

 答案

true,false

 第二题

var now = new Date(2010,10,1);  
console.log(now+1);

 答案

这是IE8跑出来的结果 写道
Mon Nov 1 00:00:00 UTC+0800 20101

 

汗颜
接着我们再翻开ECMA262v5的11.6.1节,看有关对加号操作符的处理:

决定哪个是被加数
将被加数传入GetValue中进行运算
决定哪个是被加数
将加数传入GetValue中进行运算
将2的结果传入ToPrimitive中进行运算
将4的结果传入ToPrimitive中进行运算
如果5或6的结果随便一个为字符串,那么
将6直接置于5之后拼成新字符串返回
否则将它们都转换为数字(ToNumber)相加返
这内部调用一个ToPrimitive方法,它定义在9.1节,基本上只对Object对象进行特殊处理

类型 结果
Undefined 与输入时一致,无转换
Null 与输入时一致,无转换
Boolean 与输入时一致,无转换
Number 与输入时一致,无转换
String 与输入时一致,无转换
Object Object 返回Object的默认值,它由内部一个名为[[DefaultValue]] 的方法决定的。

[[DefaultValue]] 会根据提示信息是调用valueOf方法或toString方法。此提示信息当然是前面提供的,我们再翻回11.6.1节,它解释道,除Date对象外,其他ECMA对象都应该转换为数字,Date则为字符串。看到这里,一切疑云应该清空吧。

在wtfjs中提到一道难题

[] == ![] //答案为true,注意非[] !== []
拥有了以上的知识,我们就轻而易举地解决它。
[] ==> [].valueOf() ==> '';
![] ==> false
'' == false ==> true!!
 

你可能感兴趣的:(html)