有关 Array.prototype.slice() 方法的详解

Array.prototype.slice()

slice() 方法返回一个新的数组对象,这一对象是一个由 beginend 决定的原数组的浅拷贝(包括 begin,不包括 end),原始数组不会被改变

语法

	arr.slice([begin[, end]])

参数

begin 可选
  提取起始处的索引(从 0 开始),从该索引开始提取原数组元素。
  如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。
  如果省略 begin,则 slice 从索引 0 开始。
  如果 begin 超出原数组的索引范围,则会返回空数组。

end 可选
  提取终止处的索引(从 0 开始),在该索引处结束提取原数组元素。slice 会提取原数组中索引从 beginend 的所有元素(包含 begin,但不包含 end)。
  slice(1,4) 会提取原数组中从第二个元素开始一直到第四个元素的所有元素 (索引为 1, 2, 3 的元素)。
  如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2, -1) 表示抽取了原数组中的倒数第二个元素到最后一个元素不包含最后一个元素,也就是只有倒数第二个元素)。
  如果 end 被省略,则 slice 会一直提取到原数组末尾。
  如果 end 大于数组的长度,slice 也会一直提取到原数组末尾。

返回值

  一个含有被提取元素新数组

描述

  slice 不会修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。原数组的元素会按照下述规则拷贝:

  • 如果该元素是个对象引用 (不是实际的对象),slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
  • 对于字符串、数字及布尔值来说(不是 String、Number 或者 Boolean 对象),slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。

如果向两个数组任一中添加了新元素,则另一个不会受到影响。

示例

返回现有数组的一部分

		var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];
		var citrus = fruits.slice(1, 3);
		
		// fruits contains ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']
		// citrus contains ['Orange','Lemon']

使用 slice
  在下例中,slicemyCar 中创建了一个新数组 newCar。两个数组都包含了一个 myHonda 对象的引用。当 myHondacolor 属性改变为 purple,则两个数组中的对应元素都会随之改变。

		// 使用 slice 方法从 myCar 中创建一个 newCar。
		var myHonda = { color: 'red', wheels: 4, engine: { cylinders: 4, size: 2.2 } };
		var myCar = [myHonda, 2, "cherry condition", "purchased 1997"];
		var newCar = myCar.slice(0, 2);
		
		// 输出 myCar、newCar 以及各自的 myHonda 对象引用的 color 属性。
		console.log(' myCar = ' + JSON.stringify(myCar));
		console.log('newCar = ' + JSON.stringify(newCar));
		console.log(' myCar[0].color = ' + JSON.stringify(myCar[0].color));
		console.log('newCar[0].color = ' + JSON.stringify(newCar[0].color));
		
		// 改变 myHonda 对象的 color 属性.
		myHonda.color = 'purple';
		console.log('The new color of my Honda is ' + myHonda.color);
		
		//输出 myCar、newCar 中各自的 myHonda 对象引用的 color 属性。
		console.log(' myCar[0].color = ' + myCar[0].color);
		console.log('newCar[0].color = ' + newCar[0].color);

  上述代码输出:

		 myCar = [{color: 'red', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2,
		       'cherry condition', 'purchased 1997']
		newCar = [{color: 'red', wheels: 4, engine: {cylinders: 4, size: 2.2}}, 2]
		 myCar[0].color = red
		newCar[0].color = red
		The new color of my Honda is purple
		 myCar[0].color = purple
		newCar[0].color = purple

类数组(Array-like)对象

  slice 方法可以用来将一个类数组(Array-like)对象/集合转换成一个新数组。你只需将该方法绑定到这个对象上。 一个函数中的 arguments 就是一个类数组对象的例子。

		function list() {
		  return Array.prototype.slice.call(arguments);
		}
		
		var list1 = list(1, 2, 3); // [1, 2, 3]

  除了使用 Array.prototype.slice.call(arguments),你也可以简单的使用 [].slice.call(arguments) 来代替。另外,你可以使用 bind 来简化该过程。

		var unboundSlice = Array.prototype.slice;
		var slice = Function.prototype.call.bind(unboundSlice);
		
		function list() {
		  return slice(arguments);
		}
		
		var list1 = list(1, 2, 3); // [1, 2, 3]

转载自 MDN Web Doc 的文章 Array.prototype.slice()

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值