2012-08-29 264 views
2

克罗克福德写入在http://javascript.crockford.com/survey.html

“有两种方法可以使一个新的数组:

变种myArray的= [];
变种myArray的新=阵列();”
对象对象是否可以强制转换为数组对象?


所以我通过这两条线在一些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,因为第二行覆盖了obj的前一个定义,因为它会创建一个新的Array对象。

+0

所以看来4强制转换成在这方面的字符串。谢谢Felix和agreco。 –

+0

即使数组键也被转换为字符串,因为属性名称(键/ ...)始终是一个字符串。 –

+0

这是我第一次成功的Q,我对这个快速而全面的回应感到惊讶。谢谢所有回答的人。 –

回答

0

就我所知,不,一个对象不能被强制到一个数组中。 但是,它可以看起来和行为像一个数组,这就是发生在这里。数字,和其他任何可以强制转换为字符串,是完全对JavaScript对象有效的属性名称,所以

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

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

1

它不会成为一个数组,这是简单地用一个“4”属性的对象,这样的:

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

obj['4'] = 'x';

1
一个属性使用时它仅仅是转换为字符串

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

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

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

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

数组的元素是只用数字键的性质。数组构建在对象之上,并实现一些以特殊方式处理这些数值属性的附加方法。例如,添加新元素时,.length属性会自动更新。但最终他们只是普通的属性。

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

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

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/

文档

0

JavaScript数组是由传统阵列非常不同的,你可以把它作为目标。

var array = [1,2,3] is equivalent to var object = {'0' : 1, '1' : 2, '2' : 3} 

除了阵列从Array.prototype继承和从Object.prototype中,其中Array.prototype将包含方法如长度对象继承。

+0

您忘记了数组的长度属性 – Bergi

相关问题