我试图学习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
循环实际上是否会根据发送的对象类型而有所不同?
任何帮助澄清这一点将不胜感激。谢谢。
答案 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#push
或Object#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
的更多信息: