Javascript对象属性与数组值

Javascript对象属性与数组值,javascript,arrays,object,Javascript,Arrays,Object,我试图学习javascript(来自Delphi/pascal),但不清楚对象属性和数组值之间的异同。我确实试着在档案馆和网络上搜索这个答案 考虑以下代码: function Show(Arr) { var str =''; for (var Val in Arr) { str += Val + '::' + Arr[Val] + '\n'; } return str; } var str = ''; var A1 = ["Yellow", "Red", "Bl

我试图学习javascript(来自Delphi/pascal),但不清楚对象属性和数组值之间的异同。我确实试着在档案馆和网络上搜索这个答案

考虑以下代码:

function Show(Arr) {
  var str ='';
  for (var Val in Arr) {
      str += Val + '::' + Arr[Val] + '\n';
  }   
  return str;
}
var str = '';
var A1 = ["Yellow", "Red", "Blue"];
var A2 = {"color":"red", "Size": 5, "taste":"sour"}

alert(Show(A1));
//OUTPUTS: 
//    0::Yellow
//    1::Red
//    2::Blue

A1.push("Green");
alert(Show(A1));
//OUTPUTS: 
//    0::Yellow
//    1::Red
//    2::Blue
//    3::Green

alert('Length: '+A1.length);
//OUTPUTS: 
//   Length: 4

alert(Show(A2));
//OUTPUTS:
//  color::red
//  Size::5
//  taste:sour

alert('Length: '+A2.length);
//OUTPUTS: 
//   Length: undefined

A2.push("Green");
//ERROR --> execution stops on jsfiddle.net. 
alert("OK");  //<-- never executed
alert(Show(A2));  //<-- never executed
功能显示(Arr){
var-str='';
for(Arr中的var Val){
str+=Val+'::'+Arr[Val]+'\n';
}   
返回str;
}
var-str='';
变量A1=[“黄色”、“红色”、“蓝色”];
变量A2={“颜色”:“红色”,“大小”:5,“味道”:“酸味”}
警报(显示(A1));
//产出:
//0::黄色
//1::红色
//2::蓝色
A1.推动(“绿色”);
警报(显示(A1));
//产出:
//0::黄色
//1::红色
//2::蓝色
//3::绿色
警报(“长度:”+A1.长度);
//产出:
//长度:4
警报(显示(A2));
//产出:
//颜色:红色
//尺寸:5
//味道:酸味
警报(“长度:”+A2.长度);
//产出:
//长度:未定义
A2.推送(“绿色”);
//错误-->在jsfiddle.net上停止执行。
警报(“正常”);//5
。所以乍一看,数组值和属性值基本相同。但是数组可以用.push(value)命令扩展,而属性不能

我的Show函数同时适用于数组和对象,这是巧合吗

事实上,正如我写这篇文章并研究这个主题时所说的,是不是所有的数组都是对象,而不是所有的对象都是数组?那么Show()中的“
for…in”
循环是否根据发送的对象类型而实际工作不同呢

任何澄清这一点的帮助都将不胜感激。谢谢

所以乍一看,数组值和属性值基本相同

数组条目和对象属性实际上是一样的,因为JavaScript的标准数组,它们只是具有一些附加特性的对象。其中两个功能是特殊的
length
属性和
push
功能,这就是为什么您看不到带有
A2
的功能

你对括号表示法的观察特别准确。在JavaScript中,可以使用括号表示法和字符串访问对象属性,如下所示:

var o = {answer: 42};
console.log(o['answer']); // 42
var a = ['zero'];      // An array with one entry
a.answer = 42;         // We've added a property to the object that isn't an array entry
console.log(a.length); // 1, because `length` only relates to array "indexes" as
                       // defined by the specification
var key;
for (key in a) {
    console.log(key + "=" + value);
}
// Shows (in *no reliable order*):
// 0=zero
// answer=42
众所周知,这正是使用数组“索引”时所做的操作:

我们与
a[1]
一起使用的
1
,从技术上讲,根据规范,被强制为字符串(
a[“1”]
),然后该属性名称用于查找对象上的属性

那么,Show()中的for…in循环是否根据发送的对象类型实际工作不同呢

否,中的
对所有对象的作用相同。它迭代对象的可枚举属性的名称。无论您使用的是数组还是任何其他对象都无关紧要

请注意,并非所有属性都是可枚举的。例如,
Array#length
不是,也不是
Array#push
Object#toString
或对象的任何其他内置属性

但例如,您可以看到,对于in
中的
,数组与其他类似对象的
是相同的:

var o = {answer: 42};
console.log(o['answer']); // 42
var a = ['zero'];      // An array with one entry
a.answer = 42;         // We've added a property to the object that isn't an array entry
console.log(a.length); // 1, because `length` only relates to array "indexes" as
                       // defined by the specification
var key;
for (key in a) {
    console.log(key + "=" + value);
}
// Shows (in *no reliable order*):
// 0=zero
// answer=42
有关中的
的更多信息:

  • (在我的博客上)

嗯……也许这篇文章也会让你对@bjb568有所了解——但他们的网站太漂亮了!前几天我看到了这个网站的参考资料,但今天读了。我听到他们说有不准确的地方,但当我点击备选方案时,他们似乎是高级用户的目标,而且他们似乎更难从中获得信息。谢谢你的提醒。@icanc——这是一个有用的链接。谢谢@kdtop真的那么难理解吗?答案很好。谢谢