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以及符合复制元素长度的集合。粘贴替换。 ```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){

    1. var arr = this,
    2. len = arr.length,
    3. tar = target < 0? 0 : target >>> 0,
    4. end = arguments[2] || len,
    5. sliceArr =[],
    6. saItem,
    7. saLen = 0;
    8. start = start < 0 ? Math.max(start + len,0)
    9. : Math.min(start,len);
    10. end = end < 0 ? Math.max(end + len,0)
    11. : Math.min(end,len);
    12. if(end - start < 0){
    13. return arr;
    14. }
    15. sliceArr = arr.slice(start,end);
    16. saLen = sliceArr.length;
    17. for(var i = 0; i < saLen; i++){
    18. if(tar > len - 1){
    19. break;
    20. }
    21. saItem = sliceArr[i];
    22. arr[tar] = saItem;
    23. tar ++;
    24. }
    25. // sliceArr = arr.slice(start,end); 2,4
    26. return arr;
    27. // [1,2,3,4,5];

    }

    1. Array.prototype.tMyCopyWithin = function(target,start){
    2. if(this==null){
    3. throw TypeError('this is null or undefined');
    4. }
    5. var obj = Object(this),// 包装一下
    6. len = obj.length >>> 0,
    7. end = arguments[2],
    8. count = 0,
    9. dir = 1;
    10. // tips target >> n 表示将二进制target 向右移动 n位 n<32
    11. target = target >> 0;
    12. target = target < 0 ?
    13. Math.max(target + len, 0) : // 小于0 取 0 和 target 的最大值 最小范围[0,target+len]
    14. Math.min(target, len) // 大于0 取 len 和 target 的最小值[target,len]
    15. start = start ? start >> 0 : 0; //start 是否存在
    16. start = start < 0 ?
    17. Math.max(start + len, 0) :
    18. Math.min(start, len);
    19. end = end ? end >> 0 : 0;
    20. end = end < 0 ?
    21. Math.max(end + len, 0) :
    22. Math.min(end, len);
    23. count = Math.min(end - start, len - target); //比较值 需要替换的位数。
    24. if(start < target && target < (start + target)){
    25. dir = -1;
    26. start += count - 1; // 3
    27. }
    28. // [1, 2, 3, 4, 5]; copyWithin: [2,1,4] count: 3
    29. // [1, 2, 2, 3, 4];
    30. while(count > 0){
    31. if(start in obj){
    32. obj[target] = obj[start];
    33. }else{
    34. delete obj[start];
    35. }
    36. target += dir;
    37. start += dir;
    38. count--;
    39. }
    40. return obj;
    41. }

    ```