-1

在玩弄 JavaScript 时,我发现将数组元素与 undefined 进行比较非常有趣。考虑:

L = [1,2,3];
if (L[1] == undefined)
  console.log('no element for key 1');
else
  console.log('Value for key 1'+L[1]);

我认为这是在 JavaScript 中检查序列中的值的好方法,而不是迭代序列或其他容器,但我的问题是:这容易出错还是效率不高?这种比较的成本是多少?

4

2 回答 2

0

在 V8 中,越界访问数组以引出undefined是非常缓慢的,因为例如,如果它是在优化代码中完成的,优化的代码将被丢弃并取消优化。在其他语言中,会抛出一个非常慢的异常,或者在非托管语言中,您的程序将具有未定义的行为,例如如果幸运的话会崩溃。

因此,请始终检查.length集合以确保您不会进行越界访问。

此外,为了性能更喜欢它void 0undefined因为它是编译时间常数而不是运行时变量查找。

于 2013-09-26T08:45:25.333 回答
0

代码不测试是否存在特定值;它测试是否为 [Array] 索引分配了未定义的值。(它也会错误地检测到一些误报值,例如null由于使用==,但这是另一个问题..)

考虑一下:

L = ["hello","world","bye"]
a = L["bye"]
b = L[1]

“再见”的价值a和含义是什么?作为 L 的元素可能存在(或不存在)的任何值的值是什么b以及与这些值有何关系?1

也就是说,迭代一个数组 - 找到一个未知索引的值?对多个值执行操作?- 和按索引访问元素是两种不同的操作,通常不能互换。


另一方面,对象属性可用于实现类似(但有用)的效果:

M = {hello: 1, world: 1, bye: 1}
c = M["hello"]

现在的价值是c多少?用作键的值与数据有何关系?

在这种情况下,属性名称(用作查找键)与正在检查的数据相关,并且可以说一些有用的信息 - 是的,有一个“你好”!(这可以在不使用的情况下检测到一些误报hasOwnProperty,但这是另一个问题..)


而且,当然 .. 对于小序列或不频繁的操作,迭代(或使用类似Array.indexOfor之类的方便方法Array.some)以查找值的存在是“很好”并且不会导致“性能影响”。

于 2013-09-26T00:40:30.447 回答