稀疏数组

1.稀疏数组

1.1创建一个指定长度的稀疏数组

  • new创建
    var a = new Array();
    >>(3)[empty X3]

    a.length
    >>3
    
    a[0]
    >>undefined
    
  • 赋值创建
    var a = [];
    a[0] = 0;
    a[100] = 100;
    >>(101) [0,emptyx99,100]1.2

1.2稀疏数组遍历,跳过empty

实际上,JavaScript并没有常规的数组,所有的数组其实就是个对象,只不过会自动管理一些"数字"属性和length属性罢了.说的更直接一点,JavaScript中的数组根本没有索引,因为索引应该是数字,而JavaScript中数组的索引其实是字符串.arr[1]其实就是arr["1"],给arr["1000"] = 1,arr.length也会自动变为1001.这些表现的根本原因就是,JavaScript中的对象就是字符串到任意值的键值对.注意键只能是字符串

a = new Array(10);
a.forEach(val=>{
    console.log(val)
})
>>undefined

2.密集数组

2.1一般

var a = Array.prototype.apply(null,Array(3));
a
>>[undefined,undefined,undefined]

等价于Array(undefined,undefined,undefined)

2.2高级技巧

Array.apply(null, Array(3)).map(Function.prototype.call.bind(Number))//晦涩难懂,建议封装
>>[0,1,2]

//等同于
Array.apply(null, Array(3)).map(Function.prototype.call,Number)//

2.3生成指定长度的数组

建议将上述封装

var _range = function(num){
    return Array.apply(null,Array(num)).map(Function.prototype.call,Number)
}
_range(3)
>>[0,1,2]

与map搭配使用,双剑合璧

_range(3).map(function () { return "a" })
>> ["a","a","a"]

自定义的函数虽然清晰,但是不如原生方法快

var a = ["aaa  ", "  bbb", "  ccc  "]

a.map(function(x) { return x.trim(); });               // ['aaa', 'bbb', 'ccc']
a.map(Function.prototype.call, String.prototype.trim); // ['aaa', 'bbb', 'ccc']

3.总结

数组的索引是字符串

你可能感兴趣的:(稀疏数组)