2

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 中我们可以使用名称(字符串)或整数作为哈希键的相同吗?

我已经用谷歌搜索了这个问题的答案,但似乎无法确定一篇讨论这个问题的文章。

想到的一种可能性是,第一行可能是语法 lint,因为第二行在创建新的 Array 对象时覆盖了 obj 的先前定义。

4

5 回答 5

1

它不会变成一个数组,它只是一个具有“4”属性的对象,如下所示:

var obj = {
  '4': 'x'
};

当用作属性时,它只是转换为字符串obj['4'] = 'x';

于 2012-08-29T20:58:45.967 回答
1

在 JavaScript 中,除了原始数据类型之外的所有东西都是对象。对象可以有一个属性,有两种访问对象属性的方法:

  1. 点表示法,foo.bar只要属性名称是有效标识符,您就可以使用它。

  2. 括号表示法,foo['bar']如果密钥不是有效的标识符[spec] ,则必须使用它。例如,如果它是一个数字,或者包含一个空格,或者您有一个带有名称的变量。

因此,括号表示法不是数组的特征,如果您看到它,它并不意味着该值是一个数组。这是访问属性的两种简单方法之一。

数组的元素只是带有数字键的属性。数组建立在对象之上,并实现了一些以特殊方式处理这些数字属性的附加方法。例如,.length当您添加新元素时,该属性会自动更新。但最终它们只是正常的属性。

在您的示例中,您有一个简单的对象。obj[4]您必须使用or访问该属性,obj['4']因为obj.4它是无效的,因为4它不是有效的标识符(基本上,您可以用作变量名的所有内容都是有效的标识符。var 4 = 'foo';无效)。

而且由于数组只是对象,如果您可以使用数字作为标识符,您还可以使用arr.4.

于 2012-08-29T21:00:46.393 回答
0

据我所知,不,不能将对象强制转换为数组。但是,它看起来和行为都像一个数组,这就是这里发生的事情。数字和任何其他可以强制转换为字符串的东西,对于 Javascript 对象来说都是完全有效的属性名称,所以

obj[4] = 1;
obj['spam'] = 2;

都是在对象上设置属性的有效方法。这不会使对象成为数组。Array 是一类特殊的对象,具有特定的方法(.slice().concat()等)和一个length与数组中的项目数保持同步的属性。

于 2012-08-29T20:58:44.307 回答
0

Javascript 是一种松散类型、基于原型的语言。甚至像布尔值这样的原始类型也可以被视为对象(尽管您不会走得太远)。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/

文档

于 2012-08-29T21:04:28.903 回答
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 将包含长度等方法。

于 2012-08-29T21:05:50.653 回答