每日一练 JS30天挑战 JS变量的赋值和引用

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)//Arvin Arvin
    name = '苹果'
    console.log(name,name2)//苹果 Arvin

    let number = 2
    let number2 = number
    console.log(number,number2)//2 2
    number = 4
    console.log(number,number2)//4 2

    let bool1 = true
    let bool2 = bool1
    console.log(bool1,bool2)//true true
    bool1 = false
    console.log(bool1,bool2)//false true

    
    const players = ['wes','Sarah','Ryan']
    const team = players
    team[3] = '修改了'
    console.log(players,team)//相同 同一块堆内存
    console.log(players===team)//true

    const team2 = players.slice();
    //ES6展开操作符
    const team3 = [...players]
    console.log(team2)
    team2[4] = '我又修改了'
    team3[4] = '我也修改了'
    console.log(players,team,team2,team3)//team2、team3指向了一个新的堆内存

    const person = {
      name: "Wes Bos",
      age: 22
    }

    const dev = person
    dev.name = "小明"
    console.log(person,dev)//小明 22 小明 22
    const dev2 = Object.assign({},person,{name:'小王'})
    const dev3 = {...person}//展开操作符
    dev3.name = '小亮'
    console.log(person, dev2, dev3)//小明 22 小王 22 小亮 22
    
    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)//false
    au2.name = '王小明'
    au2.social.wechat = 'Lala - Alice --check'
    console.log(author , au2) //author.social === au2.social
    console.log(au2.social === author.social)//true
    console.log(au3.social === author.social)//false

    const arr = [1,2,3,4]
    function fn(arr3){
      let arr2 = arr3
      console.log(arr === arr2)//true
      console.log(arr3 === arr2)//true
      console.log(arr3 === arr)//true
    }
    fn(arr)
    
  </script>

</body>
</html>

总结

  • 基本类型(boolean ,string,number)两种特殊数据类型(null, undefine),都是值传递。
  • 两个引用类型(对象和数组)不采用特别的办法直接引用赋值的话,占用的堆内存是同一块
  • 数组有Array.slice()方法和ES6的扩展运算符来开辟新的堆内存
  • 对象有Object.assign()方法和扩展运算符来开辟新的堆内存
  • Object.assign()方法是浅层复制,如何对象内部还有对象,对象里面的对象的堆内存会被共享
  • 可以使用JSON.parse(JSON.stringify())来实现深层复制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值