为什么 {} == false 的计算结果为 false,而 [] == false 的计算结果为 true
Why does {} == false evaluate to false while [] == false evaluates to true?
为什么{} == false
的计算结果为false
,而[] == false
的计算结果为javascript中的true
?
这是根据抽象相等比较算法进行的类型转换:
{} == false // step 7 {} == ToNumber(false)
{} == 0 // step 9 ToPrimitve({}) == 0
"[object Object]" == 0 // step 5 ToNumber("[object Object]") == 0
NaN == 0 // step 1.c.i
[] == false // step 7 [] == ToNumber(false)
[] == 0 // step 9 ToPrimitve([]) == 0
"" == 0 // step 5 ToNumber("") == 0
0 == 0 // step 1.c.iii
参考资料:ToNumber、ToPrimitive
正因为如此,更喜欢使用严格的比较。
一些示例 ToPrimitive
如何在比较期间将对象转换为基元。默认情况下,将调用对象的 valueOf
方法,如果valueOf
不返回基元值,则toString
方法。对于Date
对象,默认情况下它将调用toString
。
var obj = {};
obj.valueOf(); // Object { } // the object itself
obj.toString(); // "[object Object]"
obj.valueOf = function() { return 123; };
obj == 123; // true
obj.toString = function() { return 'foo bar'; };
obj == 123; // false
obj == 'foo bar'; // true
// Date object
var date = new Date();
date.valueOf(); // 1421430720379
date.toString(); // "Fri Jan 16 2015 09:52:00 GMT-0800 (PST)"
date == 1421430720379 // false
date == "Fri Jan 16 2015 09:52:00 GMT-0800 (PST)" // true
date.toString = function() { return 'foo'; };
date == 'foo'; // true
相关文章:
- 如果 a 为 false,则 if(a) === if(false)
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 为什么我的JS"如果“;语句的求值结果总是为false
- 如果ng-if的计算结果为false,AngularJS会使我的模型数据无效
- 为什么 {} == false 的计算结果为 false,而 [] == false 的计算结果为 true
- 为什么Number.MIN_VALUE < -1219312(或任何小值)的计算结果为 false
- Javascript 布尔值:false && true 结果为 true
- 为什么 JavaScript JSON 的计算结果为 false
- window.jQuery==true的计算结果为false,尽管window.jQuery=false计算结果为tru
- I'm在if语句中使用小于比较器;然而,即使它不应该;t、 它的评估结果为false
- 为什么以下比较结果为false
- 如果([]== false)为真,为什么([]|| true)的结果是[]?
- JavaScript条件的计算结果为false
- 变量的计算结果总是false
- 是否“总是返回无序的结果”意味着“返回false”
- KnockoutJs 1.3测试版._destroy:false在UI上的结果与_destroy:true相同
- 为什么两个具有深度相等元素的数组的深度相等结果为false ?
- AngularJS:由于服务的异步性质,函数的计算结果总是为false
- XMLHttpRequest.打开第三个参数false不给php mysql在iPad上的查询结果
- Javascript控制台日志在if语句计算结果为false后自行清除