请教一下,怎么理解这段 JavaScript 代码?

2019-12-05 04:11:40 +08:00
 mskf
const main = ()=>{
    const a = ()=>{
        console.log("A")
    }

    const b = {
        a,
        s:1
    }
    fb(b)
    console.log(b.a)
}

const fb = (o)=>{
    const back = o.a
    o.a=null
    o=JSON.parse(JSON.stringify(o))
    o.a=back
    return o
}

main()


解释一下,fb 的作用是把对象中不能序列化的那部分暂存,序列化并复制到新对象后放回去

我知道这种深复制很耗性能,但问题在于,输出的永远是 null

更奇怪的是,在 fb 的返回处设置断点,可以看见 o.a 是我们的 function,但是返回上一个函数栈后,这个值突然就变空了

解决的办法是,把深复制去掉,或者是改成 b = f(b)

那么有没有比较官方的原因解释呢

3555 次点击
所在节点    JavaScript
7 条回复
jfcherng
2019-12-05 04:28:24 +08:00
你覺得 fb = (o) { o = {}; } 能把外部的 b 清空嗎
dartabe
2019-12-05 04:37:12 +08:00
const 声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。例如,在引用内容是对象的情况下,这意味着可以改变对象的内容(例如,其参数)。
mskf
2019-12-05 04:37:36 +08:00
@jfcherng 请你仔细看一下,解决问题的办法是把序列化和反序列化去掉,也就是说问题出在对象复制这里,值传递和引用传递这种问题我还是清楚的
mskf
2019-12-05 04:39:58 +08:00
@dartabe 没错,const 创建的对象可以改变自身的引用,但是请你仔细看一下,问题也不是出在变量声明上,无论使用的是 const 还是 var,结果都是一样的
jfcherng
2019-12-05 04:45:55 +08:00
當你決定做出 o = what_ever_expression; 的那刻, 這個 o 已經不是外部的 b 了
mskf
2019-12-05 04:51:54 +08:00
@jfcherng 不好意思是我理解的问题。。。这个帖子 over 了
luoh
2019-12-05 10:52:35 +08:00
b = fb(b)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/626068

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX