了解JavaScript对象、数组和[]运算符

Understanding JavaScript objects, arrays and the [] operator

本文关键字:运算符 数组 JavaScript 对象 了解      更新时间:2023-09-26

我目前正在研究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属性。