在我们开始之前,了解一下js的数据类型,js的数据类型分为2类,一种是基本数据类型(原始值)它包含String,Number,Boolean,Null,Undefined,Symbol(ES6),基本数据类型存于栈中,访问方式为值访问。而另一种引用数据类型(引用值),存于堆中,访问方式为内存地址访问。

动态属性

对于引用值而言是可以动态添加属性的

  1. let obj = {}
  2. obj.name = 'xb'
  3. console.log(obj.name) // 'xb'

对于原始值而言是添加动态属性,会隐式的生成包装类型然后添加属性之后销毁。当调用原始值的动态类型,会出现undefined,(调用时,调用的是隐式生成的包装类型,访问包装类型的属性所以出现了undefined)

  1. let str = 'd'
  2. str.name = 'lm'
  3. console.log(str.name) // undefined

复制

除了数据存储方式不同,变量复制方式也有所不同。

  • 原始值复制是值复制。
  • 引用值复制是地址复制。

    原始值

    1. let num1 = 1
    2. let num2 = num1
    3. console.log(num1, num2) // 1, 1
    VL1LS{VC{5]DS~%O%%$Q801.png
    1. let num1 = 1
    2. let num2 = num1
    3. console.log(num1, num2) // 1, 1
    4. num1 = 2
    5. console.log(num1, num2) // 2, 1
    I}]T50VHQ~64EG]P0HMDB8R.png

    引用值

    ```javascript let obj1 = {
    1. name: 'xb'
    }

let obj2 = obj1 obj2.name = ‘d’ console.log(obj1.name) // ‘d’

  1. - 首先建立了名为obj1的对象,之后建立一个我obj2的对象同时obj2复制了obj1的地址值。
  2. ![引用.png](https://cdn.nlark.com/yuque/0/2020/png/2644766/1605787362353-093408d3-6e65-4ece-ae56-2b4263895d28.png#align=left&display=inline&height=265&margin=%5Bobject%20Object%5D&name=%E5%BC%95%E7%94%A8.png&originHeight=431&originWidth=741&size=18284&status=done&style=none&width=456)
  3. - 之后在obj2修改它的 name 属性,。由于此时 obj1 obj2拥有相同的值,也就是说引用同一个对象,所以 obj 做的修改会被外部的 obj1感知到,它们的 name 属性都被修改为 "d"
  4. ![引用.png](https://cdn.nlark.com/yuque/0/2020/png/2644766/1605787406623-40ce33fe-d70a-4087-a41c-19e27015ae89.png#align=left&display=inline&height=266&margin=%5Bobject%20Object%5D&name=%E5%BC%95%E7%94%A8.png&originHeight=431&originWidth=741&size=18229&status=done&style=none&width=458)
  5. <a name="lHxbv"></a>
  6. ## 传递参数
  7. JavaScript函数传参为传值
  8. ```javascript
  9. function setName(obj) {
  10. obj.name = 'Nicholas'
  11. obj = new Object()
  12. obj.name = 'Greg'
  13. }
  14. let person = new Object()
  15. setName(person)
  16. console.log(Person.name) // 'Nicholas'
  • 建立了一个名为person的对象,在调用函数中将person作为参数传入obj,此时obj复制了person的地址值,访问obj,name属性并将其值改为’Nicholas’。

lyx-a.png

  • 随后在函数内部将obj重新引入一个新对象,其内存地址发生改变。从而断开了与person的链接

lyx-a.png
之后添加obj属性为name,值为’Greg’不会影响person