問題分享:Js引用類型賦值

今天在微信羣裏有這樣一個問題和你們分享一下:

附上源碼:

function changeAgeAndReference(person){
    person . age = 25;
    person = {
        nage : 'John',
        age : 50
    };
    return person ;
}
var personObj1={
    name : 'Alex',
    age : 30
}
var personObj2 = changeAgeAndReference(personObj1);
console.log(personObj1)
console.log(personObj2)
複製代碼

會輸出什麼呢?答案是:數組

{name: "Alex", age: 25}
{nage: "John", age: 50}
複製代碼

要理解答案爲何是25和50 要理解Js變量賦值問題:

1. Js有兩類數據類型:值類型(基本類型)和引用類型

值類型(基本類型):字符串(String)、數字(Number)、布爾(Boolean)、對空(Null)、未定義(Undefined)、Symbol
引用數據類型:對象(Object)、數組(Array)、函數(Function)。
bash

基本數據類型是按值訪問的,由於能夠操做保存在變量中的實際的值; 引用類型的值是保存在內存中的對象,在操做對象時,其實是在操做對象的引用而不是實際的對象微信

2. 變量複製

基本類型複製:舉個栗子函數

var num1 = 5; 
var num2 = num1; 
複製代碼

num1 中保存的值是 5。當使用 num1 的值來初始化 num2 時,num2 中也保存了值 5。但 num2 中的 5 與 num1 中的 5 是徹底獨立的,該值只是 num1 中 5 的一個副本。此後,這兩個變量能夠參與任 何操做而不會相互影響ui

引用類型複製:舉個栗子spa

var obj1 = new Object(); 
var obj2 = obj1; 
obj1.name = "Nicholas"; 
alert(obj2.name); 
複製代碼

變量 obj1 保存了一個對象的新實例。而後,這個值被複制到了 obj2 中;換句話說,obj1 和 obj2 都指向同一個對象。這樣,當爲 obj1 添加 name 屬性後,能夠經過 obj2 來訪問這個屬性, 由於這兩個變量引用的都是同一個對象設計

如今讓咱們回到問題當中

function changeAgeAndReference(person){
    person . age = 25;
    person = {
        nage : 'John',
        age : 50
    };
    return person ;
}
var personObj1={
    name : 'Alex',
    age : 30
}
var personObj2 = changeAgeAndReference(personObj1);
console.log(personObj1)
console.log(personObj1)
複製代碼

var personObj2 = changeAgeAndReference(personObj1) 至關於:3d

var person = personObj1 
複製代碼

personObj1person 都指向同一個對象,改變person的屬性age也就改變了personObj1的age; 因此 personObj1 變爲 {name: "Alex", age: 25}code

函數內部:cdn

person = {
  nage : 'John',
  age : 50
};
//至關於
var person = {
  nage : 'John',
  age : 50
};
複製代碼

person被從新賦值,已經不指向以前的的對象了,因此return 的是 {nage: "John", age: 50}


文章參考:

《JavaScript 高級程序設計》中文譯本 第三版

相關文章
相關標籤/搜索