数组如何给数组赋值呢。嗯,看似小问题。

这么问题看似很简单,但是并不是很简单。(可能只是针对我一个人而言吧,哈哈哈哈,进入正题)。

今天提交代码的时候,发现测试用例只跑通了 66.7%。我当时在本地测试时可以的,我还有点儿纳闷,于是,重新捋了一遍代码,嗯嗯...发现,是数组给数组赋值的时候出了点儿问题。

错误代码:(测试用例跑通了66.7%)

function append(arr, item) {
    var newArr = arr;
    newArr.push(item);
    return newArr
}

正确代码:(测试用例跑通了100%)

function append(arr, item) {
    var newArr = JSON.parse(JSON.stringify(arr))
    newArr.push(item);
    return newArr;
}

上面两段代码的区别就是给数组赋值的时,是不一样的。

(1)使用 =  来赋值的,是通过浅拷贝来赋值的。

(2)通过JSON.parse(JSON.stringify(arr)) 来赋值的, 是先转换成字符串,再转换成数组,是通过深拷贝来完成的。

=================下面说下数组中的【深拷贝】和【浅拷贝】的问题(有错误的可以指出来奥)=============

实现数组的深拷贝有如下几种方法:

深拷贝完成后,再次去修改原数组,拷贝得到的数组值是不会变化的。

浅拷贝则会跟着原数组变化。

(一)for循环来实现数组的深拷贝。

// 7.数组的深拷贝(for循环来完成)
var old_arr = [11, 22, 33, 44, 55, 66];
var new_arr = copyArr(old_arr);

function copyArr(arr) {
    var newArr = [];
    for (var i = 0; i < arr.length; i++) {
        newArr.push(arr[i]);
    }
    return newArr;
}
console.log(new_arr);   //拷贝结果: [11, 22, 33, 44, 55, 66]

(二)slice() 实现数组的深拷贝。

var arr_old = [111,222,333,444,555]
var arr_new = arr_old.slice(0);    // slice(0)  从0开始选,一直到结尾
      
// 测试:原数组改变.会影响深拷贝数组么?(不会影响)
arr_old[5] = 'aaa';
console.log(arr_new);   //  [111, 222, 333, 444, 555]
console.log(arr_old);   //  [111, 222, 333, 444, 555, "aaa"]

(三)concat() 实现数组的深拷贝。

var arr = [11,22,33,44,55]
var arr2 = arr.concat()
console.log(arr2)   //  [11, 22, 33, 44, 55]

// 测试:如果改变原数组,看深拷贝的数组是否会发生变化呢(答案是不会发生变化的,只有原数组会发生变化)
arr[5] = 10;   // 改变原数组 
console.log(arr);   // 原数组被改变了  [11, 22, 33, 44, 55, 10]
console.log(arr2);   // 深拷贝的数组没有改变   [11, 22, 33, 44, 55]

(四)ES6 实现数组的深拷贝。

var arr3 = ['aa','bb','cc','dd'];
var [...arr4] = arr3;
console.log(arr4);
      
// 测试:原数组改变.会影响深拷贝数组么?(不会影响)
arr3[1] = 'oooo';
console.log(arr3);    // ["aa", "oooo", "cc", "dd"]
console.log(arr4);    //  ["aa", "bb", "cc", "dd"]

(五)使用JSON.parse( JSON.stringigy( ) ) 实现数组的深拷贝。

var arr5 = ['a','b','c','d','e'];
var arr6 = JSON.parse(JSON.stringify(arr5));
      
// 测试:原数组改变.会影响深拷贝数组么?(不会影响)
arr5[2] = 0;
console.log(arr5);    //  ["a", "b", 0, "d", "e"]
console.log(arr6);    //  ["a", "b", "c", "d", "e"]

-------------大概就是这些了。

你可能感兴趣的:(前端,数组的深拷贝)