【问题标题】:Can I trust elements from a new Array to equal to false?我可以相信新数组中的元素等于假吗?
【发布时间】:2013-01-15 22:39:31
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你想达到什么目的?您不必强制初始化您的数组,您应该有特定的理由来实现它。
  • 我正在尝试将一个数组初始化为虚假值,以便稍后将它们变为 true。我对这些值所做的唯一测试是if (a[i]) 所以undefined 对我来说是一个很好的初始值,只要 JS 规范将此行为强加于new Array()

标签: javascript


【解决方案1】:

当你在 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"

如果您只关心将一个元素放在if 中时是否将其视为true,那么该数组乍一看包含undefined,即在该上下文中为false

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

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!)

【讨论】:

  • 所以空数组是真实的!![] //true,但也输入强制到false[] == false //true?这太疯狂了!
  • @FabrícioMatté: 欢迎来到地狱]:-) ... 因为这种情况发生的原因有点微妙,并且也暗示了[1] == 1。 Javascript 中的== 运算符基本上没用……你应该始终使用===
  • 所以,我相信数组的 toPrimitive 是转换为字符串,所以[1, 2] == '1,2' //true 对吗?现在有意义,因为 false 将是一个空字符串:[] == '' //true
  • @FabrícioMatté: 正是...只是因为有一条特殊规则,即空字符串可以隐式转换为 0 而不会变成 NaN发生在其他非数字字符串上。 parseInt("") 但返回 NaN
  • 我知道'' == 0parseInt("") 返回NaNNaN != NaN,还有+'' 返回0。不过,我也不知道[] == 0
【解决方案2】:

您不必为此初始化数组。

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

【讨论】:

  • 非常正确:var a = []; a[10] 也会返回 undefined。
  • 两者之间的内存管理有什么性能差异(即使用未定义的初始化而不是初始化)?我相信答案可能取决于浏览器...
  • new Array(5); 显然性能较差但是数组的length 属性设置为5。在做[]时,结果数组的大小为0(试试[].length)跨度>
【解决方案3】:

未定义的值不“等于”false,当您像if(undefined) 一样对其进行测试时,它只会被视为错误

它是否安全,实际上取决于您使用它的代码。如果要检查值是否真的是false,则应使用严格相等并检查if(val === false),以免将其误认为是任何其他虚假值。

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

typeof false;      // "boolean"
typeof undefined   // "undefined"

【讨论】:

  • 谢谢。正如我所说“只要我以这种方式测试它们,我就可以认为我的数组是用错误元素初始化的:if (a[O])...”我担心这个测试是否适用于(相关)浏览器,或者只有现代浏览器实现@987654328 @像这样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2015-09-29
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多