Javascript对象属性与数组值

时间:2014-04-05 00:25:45

标签: 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", "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

我知道几乎所有东西都是javascript中的对象。我一直在这里阅读(http://javascript.info/tutorial/objects)和这里(http://www.w3schools.com/js/js_objects.asp)。

我看到数组可以通过索引e.g. A1[3] --> Blue访问,就像在其他语言中一样。但我也看到可以通过这种方式访问​​属性e.g. A2["Size"] --> 5。所以乍一看,它看起来像数组值和属性值基本相同。但是可以使用.push(value)命令扩展数组,而属性可以使用。

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

实际上,正如我已经写过并研究过这个主题一样,只是所有数组都是对象,但并非所有对象都是数组吗?那么,Show()中的for...in循环实际上是否会根据发送的对象类型而有所不同?

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

1 个答案:

答案 0 :(得分:2)

  

所以乍一看,它看起来像数组值和属性值基本相同。

数组条目和对象属性确实是一回事,因为JavaScript的标准数组aren't really arrays at all,它们只是具有一些附加功能的对象。其中两个功能是特殊的length属性和push功能,这就是为什么你看不到A2的功能。

您对括号中的符号的观察尤为突出。在JavaScript中,您可以使用括号表示法和字符串访问对象属性,如下所示:

var o = {answer: 42};
console.log(o['answer']); // 42

使用数组“索引”时,这是完全你所做的事情并不为人所知:

var a = ['a', 'b', 'c'];
console.log(a[1]); // b

我们与1一起使用的a[1],在技术上根据规范,被强制转换为字符串(a["1"]),然后是属性名称用于在对象上查找属性。

  

那么,Show()中的for ... in循环实际上是否会根据发送的对象类型而有所不同?

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

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

但是,例如,您可以看到for-in对于数组来说与其他对象相同:

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

有关for-in的更多信息: