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 数组的本质
由伪数组的问题引出真正的数组应该具备什么特点
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。