在搞乱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中序列中的值的一种很棒的方法,而不是迭代序列或其他容器,但我的问题是:是容易出错还是效率不高?这种比较的代价是什么?
答案 0 :(得分:0)
代码不会测试特定值是否存在;它测试[Array]索引是否分配一个非未定义的值。 (由于使用null
,它也会错误地检测到==
之类的误报值,但那是另一个问题..)
考虑一下:
L = ["hello","world","bye"]
a = L["bye"]
b = L[1]
a
的价值是什么?它对“再见”的评价是什么? b
的价值是什么?1
与可能(或可能不)作为L的元素存在的任何值相关?
也就是说,迭代一个数组 - 找到未知索引的值?对多个值执行操作? - 并且按索引访问元素是两个不同的操作,通常不能互换。
另一方面,对象属性可用于实现类似(但有用)的效果:
M = {hello: 1, world: 1, bye: 1}
c = M["hello"]
现在c
的价值是多少?作为密钥使用的值如何与数据相关?
在这种情况下,属性名称(用作查找键)与正在检查的数据有关,可以说一些有用的东西 - 是的,有 是“你好”! (这可以在不使用hasOwnProperty
的情况下检测到一些误报,但那是另一个问题..)
当然..对于一个小序列或不常见的操作,迭代(或使用像Array.indexOf
或Array.some
这样的方便方法)来查找值的存在是“很好”并且不会导致“性能影响”。
答案 1 :(得分:0)
在V8中访问数组越界以引出undefined
是非常缓慢的,因为例如如果它在优化的代码中完成,优化的代码将被抛弃并且被去优化。在其他语言中,会抛出一个非常非常慢的异常,或者在非托管语言中,您的程序会有未定义的行为,例如,如果您幸运的话会崩溃。
因此,请务必检查集合的.length
,以确保您不会进行越界访问。
此外,性能优于void 0
而不是undefined
,因为它是编译时常量而不是运行时变量查找。