收藏
回答

js赋值错误

框架类型 问题类型 操作系统 工具版本
小程序 Bug Windows 1.02.1907300


代码原意只是将list1 复制为 list2,并修改  list2 [0].s_state 的值,但执行结果却同时将 list1 [0].s_state 的值也修改了

执行:

var list2 = this.data.list1

list2 [0].s_state = "red"

this.setData({list2})

结果:

this.data.list2 [0].s_state 及 this.data.list1 [0].s_state 两个值均被修改。





最后一次编辑于  2019-09-09
回答关注问题邀请回答
收藏

3 个回答

  • 更容易记住你🇨🇳
    更容易记住你🇨🇳
    2019-09-09

    这是js深拷贝典型应用场景,一般就跟楼上说的,使用JSON.parseJSON.stringify,建议百度一下js数据类型、数据结构相关资料

    2019-09-09
    有用
    回复
  • G-STEPS街舞工作室
    G-STEPS街舞工作室
    2019-09-09

    你的三行代码,实际上的效果就是如下 list2 和 list1 都指向的同一个对象

    this.data.list1[0].s_state = "red"
    this.data.list2 = this.data.list1


    2019-09-09
    有用
    回复 3
    • Chris(绿化芒)
      Chris(绿化芒)
      2019-09-09
      可我只想改list2 不需要改list1呀
      2019-09-09
      回复
    • G-STEPS街舞工作室
      G-STEPS街舞工作室
      2019-09-09
      var list2 = JSON.parse(JSON.stringify(this.data.list1));
       
      list2 [0].s_state = "red"
       
      this.setData({list2})


      如果 list1 数据量不大,想实现你想要的效果可以这样写, 主要是进行深拷贝

      2019-09-09
      1
      回复
    • Chris(绿化芒)
      Chris(绿化芒)
      2019-09-09回复G-STEPS街舞工作室
      非常感谢,您的方法非常成功。
      2019-09-09
      回复
  • 子不语
    子不语
    2019-09-09

    那个……bug在哪?

    2019-09-09
    有用
    回复 4
    • Chris(绿化芒)
      Chris(绿化芒)
      2019-09-09
      代码原意只是将list1 复制为 list2,并修改 list2 [0].s_state 的值,但执行结果却同时将 list1 [0].s_state 的值也修改了
      2019-09-09
      回复
    • 子不语
      子不语
      2019-09-09回复Chris(绿化芒)
      数组是拷贝,其实共用一个内存,建议深度克隆
      2019-09-09
      1
      回复
    • Chris(绿化芒)
      Chris(绿化芒)
      2019-09-09
      非常感谢,成功了!
      2019-09-09
      回复
    • 子不语
      子不语
      2019-09-09回复Chris(绿化芒)
      嗯嗯,恭喜
      2019-09-09
      回复
登录 后发表内容
问题标签