在网上看到很有意思,原文网址,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)相加返
决定哪个是被加数
将被加数传入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则为字符串。看到这里,一切疑云应该清空吧。
类型 结果
Undefined 与输入时一致,无转换
Null 与输入时一致,无转换
Boolean 与输入时一致,无转换
Number 与输入时一致,无转换
String 与输入时一致,无转换
Object Object 返回Object的默认值,它由内部一个名为[[DefaultValue]] 的方法决定的。
[[DefaultValue]] 会根据提示信息是调用valueOf方法或toString方法。此提示信息当然是前面提供的,我们再翻回11.6.1节,它解释道,除Date对象外,其他ECMA对象都应该转换为数字,Date则为字符串。看到这里,一切疑云应该清空吧。
在wtfjs中提到一道难题
[] == ![] //答案为true,注意非[] !== []
拥有了以上的知识,我们就轻而易举地解决它。
[] ==> [].valueOf() ==> '';
![] ==> false
'' == false ==> true!!
![] ==> false
'' == false ==> true!!