【问题标题】:Best way to check undefined element in an array检查数组中未定义元素的最佳方法
【发布时间】:2015-04-25 11:02:05
【问题描述】:

我有一个将整数链接到对象的数组:

var array = [];
array[3] = new Something();
array[42] = new OtherSomething();
array[84] = new SomethingAgain();

我想检查一个字段是否存在于数组中,如果存在就使用它。

var field = array[row];

如果数组不包含索引为row 的任何字段,则field 将设置为undefined

我的问题是:检查其存在于以下之间的最佳方法是什么:

if (field !== undefined) { /* Do stuff with field */ }

还有:

if (field) { /* Do stuff with field */ }

第二种解决方案更短,因此执行起来可能更快,因为 JavaScript 是一种解释型脚本语言。但另一方面,它可能会检查布尔值 field 或类似的东西......

您对此有何看法?

【问题讨论】:

  • 什么是row 以及array 是如何定义的?是二维数组吗?
  • @thefourtheye row 是一个整数,而数组是一个用对象填充的简单数组。我添加了一个定义示例。
  • 为什么不使用对象?
  • 如果您正在寻找性能,您应该尝试一下!

标签: javascript undefined


【解决方案1】:

您创建的数组称为稀疏数组。您可以在this answer 阅读更多相关信息。

支票

if (field !== undefined)

如果存储在数组本身中的实际值是undefined,则可能无济于事。还有这个检查

if (field)

如果field 是任何一个Truthy 值,则评估为truthy。你可以在this answer阅读更多关于不同值的真假。

所以,如果你想知道数组是否有特定的索引,那么你可以使用Object.prototype.hasOwnProperty,像这样

var array = [];
array[1] = undefined;

console.log(array[0]);
// undefined
console.log(array[1]);
// undefined
console.log(array.hasOwnProperty(0));
// false
console.log(array.hasOwnProperty(1));
// true

这里1处的元素被定义为undefined,但由于根本没有定义0,默认情况下,JavaScript会返回undefined

hasOwnProperty 调用检查当前对象是否真的具有索引01

【讨论】:

  • 好吧,如果他希望将对象存储在数组中,那么if (arr[i]) 完全可以。
  • @Bergi 是的,但是我感觉OP想知道键(索引)是否存在于数组中。
  • @Bergi 对,我永远不会在数组中存储undefined。所以我可以理解我的情况,if (field) 是最简单的吗?
  • @Aracthor 如果您不存储任何其他虚假值,那么可以,您可以使用if (field)
【解决方案2】:

“最佳”是一个相当主观的术语,所以让我们对其提出一些客观标准:

  1. 哪个更快?

    您会在现实世界注意到,也不是。但如果你真的想知道,measure your specific code 在你想支持的引擎上。

  2. 哪个更容易阅读?

    这也可能是主观的。第二种形式在 JavaScript、FWIW 中非常常见。

  3. 哪个打字少?

    第二种形式显然比第一种短很多。

  4. 哪个更可靠?

    考虑到您的用例,它们同样可靠,因为您要么根本不在数组中存储条目,要么存储非null 对象引用。

    在相似但不同的用例中,您可能需要注意差异:第一种形式对于存在且不具有值 undefined 的条目为真它。第二种形式适用于任何不是 falsey 的东西。有几个虚假值:nullundefined0""NaN,当然还有false。因此,您不会使用第二种形式来确定数组中的某个位置是否有数字,因为0 是一个数字,但if (0) 不会进入if 的主体。

    说到歧义,请注意关于“......对于一个存在且其中没有值 undefined 的条目为真......”的评论你给出的两个例子都没有区分 不存在并且存在值undefined 的条目。如果您需要在某些时候区分它们(同样,不是针对您提到的用例),您可以在数组上使用hasOwnPropertyif (array.hasOwnProperty(row))

第二种解决方案更短,因此执行起来可能更快,因为 JavaScript 是一种解释型脚本语言

这是一个错误的假设。大多数现代 JavaScript 引擎都是即时优化编译器。例如,V8(Chrome 中的引擎)是一个两阶段优化编译器:在第一遍中,它将您的 JavaScript 快速转换为机器代码,然后如果它识别热点(代码位运行很多),它会返回并在那里进行更积极的优化。

【讨论】:

  • @Bergi:是的,谢谢。这是我看到这个问题的第一个想法,不太确定我是如何忘记将它实际包含在答案中的!
【解决方案3】:

我会给你这个例子。希望它可以帮助您感觉更清晰。

var arr = [];
arr[0] = 0;
arr[1] = undefined;
arr[2] = null;
arr[3] = NaN;
arr[4] = '';
arr[5] = false;

arr[11] = 1;
arr[12] = [];
arr[13] = {};
arr[14] = 'hello';  
arr[15] = true;  

if(arr[0]) //false but exists
if(arr[1]) //false but exists
if(arr[2]) //false but exists
if(arr[3]) //false but exists
if(arr[4]) //false but exists
if(arr[5]) //false but exists

if(arr[6]) //false and not exist
if(arr[7]) //false and not exist
if(arr[8]) //false and not exist
if(arr[9]) //false and not exist
if(arr[10]) //false and not exist  

if(arr[11]) //true and exists
if(arr[12]) //true and exists
if(arr[13]) //true and exists
if(arr[14]) //true and exists
if(arr[15]) //true and exists

一般来说,我建议您使用第二种解决方案来检查存在性,因为它更短且更易于阅读。但是,它仍然很大程度上取决于您的情况。确保您的选择不会在任何意外情况下失败。

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 2019-04-09
    • 1970-01-01
    • 2022-06-15
    • 2011-04-30
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多