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

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

今天提交代码的时候,发现测试用例只跑通了 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"]

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬不萌只是酸i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值