Crockford在http://javascript.crockford.com/survey.html写道:
“制作新阵列的方法有两种:
var myArray = [];
var myArray = new Array();“
所以我在阅读的一些AJAX代码中对这两行感到困惑:
var obj={}; // obj is an Object object (i.e. a hash table)
obj[4] = 'x'; // now obj is suddenly an Array object via an integer key?
在JavaScript中,对象和数组实际上是一样的,但是在键类型上有一个变体?
换句话说,这是否与php中的相同,我们可以使用 名称(字符串)或散列键的整数?
我已经用Google搜索了这方面的答案,但似乎无法确定一篇讨论此问题的文章。
一种可能的想法是,第一行可能是语法lint,因为第二行会覆盖obj的先前定义,因为它会创建一个新的Array对象。
答案 0 :(得分:1)
它不会成为数组,它只是一个具有'4'属性的Object,如下所示:
var obj = {
'4': 'x'
};
在用作obj['4'] = 'x';
答案 1 :(得分:1)
除了原始数据类型之外的所有内容都是JavaScript中的对象。对象可以具有属性,有两种方法可以访问对象属性:
点符号foo.bar
,只要属性名称是有效的标识符,就可以使用它。
如果密钥不是valid identifier [spec],则必须使用括号表示法foo['bar']
。例如,如果它是一个数字,或者包含一个空格,或者您有一个带有名称的变量。
因此,括号表示符不是数组的特征,如果你看到它,它并不意味着值是一个数组。这是访问属性的两种方法之一。
数组的元素只是带有数字键的属性。数组构建在对象之上,并实现了一些以特殊方式处理这些数字属性的其他方法。例如,添加新元素时会自动更新.length
属性。但最终它们只是正常的属性。
在您的示例中,您有一个简单的对象。您必须使用obj[4]
或obj['4']
访问该属性,因为obj.4
无效,因为4
不是有效的标识符(基本上您可以用作变量名的所有内容都是有效的标识符。var 4 = 'foo';
无效。)
由于数组只是对象,如果你可以使用数字作为标识符,你也可以使用arr.4
访问元素。
答案 2 :(得分:0)
据我所知,不,一个对象不能被强制转换为数组。 但是,它可以看起来像一个数组,这就是这里发生的事情。数字以及可以强制转换为字符串的任何其他内容都是Javascript对象的完全有效的属性名称,因此
obj[4] = 1;
obj['spam'] = 2;
都是在对象上设置属性的有效方法。这不会使对象成为一个数组。 Array是一个特殊的对象类,具有特定的方法(.slice()
,.concat()
等)和length
属性,该属性与数组中的项目数保持同步。
答案 3 :(得分:0)
Javascript是一种松散类型,基于原型的语言。甚至像布尔这样的原始类型可以被视为对象(though you aren't going to get far)。几乎所有javascript中的所有东西都是一个对象。
理解这一点,数组是一个对象。您可以随意向任何对象添加属性:
var xml = new XMLHttpRequest();
xml[4] = 'x';
console.log(xml);
该对象仍然是XMLHttpRequest的一个实例。它现在有一个标记为4
的属性,其值为x
。你可以对待这样的事情 - 甚至是一个函数:
var test_func = function () {
alert('woah!');
}
test_func[4] = 'x';
console.log(test_func[4]);
这里的内容是obj[key] = value
表示法并不表示“数组”类型,就像在PHP等语言中一样。相反,它是访问任何对象属性的另一种方式,相当于obj.key = value
(不能使用obj.4 = 'x'
,这是无效的语法)。另一个外卖是javascript中的任何对象都可以被修改或以任何方式使用。你不应该滥用对象,但可以
请在此处查看:http://jsfiddle.net/w2AqJ/
<强>文档强>
答案 4 :(得分:0)
是
Javascript Array与传统数组非常不同,您可以将其视为对象。
var array = [1,2,3] is equivalent to var object = {'0' : 1, '1' : 2, '2' : 3}
除了从Array.prototype继承的数组和从Object.prototype继承的对象,其中Array.prototype将包含诸如length之类的方法。