07/21
2018
以前没试过这玩意,今天刷题遇到了,于是去了解了这方面的知识。
var arr=[]; arr.foo=2; arr['aa']=3; arr[0]=1; console.log(arr.length); // 1 // [1, foo: 2, aa: 3]
数组用字符串做下标是可以的,但是有一些坑要注意:
字符串下标其实是给这个 Array 对象添加了属性(因为Array 也是 object)。
字符串本质是对象的属性,所以无法用数字序号取出来,也不会被普通 for、forEach、for of 循环访问到。可以用 for in 访问,因为 for in 使用了 key 来访问属性。(这是个潜在的坑)
也不能用一些数组方法对这些属性操作,如 shift()、pop()。
字符串属性都是在数组最末尾的,在数字下标之后。这可能是因为普通的下标是数字,排序在字符串之前,所以显示出来看就是字符串的下标在最后了。
另外,用属性方式添加数组的值的话,非正整数的都会成为属性,如:
var aa = []; aa['1'] = 1; // 数字下标 1 aa['-1'] = -1; // 字符串下标 aa[-2] = -2; // 字符串下标 // [empty, 1, -1: -1, -2: -2]
正整数的属性都是数字下标,非正整数的都是字符串下标了。加不加引号都一样,并不是正整数加了引号就当字符串属性了。
说到for in、for each,难道length属性不是O(1)的吗w(゚Д゚)w