空数组为真,但也等于假。
Var arr = []; console.log(数组:,arr); if (arr) console.log("这是真的!"); if (arr == false) console.log("这是假的!"); 如果(arr & & arr = = false) console.log(“……什么? ?”);
我猜这是由于由等式运算符进行的隐式转换。
有人能解释一下幕后发生了什么吗?
空数组为真,但也等于假。
Var arr = []; console.log(数组:,arr); if (arr) console.log("这是真的!"); if (arr == false) console.log("这是假的!"); 如果(arr & & arr = = false) console.log(“……什么? ?”);
我猜这是由于由等式运算符进行的隐式转换。
有人能解释一下幕后发生了什么吗?
当前回答
似乎没有人谈论原因 (arr && arr == false)为真。只是为了不确定运算符优先级的人,根据MDN, ==的优先级高于&&,所以它实际上是(arr && (arr == false))。在通配符的答案之后,它是真&&真,所以它是真。
Var arr = []; 如果(arr & & arr = = false) console.log(“……什么? ?”);
其他回答
在if (arr)中,如果arr是一个对象,它总是被求值(ToBoolean)为true,因为JavaScript中的所有对象都是true。(null不是一个对象!)
[] == false采用迭代法求值。首先,如果==的一边是原语,另一边是object,它首先将object转换为原语,然后如果两边都不是字符串,则将两边都转换为Number(如果两边都是字符串,则使用字符串比较)。因此,比较是这样迭代的,[]== false -> " == false -> 0 == 0 -> true。
例子:
const array = []
const boolValueOfArray = !!array // true
它的发生是因为
ToNumber(ToPrimitive([])) == ToNumber(false)
[]为空数组对象→ToPrimitive([])→""→ToNumber("")→0 tonnumber (false)→0 0 == 0→true
似乎没有人谈论原因 (arr && arr == false)为真。只是为了不确定运算符优先级的人,根据MDN, ==的优先级高于&&,所以它实际上是(arr && (arr == false))。在通配符的答案之后,它是真&&真,所以它是真。
Var arr = []; 如果(arr & & arr = = false) console.log(“……什么? ?”);
当我尝试使用knockout.js映射插件时,上述方法都没有帮助我,也许是因为“空数组”并不是真的空。
我最终使用:data-bind="if: arr()。长度”,这就成功了。
这是专门针对knockout的,不是OP的问题,但也许它会帮助其他在类似情况下浏览这里的人。
有元素的数组(无论是否为0、false或另一个空数组)总是使用抽象等式比较==解析为true。
1. [] == false; // true, because an empty array has nothing to be truthy about
2. [2] == false; // false because it has at least 1 item
3. [false] == false; // also false because false is still an item
4. [[]] == false; // false, empty array is still an item
但是使用严格相等比较===,你试图计算变量的内容以及它的数据类型,这就是为什么:
1. [] === false; // false, because an array (regardless of empty or not) is not strictly comparable to boolean `false`
2. [] === true; // false, same as above, cannot strictly compare [] to boolean `true`
3. [[]] === false; // true, because see #1