js的slice( )函数和浅复制

发布于 2022-09-03 14:46:07 字数 815 浏览 17 评论 0

1.问题

我有一个数组,希望分多次遍历它们,想借助slice()函数在每次遍历前,得到一些连续的数组元素。

slice()官方文档说:

slice() 方法会浅复制(shallow copy)数组的一部分到一个新的数组,并返回这个新数组。

这里说的浅复制该怎样理解?

2.代码

比如我的代码:

var a = ["php", "python", "java", "c++", "matlab", "ruby", "R", "julia"]
var b = a;     // 个人认为这个是“浅复制”
b === a    // true

var c = a.slice()

// 看了下c的内容:
c
["php", "python", "java", "c++", "matlab", "ruby", "R", "julia"]

c === a    // false  为什么是false呢,slice()不是返回浅复制吗?

我对“浅复制”的理解是“赋予相同的内存地址”,所以b===atrue,但是c===a为什么不是true呢,slice()返回的不是浅复制吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

依 靠 2022-09-10 14:46:07

这个浅复制指的是元素的浅复制, 而不是整个数组的浅复制啊. 数组还是新的, 和原来不是一个

凯凯我们等你回来 2022-09-10 14:46:07

数组是引用数据类型,由于b引用的是a,所以 b===a 返回true,a.slice()生成的是一个新数组,虽然表面上每个数组元素与a的一样,但本质上已经和a没有联系,而这个新数组被 c 引用,所以 c===a 返回false。

紫罗兰の梦幻 2022-09-10 14:46:07

很明显,你对“浅复制”的理解是错误的。

  1. slice()方法会浅复制(shallow copy)数组的一部分到一个新的数组,并返回这个新数组。
    这个方法会返回一个新数组,出来的结果当然和原来的数组不同。所以,c === a肯定是false

  2. 所谓浅复制,是指这样的情况:

    Array.clone = function(arr) {
        const ans = [];
        for(let i = 0; i < arr.length; i++) {
            ans[i] = arr[i];
        }
        return(ans);
    }
    
    let a = [1,2,3,[4,5,6],[7,8,9]],
        b = Array.clone(a);
    
    console.log(a === b);            //false
    console.log(a[3]);               //[4,5,6]
    console.log(a[3] === b[3]);      //true
    console.log(a[4] === b[4]);      //true
  3. 所谓深复制是这样的:

    Array.clone = function(arr) {
        const ans = [];
        for(let i = 0; i < arr.length; i++) {
            if(arr[i].length) {
                ans[i] = Array.clone(arr[i]);
            } else {
                ans[i] = arr[i];
            }
        }
        return(ans);
    }
    
    let a = [1,2,3,[4,5,6],[7,8,9]],
        b = Array.clone(a);
    
    console.log(a === b);            //false
    console.log(a[3]);               //[4,5,6]
    console.log(a[3] === b[3]);      //false
    console.log(a[4] === b[4]);      //false
策马西风 2022-09-10 14:46:07

数组是特殊的对象,两个数组就是两个对象,所以不能单看值相等就认为相等了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文