Slice
slice()方法会浅复制(shallow copy)数组的一部分到一个新的数组,并返回这个新数组。
语法: arr.slice([begin[,end]])
参数
begin:
从该索引处开始提取原数组中的元素(从0开始)。
如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2)表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。
如果省略begin,则slice从索引0开始。
end
在该索引处结束提取原数组元素(从0开始)。slice会提取原数组中索引从begin到end的所有元素(包含begin,但不包含end)。slice(1,4)提取提取原数组中的第二个元素开始到第四个元素的所有元素(索引为1,2,3的元素)。 如果该参数为负数,则它表示在原数组中的倒数第几个元素结束抽取。slice(-2,-1)表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。
如果end被省略,则slice会一直提取到原数组末尾。
返回值:一个含有提取元素的新数组。
描述
slice不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。原数组的元素会按照下属规则拷贝:
1、如果该元素是个对象引用(不是实际的对象 ),slice会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原 来的数组中的这个元素也会发生改变。
2、对于字符串、数字及布尔值来说,slice会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或布尔值,将不会影响另一个数组。
如果向两个数组任一种添加了新元素,则另一个不会受到影响。
示例:
返回数组中的一部分:
var fruits=["Banana","Orange","Lemon","Apple","Mango"];
var citrus=fruits.slice(1,3);
// puts --> ["Orange","Lemon"]
使用 slice
在下例中, slice从
myCar中创建了一个新数组
newCar
.两个数组都包含了一个myHonda
对象的引用. 当myHonda
的color属性改变为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属性.
print("myCar = " + myCar.toSource());
print("newCar = " + newCar.toSource());
print("myCar[0].color = " + myCar[0].color);
print("newCar[0].color = " + newCar[0].color);
// 改变myHonda对象的color属性.
myHonda.color = "purple";
print("The new color of my Honda is " + myHonda.color);
//输出myCar, newCar中各自的myHonda对象引用的color属性.
print("myCar[0].color = " + myCar[0].color);
print("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)对象/集合转换成一个数组。你只需将该方法绑定到这个对象上。下述代码中 list 函数中的 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]