Python vs javascript列表

时间:2013-12-10 03:58:48

标签: javascript python

我是从python背景来的javascript,想询问如何解释我看到的一些代码。

在Python中,我可以得到以下代码/输出:

Python代码:

myarray = ["a","b", "c"]
for item in myarray:
   print (item)

Python输出

a
b
c

在Javascript中,这给了我不同的东西:

Javascript代码:

var myarray = ["a","b","c"]
for(var item in myarray){
  console.log(item)
}

Javascript输出:

"0"
"1"
"2"

这种解释令我感到困惑。在python中,for循环自然地读取“myarray中的每个项目,打印项目”。但是在Javascript版本中,它打印出“0”,“1”,“2”。为了弄清楚, 我需要将代码更改为:

var myarray = ["a","b","c"]
for(var item in myarray){
  console.log(myarray[item])
}

我想问一下这背后的逻辑是什么(至少在我看来,它似乎并不清楚)?另外,为什么我的第一种方式是将字符串打印出来?

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您的JavaScript代码显示了一种迭代很少使用的数组的方法。您应该使用for语句。

var myarray = ["a","b","c"]
for(var i = 0; i < myarray.length; i++){
  console.log(i, myarray[i])
}

原因是for-in是一般属性枚举器。它包括对象的所有属性,包括所有属性和继承属性,并且不限于数字索引。因此,它将包括您可能包含的所有拥有或隐藏的可枚举属性。

此外,for-in不保证枚举的顺序。因此,您无法确定您是否会获得所需的升序序列。


JavaScript中对象的所有键都是字符串,而数组只是另一种类型的Object。这就是for-in为其键提供字符串的原因,这就是for-in对数组起作用的原因。

通常for-in将用于对象,如:

var myobject = {
    foo: "bar",
    baz: "buz"
}

for (var p in myobject) {
    console.log(p, myobject[p]);
}

所以是的,它“有效”,因为for-in语句不拒绝Array对象。但如果目标是以可预测的顺序迭代数字索引,那么for-in就不是正确的工具。


如果您只是使用更好的语法,ECMAScript 5添加了几个Array迭代方法,这些方法接受为每个现有成员调用的回调函数。

.forEach()方法就是一个例子。

myarray.forEach(function(item, i) {
    console.log(item, i);
});

答案 1 :(得分:0)

for ... in循环不会迭代不可枚举的属性。从内置构造函数(如Array和Object)创建的对象继承了Object.prototype和String.prototype中不可枚举的非可枚举属性,例如String的indexOf方法或Object的toString方法。循环将遍历对象本身的所有可枚举属性,以及对象从其构造函数的原型继承的属性(更靠近原型链中对象的属性覆盖原型的属性)。

for ... in循环以任意顺序迭代对象的属性(有关为什么不能依赖于迭代的看似有序性的原因,请参阅delete运算符,至少在跨浏览器设置中)。如果在一次迭代中修改属性,然后在稍后访问该属性,则其在循环中的值是其稍后的值。在访问之前删除的属性以后不会被访问。添加到正在进行迭代的对象的属性可以在迭代中被访问或省略。通常,除了当前正在访问的属性之外,最好不要在迭代期间添加,修改或删除对象的属性。无法保证是否会访问添加的属性,是否在修改之前或之后访问已修改的属性(当前的属性除外),或者删除之前是否将访问已删除的属性。

答案 2 :(得分:0)

试试这个 - :

for(item in myarray){
  console.log(myarray[item])
}

item将获得myarray的索引。