ES2015 (ES6) 出现
参数
- target
- 替换开始索引
- start
- 替换元素集合开始
- 闭距离
- 可选
- 替换元素集合开始
- end
- 替换元素集合开始
- 开距离
- 可选 ```javascript const arr = [1, 2, 3, 4, 5]; arr.copyWithin(0, 3, 4); // [4, 2, 3, 4, 5] // 1. 3 - 4 [3, 4) // 2. target 从 … 即被替换的开始 // 3. end > length - 1 取到末尾
- 替换元素集合开始
arr.copyWithin(5, 1, 2); // [1, 2, 3, 4, 5] // 4. target > length -1 不发生任何替换
arr.copyWithin(3, 1, 3); // [1, 2, 3, 2, 3] // 5. target > start 正常替换
arr.copyWithin(0, -3, -1); // [3, 4, 3, 4, 5] // 6. start或end是负数 start+length end+length
arr.copyWithin(3); // [1, 2, 3, 1, 2] // 7. 没有start和end 取整个数组元素 arr.copyWithin(1, 3); // [1, 4, 5, 4, 5] // 没有end 取start开始至数组末尾的元素 // copyWithin不改变数组长度
const newArr = arr.copyWithin(1, 3); newArr === arr //true // 8. 返回是原数组引用
相当于C++的memcpy,用于数组元素
1. 复制 (同一引用)
1. 全选target及符合复制的元素集合的长度元素集合
2. 粘贴
**this不一定非要指向一个数组,也可以指向一个对象**
```javascript
var obj = {
0: 1,
1: 2,
2: 3,
3: 4,
4, 5,
lenght: 5
}
const newObj = [].copyWithin.call(obj, 0, 2, 4);
/*
{
0: 3,
1: 4,
2: 3,
3: 4,
4, 5,
lenght: 5
}
*/
obj === newObj // true
polyfill
Array.protoype.myCopyWithin = function(target){
if(this == null){
throw new TypeError('this is null or not defined');
}
var obj = Object(this), //变为一个对象引用值
len = obj.length >>> 0, //保证是正整数,如果是非数字会为0
start = arguments[1],
end = arguments[2],
count = 0,
dir = 1;
target = target >> 0; //保证是整数
target = target < 0 ?
Math.max(len + target, 0) :
Math.min(target, len);
start = start ? start >> 0 : 0;
start = start < 0 ?
Math.max(len + start, 0) :
Math.min(start, len);
end = end ? end >> 0 : len;
end = end < 0 ?
Math.max(len + end, 0) :
Math.min(end, len);
count = Math.min(end - start, len - target);
if(start < target && target < (start + count)){
dir = -1;
start += count - 1;
target += count - 1;
}
while(count){
if(start in obj){
obj[target] = obj[start];
}else{
delete obj[target];
}
start += dir;
target += dir;
count --;
}
return obj;
}