我被告知不要使用。。。在JavaScript中使用数组。为什么不呢?
当前回答
for/in使用两种类型的变量:哈希表(关联数组)和数组(非关联)。
JavaScript将自动确定其通过项目的方式。因此,如果您知道数组确实是非关联的,可以使用(var i=0;i<=arrayLen;i++),并跳过自动检测迭代。
但在我看来,最好使用for/in,自动检测所需的过程非常小。
对此的真正答案将取决于浏览器解析器/解释JavaScript代码的方式。它可以在浏览器之间更改。
我想不出不使用for/in的其他目的;
//Non-associative
var arr = ['a', 'b', 'c'];
for (var i in arr)
alert(arr[i]);
//Associative
var arr = {
item1 : 'a',
item2 : 'b',
item3 : 'c'
};
for (var i in arr)
alert(arr[i]);
其他回答
原因是一个构造:
变量a=[];//创建新的空数组。a[5]=5;//调整数组大小的完全合法的JavaScript。对于(var i=0;i<a.length;i++){//按照每个人的预期,在从0到5的数字索引上重复。控制台日志(a[i]);}/*将显示:未定义未定义未定义未定义未定义5.*/
有时可能完全不同:
变量a=[];a[5]=5;for(a中的var x){//仅显示显式设置的索引“5”,并忽略0-4console.log(x);}/*将显示:5.*/
还要考虑JavaScript库可能会这样做,这会影响您创建的任何数组:
//在JavaScript库的深处。。。Array.prototype.foo=1;//现在你不知道下面的代码会做什么。变量a=[1,2,3,4,5];for(a中的var x){//现在foo是每个数组的一部分//将在此处显示为“x”值。console.log(x);}/*将显示:01.2.3.4.食品*/
除了。。。在所有可枚举财产的循环中(这与“所有数组元素”不同!),请参阅http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf,第12.6.4节(第5版)或13.7.5.15节(第7版):
列举财产的机制和顺序。。。未指定。。。
(强调我的。)
这意味着,如果浏览器愿意,它可以按照插入财产的顺序浏览这些属性。或按数字顺序排列。或者按照词法顺序(其中“30”在“4”之前!请记住,所有对象键——因此,所有数组索引——实际上都是字符串,所以这是完全有意义的)。如果它将对象实现为哈希表,那么它可以按桶遍历它们。或者把其中任何一个加上“向后”。浏览器甚至可以随机迭代,并且符合ECMA-262,只要它访问每个属性一次即可。
实际上,大多数浏览器目前都喜欢以大致相同的顺序进行迭代。但没有什么可以说他们必须这样做。这是特定于实现的,如果发现另一种方式更有效,随时可能会改变。
不管怎样,因为。。。它没有秩序的内涵。如果您关心顺序,请明确它,并使用带索引的正则for循环。
我认为我没有什么要补充的,比如Triptych的答案或CMS关于为什么使用for。。。在某些情况下应避免。
然而,我想补充一点,在现代浏览器中,有一种替代。。。在这种情况下。。。无法使用中的。另一种选择是。。。第页,共页:
for (var item of items) {
console.log(item);
}
注:
遗憾的是,没有版本的Internet Explorer支持。。。(Edge 12+确实如此),因此您必须等待一段时间,直到可以在客户端生产代码中使用它。然而,在服务器端JS代码中使用它应该是安全的(如果您使用Node.JS)。
for/in使用两种类型的变量:哈希表(关联数组)和数组(非关联)。
JavaScript将自动确定其通过项目的方式。因此,如果您知道数组确实是非关联的,可以使用(var i=0;i<=arrayLen;i++),并跳过自动检测迭代。
但在我看来,最好使用for/in,自动检测所需的过程非常小。
对此的真正答案将取决于浏览器解析器/解释JavaScript代码的方式。它可以在浏览器之间更改。
我想不出不使用for/in的其他目的;
//Non-associative
var arr = ['a', 'b', 'c'];
for (var i in arr)
alert(arr[i]);
//Associative
var arr = {
item1 : 'a',
item2 : 'b',
item3 : 'c'
};
for (var i in arr)
alert(arr[i]);
一个重要的方面是。。。in-only迭代包含在对象中的财产,该对象的可枚举属性属性设置为true。因此,如果尝试使用for对对象进行迭代。。。然后,如果任意财产的可枚举属性为false,则可能会丢失这些属性。很有可能更改普通Array对象的可枚举属性属性,以便不枚举某些元素。虽然一般来说,属性属性倾向于应用于对象中的函数财产。
可以通过以下方式检查财产的可枚举属性属性的值:
myobject.propertyIsEnumerable('myproperty')
或获取所有四个属性属性:
Object.getOwnPropertyDescriptor(myobject,'myproperty')
这是ECMAScript 5中提供的一个特性——在早期版本中,无法更改可枚举属性属性的值(它总是设置为true)。
推荐文章
- 给一个数字加上st, nd, rd和th(序数)后缀
- 如何以编程方式触发引导模式?
- setTimeout带引号和不带括号的区别
- 在JS的Chrome CPU配置文件中,'self'和'total'之间的差异
- 用javascript检查输入字符串中是否包含数字
- 如何使用JavaScript分割逗号分隔字符串?
- 在Javascript中~~(“双波浪号”)做什么?
- 谷歌chrome扩展::console.log()从后台页面?
- 未捕获的SyntaxError:
- Java数组有最大大小吗?
- [].slice的解释。调用javascript?
- jQuery日期/时间选择器
- 数组与列表的性能
- 我如何预填充一个jQuery Datepicker文本框与今天的日期?
- 数组的indexOf函数和findIndex函数的区别