End.

JavaScript变量的传值和传址

在我们开发的时候,想要使用同一份一样的基础数据。例如:

let studentData = [
      { name: '张三', age: 16 },
      { name: '李四', age: 17 },
      { name: '黄五', age: 18 }
]
let studentDataBack = studentData studentDataBack[0].name = '赵六' console.log(studentDataBack) console.log(studentData)

输出结果发现,studentData的值也发生了变化。

这就是因为 "let studentDataBack = studentData" 是一个传址操作。即引用的地址是同一个,那么任意修改studentData还是studentDataBack,地址数据就会被修改。


那么想要正常传值呢?

let studentData = [
      { name: '张三', age: 16 },
      { name: '李四', age: 17 },
      { name: '黄五', age: 18 }
]

let studentDataBack = JSON.parse(JSON.stringify(studentData))
studentDataBack[0].name = '赵六'
console.log(studentDataBack)
console.log(studentData)

重点:使用JSON.stringfy转为字符串后,再使用JSON.parse转为新的对象。

这是因为字符串类型是一个传值类型,所以最后会创建新的地址存储数据。

备注:也可以使用ES6新语法,扩展运算符。参考《JS中三个点(...)是什么东西?


课后理解

传值指的是在对变量赋值时,是对原始数据进行了拷贝。

拷贝数据与原始数据是相互独立互不影响的。

对赋值后的数据进行修改,修改的只是拷贝的数据,对原始数据没有影响。

根据数据的操作方式不同,可以将数据分为两大类型:基础类型和引用类型。
基础类型(传值):number类型、boolean类型、string类型
引用类型(传址):array类型、object类型、function类型

End.