Array.prototype.slice.call()

Array.from()讲一个类数组(伪数组)转为一个数组

类数组

​ (1)拥有length属性,其他属性(如索引)为非负整数,(对象中的索引会被当做字符串来处理);

​ (2)不具有数组所具有的方法;

const arrLike = { 0: 'foo', 1: 'too', 2: 'baz', length: 3 };
const arr = Array.prototype.slice.call(arrLike);
//   注:类数组转换为数组首先Array.prototype,slice.call(arguments)的结果是将arguments对象转换为一个Array对象,在后面可以直接调用数组所具有的方法;
const newArr = Array.from(arrLike);
const newArr2 = [].slice.call();
console.log(arr, newArr, newArr2);	// ["foo", "too", "baz"], ["foo", "too", "baz"], ["foo", "too", "baz"]
console.log(arrLike); 	// {0: "foo", 1: "too", 2: "baz"}

// 1. Array.prototype.slice():slice()方法 提取字符串中的某个部分,返回一个新字符串(被提取的部分);
// 2. Array.slice ():返回一个新数组,包含从 start 到 end (不包含结束位置)的元素;
  	// (1). slice()方法不会修改原数组,若想删除数组汇总的一段元素,使用Array.splice()方法;

Array.prototype.slice()方法

(1)Array.prototype.slice()方法表示数组原型中的slice方法,注意这个slice方法返回的是一个Array类型的对象;

// slice的内部实现
Array.prototype.slice = function (start,end) {
    let result = new Array();
    start = start || 0;
    end = end || this.length;  // this指向调用的对象,当用了call后,改变了this的指向,也就是指向传进来的对象,这是关键
    for (let i = start; i < end; i++) {
        result.push(this[i]);
    }
    return result;
}

(2)能调用call()的只有方法,所以不能使用[].call()这种形式,得用[].slice,而call的第一个参数表示真正调用slice的环境变为了arguments对象,所以就好像arguments具有了数组的方法;

(3)通用直接转为数组:Array.from()

类数组和数组的区别

  1. instanceof
  2. constructor
  3. toString()
  4. isArray()

你可能感兴趣的:(javascript,前端)