了解JavaScript对象、数组和[]运算符
Understanding JavaScript objects, arrays and the [] operator
我目前正在研究JavaScript对象和数组的性质。我知道在JavaScript(作为一种面向对象的语言)中,一切都源自对象{}
。
我将一步一步地进行调查,以帮助理解我在这里提出的问题。每次对对象或数组赋值后,其下方的注释都会说明赋值后该变量的状态。
我已经在Chrome控制台中测试了所有内容
// These will be used throughout the example.
var obj = {};
var arr = [];
好吧,这样我就可以把东西以键/值对的形式分配给对象了。
obj["a"] = "Hello World";
obj["b"] = "Goodbye World";
// {a: "Hello World", b: "Goodbye World"}
在这方面,我也可以将数字作为键传递(尽管我不确定这是否是好的做法)。
obj[1] = "Another World";
// {a: "Hello World", b: "Goodbye World", 1: "Another World"}
同样,如果我想从一个对象中获取一个值,我可以使用[]运算符。
obj["a"];
// "Hello World"
obj[1];
// "Another World"
现在让我们来看看数组对象。我仍然可以使用[]运算符,但这似乎有一个相当奇怪的实现!
arr[0] = "John";
arr[1] = "Pam";
// ["John", "Pam"]
与对象一样,我可以使用[]运算符来获取值。
arr[0];
//"John"
但这似乎有点奇怪。。。给定数组的当前状态,我还可以执行以下操作。
arr["0"] = "Mark";
arr["1"] = "Helen";
// ["Mark", "Helen"]
因此,如果我将数字作为字符串传入,JavaScript会将其转换为数组索引……但当我传入非数字键时会发生什么?
arr["foo"] = "Samantha";
arr["bar"] = "Matthew";
// ["Mark", "Helen"]
因此,当我向数组中添加一个键/值对时,它对数组本身没有影响,但我仍然可以从该键中获取值。
arr["foo"]
// "Samantha"
因此,我的问题是:数组为什么以及如何确定如何存储数据,无论是作为键值对,还是作为数组本身的一部分?
我的直觉是,因为从技术上讲,数组是对象的衍生物,它继承了对象将值存储为键/值对的能力,但也允许按索引存储值(数组的性质)。
如果有人对此有任何见解,我很高兴听到!
实际上,情况正好相反。
Javascript对象中的键总是字符串。
例如:
var obj = {};
obj[42] = "Hi!";
obj["42"]; // "Hi!"
数组的唯一区别在于,数组具有基于已设置的最高数字索引的特殊length
属性。
相关文章:
- 如何在加号运算符之后选择数组元素的一部分
- 为什么删除运算符不更改数组的长度
- 使用地图时使用扩展运算符扩展数组
- 根据数组值和运算符进行计算
- 使用空数组时比较运算符 JavaScript 的奇怪行为
- 比较运算符在 javascript 中的数组上比较什么
- 在 JavaScript 中添加/除法/乘以数组中的数字和运算符,而无需 eval()
- 使用 IF 运算符对给定数组中的字母数字和非字母数字元素执行不同的操作
- 如何在JavaScript中重新定义数组上的+运算符
- 了解JavaScript对象、数组和[]运算符
- 是否可以按顺序从数组中提取数字和运算符
- 将逐位运算符应用于数组的值
- 删除数组中不存在的索引元素上的运算符行为
- 拆分运算符上的数学表达式,并将运算符包含在输出数组中
- 如何计算数字和数学运算符的数组(或字符串)
- Redux:在二维数组上使用扩展运算符
- 字符串数组中的Javascript算术运算符
- 使用数学运算符循环对字符串数组(里面有数字)执行数学运算
- 为什么我可以使用数组索引运算符从jQuery对象访问HTMLElement
- 了解复杂数组三元运算符