JS 解构赋值(浅拷贝)生成的新对象===源对象 为何是 false - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Stefango
V2EX    问与答

JS 解构赋值(浅拷贝)生成的新对象===源对象 为何是 false

  •  
  •   Stefango 2021-05-10 10:40:32 +08:00 2232 次点击
    这是一个创建于 1665 天前的主题,其中的信息可能已经有所发展或是发生改变。
    let a={age: 10} let b={...a} a===b // why false? 

    es 严格等于的规范文档: 7. Return true if x and y refer to the same object. Otherwise, return false.

    15 条回复    2021-05-10 20:30:38 +08:00
    Liam1997
        1
    Liam1997  
       2021-05-10 10:48:55 +08:00
    对象的引用不同
    Natsuno
        2
    Natsuno  
       2021-05-10 10:50:14 +08:00
    b 是一个新对象
    10bkill1p
        3
    10bkill1p  
       2021-05-10 10:50:15 +08:00   1
    你都说是新对象了
    codder
        4
    codder  
       2021-05-10 10:53:04 +08:00
    因为你只有一层所以浅拷贝就是 false 啊,展开操作符(...)和 Object.assign()是一样的效果
    shintendo
        5
    shintendo  
       2021-05-10 10:53:41 +08:00
    浅拷贝的浅,指的是:
    let a = {age: {num: 10}}
    let b = {...a}
    a.age === b.age //true

    但它仍然是“拷贝”,所以 a===b 肯定是 false
    7gugu
        6
    7gugu  
       2021-05-10 10:57:24 +08:00
    浅拷贝是只拷贝第一层的原始类型值,和第一层的引用类型地址。
    gdrk
        7
    gdrk  
       2021-05-10 11:03:03 +08:00
    浅拷贝也会生成新对象啊,只是只能拷贝一层而已。a 和 b 指向不同的对象地址,当然是 false
    des
        8
    des  
       2021-05-10 11:08:09 +08:00
    你自己都说了是新对象,怎么可能是一样的

    顺便判断是不是同一个对象请用 Object.is
    Object.is(-0, 0) // false
    Object.is(NaN, NaN) // true
    Stefango
        9
    Stefango  
    OP
       2021-05-10 11:10:57 +08:00
    @shintendo 谢谢指点
    otakustay
        10
    otakustay  
       2021-05-10 11:11:21 +08:00
    这就是标准的浅拷贝做法,你要是引用相等我们会很困扰的
    let a = {age: 10};
    let b = {...a};
    b.age = 21;
    console.log(a.age); // 应该是啥
    EPr2hh6LADQWqRVH
        11
    EPr2hh6LADQWqRVH  
       2021-05-10 12:23:16 +08:00
    现在是谁每天在提什么深浅拷贝的

    说克隆不好吗,

    克隆一个你,你和你的克隆是一回事吗,马上就理解了
    hanyceZ
        12
    hanyceZ  
       2021-05-10 13:36:31 +08:00   1
    KouShuiYu
        13
    KouShuiYu  
       2021-05-10 16:05:24 +08:00
    这样比较才有意义
    ```
    let a = {};
    let b = {_a:a};
    let _a = {...b}['_a'];
    a === _a; // true
    ```
    youmoo
        14
    youmoo  
       2021-05-10 17:15:27 +08:00
    你也可以这样烤(乱入 ):

    ```js
    let a={age: 10}
    let [b]=[a];
    a===b // this time it's true
    ```
    yaphets666
        15
    yaphets666  
       2021-05-10 20:30:38 +08:00
    你这已经是你理解的‘深拷贝了’
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     791 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 20:23 PVG 04:23 LAX 12:23 JFK 15:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86