js的值引用和地址引用

JavaScript013

js的值引用和地址引用,第1张

number 类型

        var a = 1

        var b = a

        b++

        console.log(a)  //1

        console.log(b)  //2

字符串类型

        var q = 'copy'

        var s = q

        s += '1'

        console.log(q)//copy

        console.log(s)//copy1

布尔类型

        var e = false

        var w = e

        w = true

        console.log(e)  //false

        console.log(w)  //true

数组

        splice  截取  会改变原数组

        //地址的引用  浅拷贝

        var array = [1,2,3,4,5]

        var newArray = array

        var thArray = newArray.splice(1,3)

        console.log(thArray)  //[2,3,4]

        console.log(newArray)  //[1,5]

        console.log(array)    //[1,5]

        //循环到原始类型进行深拷贝

        var  arr = ['a','b','c','d','e']

        var  newArr = []

        for(var i=0i<arr.lengthi++){

            newArr.push(arr[i])

        }

        var thArr = newArr.splice(1,3)

            console.log(thArr)  //["b", "c", "d"]

            console.log(newArr)  //["a", "e"]

            console.log(arr)  //["a", "b", "c", "d", "e"]

         对象

        //地址的引用  浅拷贝

        var obj = {name:'abc',id:'1'}

        var newObj = obj

        newObj.name='abcde'

        console.log(obj)  //{name:'abcde',id:'1'}

        console.log(obj)  //{name:'abcde',id:'1'}

        //循环到原始类型进行深拷贝

        var object = {name:'321',id:'1'}

        var newObject= {}

        for (var j in object){

            newObject[j]=object[j]

        }

        newObject.name='abcde'

        console.log(newObject)  //{name:'abcde',id:'1'}

        console.log(object)      //{name:'321',id:'1'}

数字   字符串   布尔类型   为原始类型,是值引用

数组   对象类型 为地址引用

值引用为深拷贝

地址引用循环到原始类型可进行深拷贝

        var nameArray = ['张三','李四']

        var descArray = ['张三是男生','李四也是男生']

        var allArray = []

        var tableObj={}

        for(let i=0i<nameArray.lengthi++){

            tableObj.name=nameArray[i]

            tableObj.desc=descArray[i]

            allArray.push(tableObj)

        }

        console.log(allArray)          //{name: "李四", desc: "李四也是男生"}

                                        //{name: "李四", desc: "李四也是男生"}

       var nameArray = ['张三','李四']

        var descArray = ['张三是男生','李四也是男生']

        var allArray = []

        for(let i=0i<nameArray.lengthi++){

            var tableObj={}

            tableObj.name=nameArray[i]

            tableObj.desc=descArray[i]

            allArray.push(tableObj)

        }

        console.log(allArray)          //{name: "张三", desc: "张三是男生"}

                                        //{name: "李四", desc: "李四也是男生"}

第一个函数的输出应该是 张三 李四,第二个函数的输出应该是两个李四

第一个函数很容易理解:构造函数生成了一个共有属性name,然后new了2个新函数,分别定义了自己的name,输出当然是自己的name值;

第二个函数设计到一个引用。

你先看下这个例子:

var a=1

var b=a

a=2

console.log(b) //1

//当a的引用是在本地的时候b等于a,a改变自己的value,b不发生改变。

var a={name:999}

var b=a

a.name = 1000

console.log(b.name) //1000

//当a的引用是一个对象时,引用并不是在本地,其实a指向的是一个内存地址,

//b=a表示,b也和a一样指向了这个内存地址。

//a.name 当a改变所指向的内存地址的值时,同时也影响到了b的值,所以b输出1000 而不是输出999

回头看你的第二个函数

构造函数Fun拥有一个共有属性info,info中有2个键值队,当你new了新函数后,用a.info其实是改变了info的引用对象,

同样b.info第二次改变了info的引用对象,因为a,b指向同一个内存地址 所以每次改变都会导致2个变量的值同时发生变更,于是输出了2个李四

是不一样的,可以这么说,同一个构造函数,无论在哪儿实例化对象,在内存中的地址是不一样的,没实例化一次,就会对应新的内存地址。你可以在构造函数中,声明一个随机数变量:如var suiji = Math.random() 然后实例化对象,输出这个变量,那肯定不是一样的,说明不是一块内存地址。