咱們都知道javascript的基礎數據類型有: Undefined
、 Null
、 Boolean
、 Number
、 String
。
若是從一個變量向另外一個變量複製基本類型的值,會在變量對象上建立一個新值,而後把值複製到爲新變量分配的位置上。javascript
var num1 = 1; var num2 = num1; // 1 num2 = 5; // 5 console.log(num1) // 1
此後,這兩個變量能夠參與任何操做而不會相互影響。java
var a = 5 function b(num) { num = 4 return num } b(a); //4 a; //5
var p1 = { name: "Tom" } function b(obj) { obj.name = "Jerry" return obj } b(p1) // { name : "Jerry"} p1.name // Jerry
棧內存 | 堆內存 | |
p1, obj | 指針地址 | { name :"Tom" } |
obj.name = "Jerry"
obj修改了堆內存裏的name值, p1仍是指向那個地址. 因此p1跟着變了.函數
var p1 = { name: "Tom" } function b(obj) { obj.name = "Jerry" obj = {} obj.name = "Jack" return obj } b(p1) // { name : "Jack"} p1; // { name: "Jerry" }
看到結果按照上面的意思應該p1也是{ name : "Jack"}
可是爲何不一樣呢?spa
1 . 先修改了共同指向的堆內存裏的name值指針
棧內存 | 堆內存 | |
p1, obj | 指針地址 | { name :"Tom" } |
棧內存 | 堆內存 | |
p1, obj | 指針地址 | { name :"Jerry" } |
2 . obj從新賦值引用類型,其實就是改變了obj的指針,並無改變p1的指針指向的地址裏的值code
棧內存 | 堆內存 | |
p1 | 指針地址 | { name :"Jerry" } |
obj | 指針地址 | { } |
棧內存 | 堆內存 | |
p1 | 指針地址 | { name :"Jerry" } |
obj | 指針地址 | { name: "Jack" } |