[聚合文章] JavaScript标准库之数组

JavaScript 2016-11-21 11 阅读
new Array(-1)VM376:1 Uncaught RangeError: Invalid array length    at <anonymous>:1:1(anonymous) @ VM376:1new Array(3.2)VM377:1 Uncaught RangeError: Invalid array length    at <anonymous>:1:1(anonymous) @ VM377:1
  • 1.2.7 数组定义的正确方法

综上所述,其实实际中直接用字面量定义数组

var arr = ['这样子', '定义', 'is', true, 1, {'good': '我是数组索引为5的元素的值'}]undefinedarr(6) ["这样子", "定义", "is", true, 1, {…}]    0: "这样子"    1: "定义"    2: "is"    3: true    4: 1    5: {good: "我是数组索引为5的元素的值"}    length: 6    __proto__:Array(0)

2. 数组的length属性解疑

如果你是初学者,一定要记住数组的length属性和里面有几个元素无关,爱几个元素几个元素,length并不是计数的作用。这是我自学是对数组长度最大的误解。
正确的理解是:数组的length属性等于最大正整数索引+1
而,数组的索引可以随便改变,那么length属性也是一个动态的值,可以变化。

var arr = []undefinedarr[]    length:0    __proto__:Array(0)arr[10] = '我是第10个元素,我前面没有元素,但是数组的长度绝对是11,你信不信'"我是第10个元素,我前面没有元素,但是数组的长度绝对是11,你信不信"arr(11) [empty × 10, "我是第10个元素,我前面没有元素,但是数组的长度绝对是11,你信不信"]    10:"我是第10个元素,我前面没有元素,但是数组的长度绝对是11,你信不信"    length:11    __proto__:Array(0)

这个例子一开始是个空数组,长度是0,直接给他一个索引10,可以发现长度立马变为11。

arr[100] = '这次数组长度绝对是101'"这次数组长度绝对是101"arr.length101

通过以上的例子,我们反向推理,把可以明白数组长度根本不连续,是动态变化的,即数组长度是可写的。唯一的不变真理是,它的长度永远等于最大索引+1。

2.1 把数组清空的方法

有以上知识可以知道数组长度可以人为改变,进而大胆的猜想,改变长度会不会把数组清空呢?

var arrDemo = ['this', 'is', 'test']undefinedarrDemo(3) ["this", "is", "test"]    0: "this"    1: "is"    2: "test"    length: 3    __proto__: Array(0)arrDemo['length'] = 22arrDemo(2) ["this", "is"]    0: "this"    1: "is"    length: 2    __proto__: Array(0)arrDemo['length'] = 11arrDemo["this"]    0: "this"    length: 1    __proto__: Array(0)arrDemo['length'] = 00arrDemo[]    length: 0    __proto__: Array(0)

把数组length设为0,证明可以清空数组。

2.2 有趣的一点

由于数组本质上是对象的一种,所以我们可以为数组添加属性,但是这不影响length属性的值。
一定不要有思维定式,以为添加几个新元素,长度就会加几个。

var arr = []undefinedarr[]    length:0    __proto__:Array(0)arr['add'] = '我加一个新元素,长度绝对还是0'"我加一个新元素,长度绝对还是0"arr[add: "我加一个新元素,长度绝对还是0"]    add: "我加一个新元素,长度绝对还是0"    length:0    __proto__:Array(0)arr['add1'] = '我又加一个新元素,长度绝对还是0'"我又加一个新元素,长度绝对还是0"arr[add: "我加一个新元素,长度绝对还是0", add1: "我又加一个新元素,长度绝对还是0"]    add: "我加一个新元素,长度绝对还是0"    add1: "我又加一个新元素,长度绝对还是0"    length: 0    __proto__:Array(0)

通过这个例子,一开始元素长度为0,只要你没添加一个正整数的索引,无论你添加多少其他元素,长度永远不会变化。

  • 注意:方括号运算符里面一定要用引号,我总是手抖忘了加。

3. 伪数组(array-like object)

如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”

var obj = {    0: 'a',    1: 'b',    2: 'c',    length: 3,}undefinedobj{0: "a", 1: "b", 2: "c", length: 3}    0: "a"    1: "b"    2: "c"    length: 3    __proto__: Objectobj[0]"a"obj[2]"c"

上面的对象,看着结构特别像但是绝对不是数组。
因为proto指向的就不是Array的prototype,没有指向Array的共有属性,再怎么想也只是模仿,本质不同。不具备数组的其他方法(第四部分将要列举的方法)。

3.1 数组的本质

由伪数组的问题引出真正的数组应该具备什么特点

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。