Javascript同时对象和数组创建

时间:2011-06-14 23:05:21

标签: javascript arrays object overlap

为什么javascript允许我执行以下操作。

a = {two : 'World'};
a[1] = 'Hello';
console.log(a[1]);
console.log(a.two);

输出

Hello
World

它不应该抱怨我正在尝试将对象用作数组吗?顺便说一句,这适用于任何事情,如此

b = new Date();
b[1] = 'Wow';
console.log(b[1]);

输出

wow

这有用吗?在我看来,这似乎是一个糟糕的编程实践。

5 个答案:

答案 0 :(得分:4)

在Javascript中,所有数组都是对象。两者之间没有硬性和快速的分界线。数组具有某些属性和方法,但实现为对象。

语法[1]是两个等效的Javascript member operators之一。这两个是等价的:

var foo = {};
foo.bar = 'foobar';
foo['bar'] = 'foobar';

但是,使用点表示法(foo.bar),您只能访问有效Javascript标识符的属性。这意味着:

  

一系列字母数字字符,也包括下划线(“_”)和美元符号(“$”),不能以数字开头(source

您可以这种方式设置任何Javascript对象的属性 - 数组,对象,日期对象,字符串,数字 - 因为它们都来自相同的对象类型。

答案 1 :(得分:3)

  

它不应该抱怨我正在尝试将对象用作数组吗?

没有。允许使用数字属性。方括号[]用于对象,用于不是有效javascript标识符的键。不只是在阵列上。

a[ "some-invalid***identifier" ] = 'some value';
  

顺便说一句,这适用于任何事情,如此

是的,同样的道理。 new Date()返回一个对象,可以通过点或方括号表示法为其分配属性。

答案 2 :(得分:3)

您不是将对象视为数组 - 您在对象中使用数字键。正如这些都是有效的:

var o = { "test":1 };
o["test2"] = 2;

这些也是:

var o = { 1: "test" };
o[2] = "test2";

编辑:正如下面的评论所指出的,上述语法实际上是误导性的,因为1在两种情况下都会转换为字符串 - 所以从技术上讲,这与

var o = { "1": "test" };

你可以在这里看到:

var o = {1:"test"};
for (i in o) console.log(i, i===1, i==="1"); // 1 false true

答案 3 :(得分:0)

<德尔> 因为访问对象属性的[key]表示法将接受任何键作为键,包括数字。您可以使用的其他内容包括:     var a = {},b = {};     一个{B} = 1; //对象a的属性是对象'b'。 它不是糟糕的编程实践,而是为对象提供真正统一的模型。


见评论。

答案 4 :(得分:0)

老实说,我认为控制台的输出可能非常有启发性:

var a = {two: "World"};
a[1] = "Hello";
console.log(a);
//   1: "Hello"
//   two: "World"
// > __proto__: Object

var b = new Date();
b[1] = 'Wow';
console.dir(b[1]); // console.log just returns the timestamp
//   1: "Wow"
// v __proto__: Date
//   > constructor: function Date() { [native code] }
//   > getDate: ...

如您所见,这些都只是对象,一个继承自通用Object,另一个继承自Date。就像任何其他对象一样,可以为它们分配一个键/值对,将1转换为字符串。

如果你以这种方式使用,这肯定是凌乱的编码,但它是JavaScript原则的一个非常重要的例子。有很多有用的方法来扩展在语法上类似于你正在做的事情的对象。