0

在我测试的浏览器中,将返回一个包含 5 个元素var a = new Array(5);的数组。undefined由于undefined等于,只要我以这种方式测试它们,false我就可以认为我的数组是用元素初始化的:false

if (a[0]) console.log("the element is no longer falsy");
else a[0] = true;

Array用值初始化一个安全的方法false还是应该避免的黑客攻击?

编辑:我的目标是让它初始化为假值,就像我的例子一样。我想确保这new Array()是一种值得信赖的方式。

4

3 回答 3

3

当您在 Javascript 中初始化一个数组时,它没有元素,也就是说,除非您在其中放置任何东西,否则任何位置都不存在任何元素。您唯一拥有的就是length设置为您指定的数字。

当您通过读取它来访问元素并且什么都没有时,您就会得到undefined(当您访问不存在的对象的成员时会发生这种情况)。

但是请注意,根本不存在的元素与设置为 的元素并不完全相同undefined。例如:

var x = new Array(5);
console.log(x[2]);                 // ==> Output is "undefined"
console.log(x.indexOf(undefined)); // ==> Output is "-1" (not present)
x[2] = undefined;
console.log(x.indexOf(undefined)); // ==> Output now is "2"

如果您只关心true放置在 an 中的元素是否会被考虑,if那么该数组首先会出现以包含undefinedfalse上下文中的元素。

但是请注意,即使是Javascriptfalsetrue的一个非常微妙的概念,尤其是因为自动转换......例如

console.log([] ? 1 : 2);  // Output is "1", an empty array is "true"
console.log([] == false); // output is "true" (so it's also equal to false!)
于 2013-01-15T22:58:19.243 回答
1

未定义的值不“等于” false,当您if(undefined).

它是否安全,这实际上取决于您使用它的代码。如果你想检查 value 是否真的false,你应该使用严格相等和 check if(val === false),这样你就不会把它误认为是任何其他虚假值。

您还可以检查typeof变量以确保它是您所期望的:

typeof false;      // "boolean"
typeof undefined   // "undefined"
于 2013-01-15T22:42:36.747 回答
1

您不必为此初始化数组。

var array = [];
console.log(array[0]); // undefined
console.log(!!array[0]); // false (undefined is _falsy_)
array.push("foo");
console.log(array[0]); // "foo"
console.log(!!array[0]); // true ("foo" is _truthy_).
array[1] = "bar";
console.log(array[1]); // "bar"
console.log(array.length); // 2
于 2013-01-15T22:52:19.440 回答