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.