Javascript同时对象和数组创建

| 为什么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
有这个用吗?在我看来,这是一种不好的编程习惯。     
已邀请:
        在Javascript中,所有数组都是对象。两者之间没有一成不变的分界线。数组具有某些属性和方法,但是被实现为对象。 语法“ 4”是两个等效的Javascript成员运算符之一。这两个等效:
var foo = {};
foo.bar = \'foobar\';
foo[\'bar\'] = \'foobar\';
但是,使用点符号(
foo.bar
),您只能访问有效的Javascript标识符的属性。这表示:   不能由数字开头的字母数字字符序列,还包括下划线(\“ _ \”)和美元符号(\“ $ \”) 您可以通过这种方式设置任何Javascript对象的属性-数组,对象,Date对象,字符串,数字-因为它们都源自相同的Object类型。     
           它不应该抱怨我试图将一个对象用作数组吗? 否。允许使用数字属性。方括号符号“ 7”在对象上用于无效的javascript标识符的键。不只是在数组上。
a[ \"some-invalid***identifier\" ] = \'some value\';
  顺便说一下,这适用于任何事物 是的,同样的原因。 “ 9”返回一个对象,可以通过点或方括号符号将属性分配给该对象。     

bab

        您不会像对待数组一样对待对象-您正在对象中使用数字键。就像它们都是有效的一样:
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
    
        老实说,我认为控制台输出可以启发人:
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: ...
如您所见,这些都是对象,一个是从通用对象继承的,另一个是从日期继承的。就像其他任何对象一样,可以为它们分配一个键/值对,其中1只是被转换为字符串。 如果您以这种方式使用它,那肯定是混乱的编码,但这是JavaScript原理的非常重要的说明。有许多有用的方法来扩展语法上与您正在执行的对象相似的对象。     
         因为用于访问对象属性的[key]表示法将接受任何内容作为键,包括数字。您可以使用的其他内容包括:     var a = {},b = {};     a {b} = 1; //对象a \的属性是对象\'b \'。 它提供了一个真正的对象统一模型,而不是糟糕的编程习惯。   看评论。     

要回复问题请先登录注册