为什么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
这有用吗?在我看来,这似乎是一个糟糕的编程实践。
答案 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)
见评论。
答案 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原则的一个非常重要的例子。有很多有用的方法来扩展在语法上类似于你正在做的事情的对象。