Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与未定义的javascript进行比较的成本_Javascript_Performance - Fatal编程技术网

与未定义的javascript进行比较的成本

与未定义的javascript进行比较的成本,javascript,performance,Javascript,Performance,在使用JavaScript时,我发现比较数组元素和未定义元素非常有趣。考虑到: 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中检查序列中的值的一种很棒的方法,而不是在序列或其他容器上迭代,但我的问题是:这种方法容易出错还是效率不高?这种比较的代价是什么?代码不测试是否存在

在使用JavaScript时,我发现比较数组元素和未定义元素非常有趣。考虑到:

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中检查序列中的值的一种很棒的方法,而不是在序列或其他容器上迭代,但我的问题是:这种方法容易出错还是效率不高?这种比较的代价是什么?

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

考虑这一点:

L = ["hello","world","bye"]
a = L["bye"]
b = L[1]
a
的值是多少?关于“再见”它说了什么?
b
的值是什么,以及
1
与作为L元素存在(或不存在)的任何值的关系如何

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


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

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

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



当然。。对于一个小的序列,或者一个不频繁的操作,迭代(或者使用像or这样的简便方法)来发现一个值的存在是“很好”的,并且不会导致“性能影响”。

在V8中,访问数组超出范围以获取
未定义的
是非常慢的,因为例如,如果它是在优化的代码中完成的,优化后的代码被丢弃,并被取消优化。在其他语言中,也会抛出异常,异常速度非常慢,或者在非托管语言中,您的程序会有未定义的行为,例如,如果幸运的话,会崩溃

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


此外,对于性能,您更喜欢
void 0
而不是
undefined
,因为它是一个编译时常量,而不是运行时变量查找。

“[…]而不是在序列或其他容器上迭代”--您能否更详细地解释一下,您的意思是什么?可能会发布一个这种情况下的代码示例以了解差异。呃,如果您使用
===
而不是
==
,那么所谓的“性能”将提高10~12倍,我只是想知道这是否是一个有害的比较,或者我真的可以这样做,作为一种在不降低执行速度的情况下查找列表中元素的更简单方法。谢谢你的评论\i不要将这些项目称为
key
,而应将其视为
index
。在中,您可以将它们称为
1,2,3
key
M = {hello: 1, world: 1, bye: 1}
c = M["hello"]