这个问题其实是另一个question的结果,为此我做了一些实验,结果让我更加困惑。我期待能够解释内部实际发生情况的答案。
我试过的是,
我将此作为基本假设,因为我得到了一些明确的解释 here ,
var a = [];
a['a1'] = [];
a['a2'] = [];
console.log(a); // []
console.log(a['a1']); // []
console.log(a['a2']); // []
测试 1
这让我很困惑,因为它将 b[0]
打印为 a
并且可以访问 length
属性,我想var b
可以看作是一个字符数组,因此我试图分配另一个值,但最终没有成功。从基本假设来看,如果这个可以被视为一个字符数组(更一般地被视为一个数组),那么赋值应该是成功的。它打破了基本假设。
var b = 'abcd';
b['b1'] = [];
console.log(b); // abcd
console.log(b.length); // 4
console.log(b['b1']); // undefined
测试 2
但是如果我这样创建,分配就会发生,
var bb = ['a', 'b', 'c', 'd'];
bb[4] = [];
console.log(bb); // ["a", "b", "c", "d", []]
console.log(bb.length); // 4
console.log(bb[0]); // a
console.log(bb[4]); // []
据此,我认为,b[4] = [];
可能会成功,但是
var b = 'abcd';
b[4] = [];
console.log(b); // abcd
console.log(b.length); // 4
console.log(b[4]); // undefined
我的问题是,为什么这些赋值行为不同,而变量共享一些共同的功能?
这是 demo
任何人都可以就内部实际发生的事情给我一个明确的解释吗?
额外测试
然后,如果我尝试使用数字赋值,它的行为与这两者完全不同。
var c = 1234;
c[4] = [];
console.log(c); //1234
console.log(c.length); // undefined
console.log(c[0]); //undefined
console.log(c[4]); //undefined
最佳答案
当您使用 []
访问除对象以外的任何对象时,将提供一个使用正确原型(prototype)(如 String
或 Number
)实例化的临时对象为你。您可以像读取任何其他对象一样读取和写入此对象的属性 - 例如尝试 alert(3["constructor"])
。然而,由于这个对象在任何地方都没有被引用,在你完成索引之后它就会变成垃圾,下次你尝试读取你刚刚设置的相同属性时,你实际上是在访问新临时对象的属性,它,自然是空的。
关于JavaScript 变量赋值表现出奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973073/