JavaScript 变量赋值的行为令人惊讶
JavaScript variable assignments behaving surprisingly
这个问题实际上是另一个问题的结果,我为此做了一些实验,结果让我更加困惑。我期待解释内部实际发生的事情的答案。
我尝试的是,
我保留了这个作为基本假设,因为我得到了一些明确的解释 这里
var a = [];
a['a1'] = [];
a['a2'] = [];
console.log(a); // []
console.log(a['a1']); // []
console.log(a['a2']); // []
测试 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
测试 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
我的问题是,为什么这些赋值的行为不同,而变量共享一些共同的功能?
这是演示
谁能给我一个关于内部实际发生的事情的明确解释?
额外测试
然后,如果我尝试使用数字赋值,它的行为与这两者完全不同。
var c = 1234;
c[4] = [];
console.log(c); //1234
console.log(c.length); // undefined
console.log(c[0]); //undefined
console.log(c[4]); //undefined
[]
访问对象以外的任何内容时,会为您提供一个使用正确原型(如 String
或 Number
)实例化的临时对象。您可以像读取和写入任何其他对象一样读取和写入此对象的属性 - 例如尝试alert(3["constructor"])
。但是,由于此对象未在任何地方引用,因此在您完成索引后,它会立即进入垃圾箱,下次尝试读取刚刚设置的相同属性时,您实际上是在访问新临时对象上的属性,该属性自然是空的。
测试 1:b
内部是一个字符串,而不是数组,因此您不能在b
位置分配某些内容。
测试 2:当然它可以工作,因为现在bb
是一个数组。
我的问题是,为什么这些作业的行为不同,而 变量共享一些共同功能?
因为它们的类型不同。
测试 3: c
是一个数字,而不是一个数组。
也许你有一些 C 背景,其中字符串是以空 char ( '0
) 结尾的字符数组。在 JavaScript 中,字符串是构建的 int 类型,它们的行为与数组不同。正如乔纳森所说,[]
运算符只是为了方便访问一个特定的字符。这里有一些链接,看看:
- JavaScript 字符串
- JavaScript 数组
- JavaScript 编号
推理
您的"基本假设"有效a
因为它是一个数组。 "Test 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"失败
对于"测试 1",字符串的方括号表示法执行字符串类的charAt
函数。 给定b = 'abcd'
,执行b[0]
与执行b.charAt(0)
相同。 它是只读的,只是返回该索引处的字符,即"a"。
有关更多详细信息,请参阅 Mozilla 开发者网络文档以获取字符串。
为什么"额外测试"失败
对于"额外测试",整数不提供方括号表示法或长度方法,因此所有这些调用都失败了。
我想我不遵循你的问题是什么。 Javascript 以不同的方式处理字符串、数组和整数。 您不应该期望它们以相同的方式行事。 此外,javascript 中没有关联数组这样的东西,您的第一个示例将在哪里工作。 a['a1']
类型的表示法实际上只是访问对象属性的替代方法,在字符串的上下文中没有任何意义。
- Javascript变量赋值|
- 如何在javascript中为全局变量赋值
- 我可以在javascript中的回调函数中为变量赋值吗
- JavaScript 变量赋值的行为令人惊讶
- 为什么 Javascript 在变量赋值时将 null 转换为字符串
- JavaScript: 变量赋值 in for 语句 |在前面或里面
- 我可以将变量赋值为数组值吗?
- 变量赋值无效
- 一行中的多个变量赋值
- Javascript中的多变量赋值
- 如何根据 IF 句子和警报为变量赋值?.JS
- 无法为变量赋值 - Javascript
- 为所有以特定字符串开头的变量赋值
- Javascript中多变量赋值的正确方法
- 条件变量赋值的最佳方法
- 在 JavaScript 中是否有一个严格等价的 ||在变量赋值中使用时
- 在 JavaScript 中,未声明的变量赋值可以在函数范围之外访问
- 使用Javascript,变量赋值上下文中的表达式与上下文外的表达式有什么区别
- JavaScript 变量赋值
- 当我为 PHP 变量赋值时,是否可以调用 JavaScript 函数