kam*_*aci 0 javascript performance loops
我有一个数组:
deleteIds= ["User1"];
Run Code Online (Sandbox Code Playgroud)
并尝试迭代它,如:
第一:
for (var index = 0; index < len; index++) {
alert(deleteIds[index]);
}
Run Code Online (Sandbox Code Playgroud)
第二个:
for (var index in deleteIds) {
alert(deleteIds[index]);
}
Run Code Online (Sandbox Code Playgroud)
它们的性能比较是什么?
这是一个微观优化充其量.除非你的deleteIds
数组中有数十万个元素,否则你不应该考虑优化它.
事实证明,该for(;;;)
版本比for in
以下版本更快:http://jsperf.com/iterating-over-a-loop/2(感谢@Jamiec为jsperf).
然而,比这些的性能比较更重要的是,两个代码片段在功能上彼此不同(实例).
var array = new Array(100);
for (var i = 0; i < array.length; i++) {
console.log(i); // shows 0 - 99
}
for (var x in array) {
console.log(x); // shows nothing
}
Run Code Online (Sandbox Code Playgroud)
此外,如果将方法添加到数组或数组原型链中的对象,它们将显示在for (var x in y)
循环中,但不会显示在for (;;;);
(实例)中:
Array.prototype.foo = function() {};
var array = [];
for (var i = 0; i < array.length; i++) {
console.log(i); // nothing
}
for (var x in array) {
console.log(x); // `foo`
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它hasOwnProperty
来消除从原型链继承的属性,但这不会阻止您直接在对象上接收方法(实例):
Array.prototype.foo = function() {};
var array = [];
array.bar = function () {};
for (var i = 0; i < array.length; i++) {
console.log(i); // nothing
}
for (var x in array) {
if (array.hasOwnProperty(x)) {
console.log(x); // `bar`
}
}
Run Code Online (Sandbox Code Playgroud)
正是由于这些原因,for in
不鼓励使用迭代数组,而for(;;;)
应始终使用版本.for in
应该用于迭代对象.
归档时间: |
|
查看次数: |
86 次 |
最近记录: |