据说javascript中的所有内容都是一个对象.因此,为了详细了解这个概念,我编写了以下代码,但得到了一些意想不到的结果.
var color = [];
console.log(color.constructor === Array);
color[color['purple'] = 2] = 'green';
console.log(color);
console.log(color.constructor === Array);
console.log(Array.isArray(color));Run Code Online (Sandbox Code Playgroud)
根据我的理解,数组只能在其键为数字时保存值.要将键存储为字符串,我们使用对象.但是,上面的代码导致了这一点.
true
[ <2 empty items>, 'green', purple: 2 ]
true
true
Run Code Online (Sandbox Code Playgroud)
typeof color将导致object但这是所有阵列的一般情况.变量中purple: 2的有效元素如何color?不color应该是对象而不是数组?或者是否有任何其他内置方法可以检查变量是数组还是对象?
之前已经问过这些类型的问题,但情景有所不同.我找了这个具体案例,但没有得到任何令人满意的结果.
color是一个数组.所有数组都扩展对象.在这一行中你做了两件事(非常不寻常的语法,可能不是你想要的):
color[color['purple'] = 2] = 'green'
1:color.purple = 2不向数组添加元素.它设置了purple对象的属性color.
2:color[2] = green上面的赋值语句解析为(返回)值2.这意味着color[2]在这种情况下您要分配.
3:因为数组在索引2处具有值,所以它还具有为索引0和1分配的空间(两个空格)
整数属性是数组的元素.所有其他属性都是对所有对象都相同的常规属性.如果你看一下color.length你会看到在这种情况下是3 : [undefined, undefined, green]. 通过向数组添加其他属性,您基本上将数组接口扩展为自定义类似Array的对象.
请参阅此处的第二段:
数组不能使用字符串作为元素索引(如在关联数组中),但必须使用整数.使用括号表示法(或点表示法)通过非整数设置或访问不会从数组列表本身设置或检索元素,但会设置或访问与该数组的对象属性集合关联的变量.数组的对象属性和数组元素列表是分开的,并且数组的遍历和变异操作不能应用于这些命名属性.