可以将Object对象强制转换为Array对象吗?

时间:2012-08-29 20:54:37

标签: javascript

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对象。

5 个答案:

答案 0 :(得分:1)

它不会成为数组,它只是一个具有'4'属性的Object,如下所示:

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

在用作obj['4'] = 'x';

等属性时,它只是转换为字符串

答案 1 :(得分:1)

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

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

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

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

    数组的元素只是带有数字键的属性。数组构建在对象之上,并实现了一些以特殊方式处理这些数字属性的其他方法。例如,添加新元素时会自动更新.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之类的方法。