ES2015 ES6
参数 target start end
- 区间 [start,end);
- target 是从…地方开始。
- end > this.length - 1的时候取到数组最后一位。
- target > this.length - 1的时候不发生替换
- 当target > start 正常替换
- start 或者 end 为负数的时候 start + this.length end + this.length
- 如果没有start 取整个数组的元素
不改变数组长度 - 返回的是数组的引用、
console.log(newArr === arr);true
全选target以及符合复制元素长度的集合。粘贴替换。 ```javascript var arr = [1, 2, 3, 4, 5]; // // 拷贝赋值。 target, start, end [start,end) // var newArr = arr.copyWithin(0,1,3); // [2, 3, 3, 4, 5];
// target = NaN; // [0,end - start) var newArr = arr.copyWithin(NaN,1,3);// [2, 3, 3, 4, 5]
// // start > 数组长度 end >数组长度 元素组保持不变 var newArr = arr.copyWithin(0,5,6); // [1, 2, 3, 4, 5]
// // start > end start < 数组长度 start 大于0 元素组保持不变 var newArr = arr.copyWithin(0,4,3) // [1, 2, 3, 4, 5]
// // start = undefined 元素组保持不变 var newArr = arr.copyWithin(0,undefined,3); // [1, 2, 3, 4, 5]
// // start = null 元素组保持不变 var newArr = arr.copyWithin(0,null,2); // [1, 2, 3, 4, 5]
// // end = null 元素组保持不变 var newArr = arr.copyWithin(1,1,null); // [1, 2, 3, 4, 5]
// // end = undefined [1,this.length) var newArr = arr.copyWithin(0,1,undefined); // [2, 3, 4, 5, 5]
// // 不写end 默认为 this.length;[3.this.length); var newArr = arr.copyWithin(0,3); // [4, 5, 3, 4, 5];
// // end = null 元素组保持不变 var newArr = arr.copyWithin(0,3,null); // [1, 2, 3, 4, 5]
// // end = undefined [3,this.length) var newArr = arr.copyWithin(0,3,undefined); // [4, 5, 3, 4, 5]
// // end = null NaN 元素组保持不变 var newArr = arr.copyWithin(0,3,NaN);
// // target = null 默认为 0 var newArr = arr.copyWithin(null,2,4); // [3, 4, 3, 4, 5]
// // target = undefined 默认为 0 var newArr = arr.copyWithin(undefined,2,4); // [3, 4, 3, 4, 5]
// // target = NaN 默认为0 var newArr = arr.copyWithin(NaN,2,4); // [3, 4, 3, 4, 5]
// // target = 字符串 默认为0 var newArr = arr.copyWithin(‘abc’,2,4); // [1, 2, 3, 4, 5]
// // target = number var newArr = arr.copyWithin(‘1’,2,4); // [1, 3, 4, 4, 5]
// // target >= this.length;
var newArr = arr.copyWithin(5,2,4); // [1, 2, 3, 4, 5]
// console.log(newArr);
//
//
// 总结
// copyWithin es2015 es6
// 参数 target start end
// 1. 区间 [start,end);
// 2. target 是从…地方开始。
// 3. end > this.length - 1的时候取到数组最后一位。
// 4. target > this.length - 1的时候不发生替换
// 5. 当target > start 正常替换
// 6. start 或者 end 为负数的时候 start + this.length end + this.length
// 7. 如果没有start 取整个数组的元素
// 不改变数组长度
// 8. 返回的是数组的引用、
// console.log(newArr === arr);true
// 全选target以及符合复制元素长度的集合。粘贴替换。
//
//
// 重写copyWithin
Array.prototype.myCopyWithin = function(target,start){
var arr = this,
len = arr.length,
tar = target < 0? 0 : target >>> 0,
end = arguments[2] || len,
sliceArr =[],
saItem,
saLen = 0;
start = start < 0 ? Math.max(start + len,0)
: Math.min(start,len);
end = end < 0 ? Math.max(end + len,0)
: Math.min(end,len);
if(end - start < 0){
return arr;
}
sliceArr = arr.slice(start,end);
saLen = sliceArr.length;
for(var i = 0; i < saLen; i++){
if(tar > len - 1){
break;
}
saItem = sliceArr[i];
arr[tar] = saItem;
tar ++;
}
// sliceArr = arr.slice(start,end); 2,4
return arr;
// [1,2,3,4,5];
}
Array.prototype.tMyCopyWithin = function(target,start){
if(this==null){
throw TypeError('this is null or undefined');
}
var obj = Object(this),// 包装一下
len = obj.length >>> 0,
end = arguments[2],
count = 0,
dir = 1;
// tips target >> n 表示将二进制target 向右移动 n位 n<32
target = target >> 0;
target = target < 0 ?
Math.max(target + len, 0) : // 小于0 取 0 和 target 的最大值 最小范围[0,target+len]
Math.min(target, len) // 大于0 取 len 和 target 的最小值[target,len]
start = start ? start >> 0 : 0; //start 是否存在
start = start < 0 ?
Math.max(start + len, 0) :
Math.min(start, len);
end = end ? end >> 0 : 0;
end = end < 0 ?
Math.max(end + len, 0) :
Math.min(end, len);
count = Math.min(end - start, len - target); //比较值 需要替换的位数。
if(start < target && target < (start + target)){
dir = -1;
start += count - 1; // 3
}
// [1, 2, 3, 4, 5]; copyWithin: [2,1,4] count: 3
// [1, 2, 2, 3, 4];
while(count > 0){
if(start in obj){
obj[target] = obj[start];
}else{
delete obj[start];
}
target += dir;
start += dir;
count--;
}
return obj;
}
```