JavaScript变量赋值表现令人惊讶

时间:2012-08-15 16:20:08

标签: javascript arrays variable-assignment

这个问题实际上是来自另一个question的结果,我已经做了一些实验,结果让我更加困惑。我期待的答案可以解释内部实际发生的事情。

我试过的是,

我将此作为基础假设,因为我得到了一些明确的解释    here

var a = [];
a['a1'] = [];
a['a2'] = [];

console.log(a); // []
console.log(a['a1']); // []
console.log(a['a2']); // []

TEST 1

这让我很困惑,因为它将b[0]打印为a并且能够访问length属性,我认为var b可以被视为字符数组因此我尝试分配另一个值,但最终没有成功。从基础假设,如果可以将此对象视为char数组(更通常作为数组),则赋值应该已成功。它打破了基本假设。

var b = 'abcd';
b['b1'] = [];

console.log(b); // abcd
console.log(b.length); // 4
console.log(b['b1']); // undefined

TEST 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   

4 个答案:

答案 0 :(得分:1)

测试1: b是内部字符串,而不是数组,因此您无法在b位置分配内容。

测试2:当然可以使用,因为现在bb是一个数组。

  

我的问题是,为什么这些作业在表现时表现不同   变量共享一些共同的功能?

因为他们的类型不同。

测试3: c是数字,而不是数组。

也许你有一些C背景,其中字符串是由null char(\0)终止的char数组。在JavaScript中,字符串是由int类型构成的,它们的行为与数组不同。 Jonathan说,[]运算符只是方便访问一个特定字符。以下是一些链接,请看一下:

答案 1 :(得分:1)

当您访问除[]的对象以外的任何内容时,会为您提供使用正确原型实例化的临时对象(如StringNumber)。您可以像使用其他任何内容一样读取和写入此对象的属性 - 例如,尝试alert(3["constructor"])。但是,由于此对象在您完成索引后立即转到垃圾的任何地方都没有引用,下次当您尝试读取刚刚设置的相同属性时,您实际上是在新临时对象上访问属性,自然是空的。

答案 2 :(得分:0)

<强>推理

您的“基本假设”有效,因为a是一个数组。 “测试2”是您编写的唯一使用数组的测试用例,这就是为什么这是唯一有效的其他测试用例。

您似乎假设提供方括号表示法并使用length方法表示对象是数组。这不是真的。要测试对象是否是数组,可以使用JavaScript的instanceof方法,如下所示:

var a = [];
var b = 'abcd';
var bb = ['a', 'b', 'c', 'd'];
var c = 1234;

a  instanceof Array // => true
b  instanceof Array // => false
bb instanceof Array // => true
c  instanceof Array // => false

请注意,instanceof Array返回true的情况是那些按预期运行的情况,因为您正在尝试执行数组操作。


为什么“测试1”失败

对于“Test 1”,字符串的方括号表示法执行字符串类的charAt函数。鉴于b = 'abcd'执行b[0]与执行b.charAt(0) 相同。它是只读的,只返回该索引处的字符,即“a”。

有关详细信息,请参阅the Mozilla Developer Network documentation for Strings


为什么“额外测试”失败

对于“额外测试”,整数不提供方括号表示法或长度法,因此所有这些调用都失败了。

答案 3 :(得分:0)

我想我不遵循你的问题。 Javascript以不同方式处理字符串,数组和整数。你不应该指望他们以同样的方式行事。此外,javascript中的关联数组也没有第一个例子可用的地方。 a['a1']类型的表示法实际上只是访问对象属性的替代方法,在字符串的上下文中没有任何意义。