代码实现如下:
Array.prototype.slice=function(start,end){ //ES5 中的数组方法slice的底层内部实现
var result = new Array(); //新数组
var start = start || 0;
var end = end || this.length; //this指向调用的对象,用了call之后,改变this的指向,指向传进来的对象
for(var i=start; i<end; i++){
result.push(this[i]);
}
return result; //返回的为一个新的数组
}
拓展:
slice()方法可以将伪数组转化为真数组,一般用法如下所示:
//此处obj就是伪数组,通过call改变this指向,使其指向obj,slice会返回一个新的数组,就是真数组
var arr = Array.prototype.slice.call(obj)
除了slice()方法可以将伪数组转化为真数组之外,以下几种方式也可以将伪数组转化为真数组
- 声明一个空数组,通过遍历伪数组将其值重新添加到新的空数组中并返回(一般这种方式不用讲了)
- jQuery里的toArray()方法也可以将伪数组转化为真数组,其底层实现实际上使用的是数组的slice方法
- ES6中的扩展运算符(…)也可以将某些数据结构转为数组,扩展运算符背后调用的是遍历器接口(Symbol.iterator),如果一个对象没有部署这个接口,就无法转换。用法如下:
let arr = [...obj] //此处obj是伪数组
//扩展运算符将伪数组转化为真数组的条件除了伪数组要具有length属性之外,还必须要有内容值存在,否则无法转化
- ES6中的新方法from(),任何有length属性的对象,都可以通过Array.from方法转为数组,而此时扩展运算符就无法转换。用法如下:
let arr = Array.from(obj); //此处obj就是伪数组
ES6中Array.from()方法拓展:
Array.from()方法除了可以将伪数组转化为真数组之外,还提供了map功能,它可以接收第二个参数,对每个元素进行处理,将处理之后的结果放到返回的新数组当中,具体用法如下:
Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);
Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]
应用场景:
Array.from({ length: 2 }, () => 'jack')
// ['jack', 'jack']
上面代码中,Array.from的第一个参数指定了第二个参数运行的次数。这种特性可以让该方法的用法变得非常灵活。
Array.from()的另一个应用是,将字符串转为数组,然后返回字符串的长度。因为它能正确处理各种 Unicode 字符,可以避免 JavaScript 将大于\uFFFF的 Unicode 字符,算作两个字符的 bug。