JS变量的赋值和引用
测试代码
<!DOCTYPE html>
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< title> JS Reference VS Copy</ title>
</ head>
< body>
< script>
let name = "Arvin"
let name2 = name
console. log ( name, name2)
name = '苹果'
console. log ( name, name2)
let number = 2
let number2 = number
console. log ( number, number2)
number = 4
console. log ( number, number2)
let bool1 = true
let bool2 = bool1
console. log ( bool1, bool2)
bool1 = false
console. log ( bool1, bool2)
const players = [ 'wes' , 'Sarah' , 'Ryan' ]
const team = players
team[ 3 ] = '修改了'
console. log ( players, team)
console. log ( players=== team)
const team2 = players. slice ( ) ;
const team3 = [ ... players]
console. log ( team2)
team2[ 4 ] = '我又修改了'
team3[ 4 ] = '我也修改了'
console. log ( players, team, team2, team3)
const person = {
name: "Wes Bos" ,
age: 22
}
const dev = person
dev. name = "小明"
console. log ( person, dev)
const dev2 = Object. assign ( { } , person, { name: '小王' } )
const dev3 = { ... person}
dev3. name = '小亮'
console. log ( person, dev2, dev3)
const author = {
name: 'Alice' ,
age: 34 ,
social: {
wechat: 'Alice Lala' ,
facebook: 'athor.alice'
}
}
const au2 = Object. assign ( { } , author)
const au3 = JSON . parse ( JSON . stringify ( author) )
console. log ( au2=== author)
au2. name = '王小明'
au2. social. wechat = 'Lala - Alice --check'
console. log ( author , au2)
console. log ( au2. social === author. social)
console. log ( au3. social === author. social)
const arr = [ 1 , 2 , 3 , 4 ]
function fn ( arr3) {
let arr2 = arr3
console. log ( arr === arr2)
console. log ( arr3 === arr2)
console. log ( arr3 === arr)
}
fn ( arr)
</ script>
</ body>
</ html>
总结
基本类型(boolean ,string,number)两种特殊数据类型(null, undefine),都是值传递。 两个引用类型(对象和数组)不采用特别的办法直接引用赋值的话,占用的堆内存是同一块 数组有Array.slice()方法和ES6的扩展运算符来开辟新的堆内存 对象有Object.assign()方法和扩展运算符来开辟新的堆内存 Object.assign()方法是浅层复制,如何对象内部还有对象,对象里面的对象的堆内存会被共享 可以使用JSON.parse(JSON.stringify())来实现深层复制