Python vs javascript lists

Python vs javascript lists

本文关键字:lists javascript vs Python      更新时间:2024-06-03

我从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])
}

我想问这背后的逻辑是什么(至少在我看来,这似乎不那么清楚)?还有,为什么我的第一种方法会把项目打印成字符串?

谢谢你的帮助!

您的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的所有键都是字符串,数组只是Object的另一种类型。这就是for-in为其键提供字符串的原因,也是for-in在Arrays上工作的原因。

通常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);
});

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

A代表。。。in循环以任意顺序迭代对象的属性(请参阅delete操作符了解更多关于为什么不能依赖于迭代的外观顺序的信息,至少在跨浏览器设置中是这样)。如果一个属性在一次迭代中被修改,然后在以后的时间访问,那么它在循环中的值就是它在以后时间的值。在访问之前被删除的属性以后将不会被访问。添加到正在进行迭代的对象的属性可以被访问,也可以从迭代中省略。通常,在迭代过程中,最好不要添加、修改或删除对象中的属性,而不是当前访问的属性。无法保证添加的属性是否会被访问,修改的属性(当前属性除外)是否会在修改之前或之后被访问,或者删除的属性是否在删除之前被访问。

试试这个-:

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

CCD_ 10将得到CCD_ 11的索引。