为什么我在运行此函数时更改作为参数传递的变量的值?

Why I change the value of variable which I passed as parameter when I run this function?

提问人:Junshi Wang 提问时间:8/26/2020 更新时间:8/26/2020 访问量:31

问:

function radarconstructor(radar,j){
  let r = radar
  if(j==0){
    r.center[0] = "10%"
  }
  if(j==1){
    r.center[0] = "30%"
  }
  if(j==2){
    r.center[0] = "50%"
  }
  return(r)
}

var radarradar = {
  // shape: 'circle',
  center:["10%","50%"],//put the radar chart in center
  radius: "50%",
  name: {
    textStyle: {
        color: '#fff',
        backgroundColor: '#999',
        borderRadius: 3,
        padding: [3, 5]
    }
  },
  axisLine: {   
    lineStyle: {
        color: 'rgba(100, 100, 100, 0.15)'
    }
},
splitLine: {
    lineStyle: {
        color: 'rgba(255, 255, 255, 0.1)'
    }
},
 
  indicator: [
      { name: 'Dimension1', max: 3},
      { name: 'Dimension2', max: 3},
      { name: 'Dimension3', max: 3},
      { name: 'Dimension4', max: 3},
      { name: 'Dimension5', max: 3},
  ]
}

雷达构造函数(radarradar,1) console.log(radarradar.center) #this 然后显示 [“30%”, “50%”]

我检查了 Js 没有通过引用传递,所以我真的很困惑。 如果您回答这个问题,请提前致谢!!

JavaScript 函数 变量参数 按引用传递

评论

1赞 Taplar 8/26/2020
更改将保留在方法之外,因为您正在更改传入的元素的属性。r.center
0赞 Pipetus 8/26/2020
这个答案对你有帮助吗?

答:

0赞 altruios 8/26/2020 #1

因此,每个对象都由引用传递。基元甚至被“包装”在函数和默认属性(如 .toString() 或 .length )的对象处理程序中......区别在于基元被视为复制到新对象中的值,而常规对象/函数则通过其引用传递。因此,在修改对象时 - 请记住,它们总是通过引用传递的。

如果要从对象中获取数据,则可以使用[Property1,Propert2] = Radar解构模式,从对象中提取基元,而不是直接修改对象。 正在制作一个新对象 - Object.from(radar)。

如今,突变是不受欢迎的 - 因为每个人都是关于功能风格和不变性的。

评论

1赞 Junshi Wang 8/26/2020
哇,我明白了,这真的很有帮助。谢谢!!