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,4return 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<32target = 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;}
```
