未定义的array.length返回true而不是false

时间:2019-03-20 11:46:49

标签: javascript

我目前正在研究MDN JavaScript文档,并且在其中一个初学者练习中声称:(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Evaluating_variables

在布尔上下文中使用时,未定义的值表现为false。

var myArray = [];
if (!myArray[0]) myFunction();

但是,我的大脑简单无法在if语句中与对立面配合使用。因此,我使用.length函数重新编写了它:

var myArray = [];
if(myArray.length === 1) {
  console.log("How?");
} else {
  console.log("Hello World!");
}

我期望的是Hello World!因为数组未定义而要打印,但是返回1时应返回false。

任何关于为什么发生这种情况的解释都很好!

3 个答案:

答案 0 :(得分:1)

要使测试myArray.length === 1评估为true,数组必须包含恰好一个元素。但是您什么都没放,所以测试失败并打印了Hello World!

将数组视为容器。

var myArray; // is undefined

var myArray = [] // is NOT undefined

var myArray = []为空,但它是一个有效的数组。

因此,使用.length,可以得到更好的测试:

if (myArray.length === 0)

然后How?将被打印。

因为数组中没有任何内容,所以长度为0。

答案 1 :(得分:0)

如果您不确定调试是否要通过控制台输出进行检查,或者检查要监视的变量/创建的内容。

var myArray = [];
console.log(!myArray);
console.log(!myArray[0]);

printIt(myArray.length === 0)
printIt(myArray.length === 1)

function printIt(ok) { 
  if(ok) { console.log("Ok."); }
  else { console.log("Not ok."); } 
}

如果您要检查数组是否为空,则应通过代码表达您的期望,所以:

if(array.length === 0) …

如果您要检查变量是否已声明……

var array;
console.log(!array);

array = [];
console.log(!array);

console.log(Array.isArray(array));

let u = "u";
console.log(Array.isArray(u));

如果您需要同时了解两者……

var array;
//console.log(array.length);

array = [];

if(array && Array.isArray(array) && array.length === 0) { array.push("Hi!"); console.log(array[0]);}

let w = "w";
if(w && Array.isArray(w)) { console.log(w);}

答案 2 :(得分:0)

var myArray = [];
if (!myArray[0]) myFunction();

myArray[0]-在此数组初始化中,默认零为1。

if(myArray.length === 1)-在这一行中,它将返回以获得相反的初始化结果。因此,它打印为1。