这是动态类型比较运算产生的类型转换.String->Number.是ECMAScript里11.9.3 The Abstract Equality Comparison Algorithm规定的,比较变态.
16.If Type(x) is Number and Type(y) is String,return the result of the comparison x == ToNumber(y).
17.If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y.
这是肥音你懂吗?
是肥音你懂吗?
肥音你懂吗?
音你懂吗?
你懂吗?
懂吗?
吗?
?
.
var a:Object=0;
trace(a==”");//输出 true
坑爹啊。再加个a!=0 吧。
var a:Object=1;
trace(a==”");
trace(String(a).length);
//输出
false
1
看来是当字符串长度了。
其实这是ECMAScript一个常见的陷阱, 就是false, 0, “” 这三个东西用 == 判断返回都是true…
object = 0时,object类型已经是number了,此时和字符串比较,字符串会转型为number,所以比较结果自然就是true。
嗯…
结果就是下面的规则:
判断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂。
ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。
等号和非等号
在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。
执行类型转换的规则如下:
如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。
在比较时,该运算符还遵守下列规则:
值 null 和 undefined 相等。
在检查相等性时,不能把 null 和 undefined 转换成其他值。
如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。
其实不是陷阱,这是个转换规则…
详情看这里:
http://www.w3school.com.cn/js/pro_js_operators_equality.asp
我说是陷阱的意思就是可能会搞出犯晕让你直犯晕的代码……
由于ECMAScript的==是要做类型转换的,所以一般建议使用 ===。这样也可强制开发者注意自己维护数据类型,以避免出现多余的类型转换浪费时间。
哎~X,我TM还真敢想。:D
value==null改为!value
这是动态类型比较运算产生的类型转换.String->Number.是ECMAScript里11.9.3 The Abstract Equality Comparison Algorithm规定的,比较变态.
16.If Type(x) is Number and Type(y) is String,return the result of the comparison x == ToNumber(y).
17.If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y.