JavaScript 变量赋值表现出奇

标签 javascript arrays variable-assignment

这个问题其实是另一个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)(如 StringNumber)实例化的临时对象为你。您可以像读取任何其他对象一样读取和写入此对象的属性 - 例如尝试 alert(3["constructor"])。然而,由于这个对象在任何地方都没有被引用,在你完成索引之后它就会变成垃圾,下次你尝试读取你刚刚设置的相同属性时,你实际上是在访问新临时对象的属性,它,自然是空的。

关于JavaScript 变量赋值表现出奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973073/

相关文章:

python - 如何在 Python 中从 Matlab 执行此步骤?

c++ - 为 CString 赋值时获取 <Bad Ptr> 和无效值

arrays - 如何在golang中创建对象数组?

javascript - if 语句引发回调

javascript - pgp.as.format() 中的“默认”选项

java - 如何连接两个参数化类型的数组(在 Guava 中)

c++ - 将随机数插入数组,其中每个值都通过 for 循环输入

php - 函数分配一个不为空的参数

javascript - 在标签标签上使用 this.form.submit()

javascript - 单击菜单项时关闭 Canvas 外导航