shi*_*ite 1 javascript arrays object
嗨,我附上了我的Firefox控制台的屏幕截图,并想知道为什么数组在javascript中的行为如此.
我试图理解js中的......和... ...但遇到了这个问题.我现在明白,因为...正在打印只是键,而...正在打印值部分.但我不明白为什么阵列首先采用键值对?
我想,由于Array也是一个Object,它可以采用A键:值对作为输入,但是当我在console.log(a)时,为什么它不打印foo:bar,即使打印["foo"]打印"bar" ".是否有一些概念我错过了,无法理解?
但Chrome浏览器显示如下:
在这种情况下,打印数组a给我[1,2,3,foo:"bar"]作为输出,但是如果我定义
var b=[1,2,3,foo: "bar"]
Run Code Online (Sandbox Code Playgroud)
它给了我意想不到的象征.为什么会这样?
因为Javascript中的数组可以包含成员(即数组中的东西),但也是对象,因此可以具有键/值属性.
这可能有点令人困惑,所以让我们使用装运箱的比喻:
盒子里面装有东西(成员),但它也有盒子本身的信息(送货地址,寄信地址等......即属性).然而,他们也有自己的一个"运输单" 外,其细节内容里面的盒子,这使得它使盒子的内容也都是它的特性.
var box = [thing1ToShip, thing2ToShip]; // box contents
box.shippingAddress = 'some address'; // a box property (aka box['shippingAddress'])
box.returnAddress = 'some address'; // a box property (aka box['returnAddress'])
// The "manifest"
box[0] === thing1ToShip; // both content AND a box property
box[1] === thing2ToShip; // both content AND a box property
box.length === 2; // also a box property
Run Code Online (Sandbox Code Playgroud)
For/ ofloops迭代所提供对象的iterable属性,因此只返回数组本身的值.这是因为Javascript中的对象可以定义它们应该如何迭代,并且Arrays将自己定义为基于而length不是键来迭代.
For/ inloops迭代所提供对象的可枚举属性.因为阵列的成员也是属性(a[0])你得到既您所指派的键/值对和阵列成员.
至于:
var b = [1,2,3,foo:"bar"]
它给了我意想不到的象征.为什么会这样?
那只是因为你写的是无效的Javascript.在创建数组时,无法定义数组的名称/值属性,只能定义其成员.要创建数组(使用正确的[thing1, thing2, thing3]语法),必须添加属性.
如果要简单地向新数组添加属性,可以使用Object.assign:
var b = Object.assign([1,2,3], {foo: "bar"});
Run Code Online (Sandbox Code Playgroud)
换句话说,首先创建一个数组,[1,2,3]然后将第二个参数({foo: "bar"})的属性赋值给它......并且因为该对象中只有一个属性相当于向foo: 'bar'数组添加"属性".