与未定义的javascript进行比较的成本
在使用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中检查序列中的值的一种很棒的方法,而不是在序列或其他容器上迭代,但我的问题是:这种方法容易出错还是效率不高?这种比较的代价是什么?代码不测试是否存在
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"]