【发布时间】:2017-07-27 11:34:14
【问题描述】:
给定两个数组 myArray1 和 myArray2,可能是 null,我如何输出一个布尔值来告诉我至少一个数组是否非空?
假设我有以下变量:
myArray1 = ["one", "two", "three"]; //-> non-empty array
myArray2 = null; //-> not an array (in my case this happens from .match() returning no results)
我想要一个表达式,这样myArray1 && myArray2 将为 FALSE,但 myArray1 || myArray2 将为 TRUE。
我确实查看了其他相关的 Stack Overflow 问题(请参阅下面的精简列表),但由于我仍在努力找出解决方案,我想我会将其作为一个单独的问题发布,因为答案也可能对其他人有益。
空数组的常用测试方法是:
myBooleanOr = (myArray1.length || myArray2.length); //3
myBooleanAnd = (myArray1.length && myArray2.length); //Error
这在两个变量都是数组的情况下有效,但在这种情况下,第二个变量会抛出错误:无法读取'null'的属性长度。使用Boolean() 函数并不能解决问题,因为以下也会引发同样的错误:
myBooleanAnd = (Boolean(myArray1.length) && Boolean(myArray2.length)); //error
在几个 Stack Overflow 问题中接受的测试空数组的解决方案是使用 typeof myArray !== "undefined",但这仍然不能解决问题,因为两个数组都不匹配 "undefined",所以 myBooleanAnd 仍然会抛出一个错误:
var bool = (typeof myArray1 !== "undefined"); //true
var bool = (typeof myArray2 !== "undefined"); //true
var myBooleanAnd = ((typeof myArray1 !== "undefined" && myArray1.length) || (typeof myArray2 !== "undefined" && myArray2.length)); //Error: cannot read property length of null
将数组与 [] 进行比较,这似乎也很直观,但也不起作用,因为两个数组都不匹配 []:
var bool = (myArray1 !== []); //true
var bool = (myArray2 !== []); //true
其他相关帖子
有关 Stack Overflow 的其他一些问题涉及空 Javascript 数组的测试,包括:
- 测试空数组:Check if array is empty or exists
- 空数组测试 (jQuery):Check if array is empty or null
- 空数组测试方法的相对优势:Testing for an empty array
- 测试空对象:How do I test for an empty JavaScript object?
还有关于Javascript中空数组真值的问题:
更新
我已更正原始问题中发布的以下错误(感谢指出错误的人)。我在这里列出它们,因为它们也可能对其他人有帮助:
- ==!改为
!== - typeof x === undefined,改为
typeof x === "undefined"
【问题讨论】:
-
JavaScript 中没有
==!运算符。你要找的接线员是!==。 -
@JLRishe hm 我想知道这一点,但我已经对它们进行了测试,它们都可以工作......这是“最佳实践”的问题还是只是一个约定?
-
不,两者都不是。
==!是== !的间隔很差的等价物,即1 == !'a'→1 == false→false。我想如果您在任何地方都使用==!,那么您的很多代码的行为都会与您的预期不同。
标签: javascript arrays null