JavaScript if失败,带有[";](包含空字符串的数组)

JavaScript if失败,带有[";](包含空字符串的数组),javascript,arrays,conditional,Javascript,Arrays,Conditional,可能重复: 由于某些原因,此警报将显示为“假”。我似乎不明白为什么。如何使此警报为真?比较值而不是整个数组 …因为它们是对象,您在这里使用隐式引用。一个对象存储在您的xvaliable中,您试图将其与就地创建的对象(带有空字符串元素的数组)进行比较(通过引用)。这是两个对象,每个对象都有自己的引用,因此不相等 我已将您的示例更改为您所追求的,同时还提供了在数组中包含任意数量空字符串的可能性: if (x.length && x.join && x.join(""

可能重复:

由于某些原因,此警报将显示为“假”。我似乎不明白为什么。如何使此警报
为真

比较值而不是整个数组 …因为它们是对象,您在这里使用隐式引用。一个对象存储在您的
x
valiable中,您试图将其与就地创建的对象(带有空字符串元素的数组)进行比较(通过引用)。这是两个对象,每个对象都有自己的引用,因此不相等

我已将您的示例更改为您所追求的,同时还提供了在数组中包含任意数量空字符串的可能性:

if (x.length && x.join && x.join("") === "")
{
    alert(​​"True!")
}​
else
{
    alert("False!")
}
if ( x.length && x[0] == "" )
这将成为现实!对于任何阵列,如:

var x = [];
var x = [""];
var x = [null];
var x = [undefined];
var x = ["", null, undefined];
...

除非数组引用同一对象,否则无法通过这种方式可靠地比较数组。改为这样做:

if ( x[0] == "" )
或者,如果希望它是一个数组:

if (x.length && x.join && x.join("") === "")
{
    alert(​​"True!")
}​
else
{
    alert("False!")
}
if ( x.length && x[0] == "" )

在这种情况下,您可以使用toString。小心,有些异常值是不起作用的

var x = [""]
alert(x.toString() == [""].toString()) // true

在JavaScript中,两个对象只有在引用同一个对象时才相等。即使是
[]=[]
也是
false

一个可能缓慢但通用的解决方案是比较两个对象的字符串表示形式:

JSON.stringify(a1) == JSON.stringify(a2)

如果两个对象引用完全相同的对象,则它们是相等的。在您的示例中,x是一个对象,[“”]是另一个对象。不能用这种方式比较对象。可能有用。

只有当两个对象引用同一个对象时,它们才相等。偶数
[]!=[]
。比较它们的一个简单方法是比较它们的JSON表示形式。为什么它应该是真的?比较两个不同的对象。值恰好相同,但它们仍然是两个不同的对象。@Blender这些是数组,不是对象,但是您的语句仍然适用于数组。@jbabey:Array是对象。
instanceof Array
在处理跨文档对象时不可靠。
JSON.stringify
是一个安全得多的选项,可以以同样的方式使用。
[”,“].toString()===[”,“”].toString();//true
将两个数组连接起来并检查值是否相同比遍历所有元素要简单得多。