JavaScript: 数组.length 表达式求值为布尔值

4
如何检查数组的长度,如果我需要表达式的结果是布尔值?例如:

var myArray = [];
if(!myArray.length){
  return;
}

或者:

vr myArray = [];
if(myArray.length == 0){
  return;
}

这两个示例都可以正常工作,但是我想知道它们之间有什么区别?


3
0是一种假值,如果一个条件的求值结果为0,则被视为false。之前的!运算符(语义为“非”)会将布尔值取反为true - Tyler Roper
数组长度为0。但由于0为假,所以在第一个条件中为真。同样,null,“”,undefined等也是假的。 - Slim Shady
1
重要的是要理解 JavaScript 中 truthyfalsy 的概念。我认为链接的资源会有所帮助... - War10ck
1
没有最好的解决方案 - 但我会建议您更好的选择。在这种情况下不要使用 == 运算符,因为长度可以是一个数字,你正在与一个数字进行比较,所以请使用 ===。如果你问我,我会选择 !array.length。并且总是使用 === 而不是 == (搜索书籍:JavaScript: The Good Parts)。 - Darkves
3个回答

3

在这里,!myArray.length 会有两种情况返回 true

  • 如果 myArray.length===0,因为 0 是一个falsy 值,所以 !0 将返回 true
  • 如果 myArray.lengthundefined,换句话说,myArray 不是一个 array,因此它没有 length 属性,其中 undefined 也是一个falsy 值

第一个解释了为什么在您的情况下 !myArray.lengthmyArray.length==0 是等价的。


0
这是因为`length`函数返回一个数字,当您使用数字作为条件时,`0`和`NaN`被评估为`false`(在其他情况下被评估为`true`)。

0
如果你有一个空数组,也就是一个长度为0的数组,
使用单个否定符号!返回的布尔值会产生误导。
arr = []

!arr.length // true - because `0` is `false`, `!` negates `false` to `true`

// double negate it for clear boolean
console.log(!!arr?.length, arr?.length); // false 0

真实的例子

arr = ['','','']

// array with values 
console.log(!!arr?.length, arr?.length); // true 3

请确保使用可选链 ? 检查 .length 是否存在。
if (!!arr?.length) console.log(!!arr?.length);

现在你可以可靠地使用.length作为布尔值来检查空数组。

注意:双重否定有一些注意事项,例如ESLint的no-extra-boolean-cast


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接