我們都知道javascript的基礎資料型別有: Undefined 、 Null 、 Boolean 、 Number 、 String ,
如果從一個變數向另一個變數復制基本型別的值,會在變數物件上創建一個新值,然后把值復制到為新變數分配的位置上,
- code
var num1 = 1;
var num2 = num1; // 1
num2 = 5; // 5
console.log(num1) // 1
此后,這兩個變數可以參與任何操作而不會相互影響,
- 函式傳參有有區別嗎?
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"}但是為什么不同呢?
1 . 先修改了共同指向的堆記憶體里的name值
- 第一步
| 堆疊記憶體 | 堆記憶體 | |
| p1, obj | 指標地址 | { name :"Tom" } |
- 第二步
| 堆疊記憶體 | 堆記憶體 | |
| p1, obj | 指標地址 | { name :"Jerry" } |
2 . obj重新賦值參考型別,其實就是改變了obj的指標,并沒有改變p1的指標指向的地址里的值
- 第三步
| 堆疊記憶體 | 堆記憶體 | |
| p1 | 指標地址 | { name :"Jerry" } |
| obj | 指標地址 | { } |
- 第四步
| 堆疊記憶體 | 堆記憶體 | |
| p1 | 指標地址 | { name :"Jerry" } |
| obj | 指標地址 | { name: "Jack" } |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/230246.html
標籤:其他
上一篇:create-react-app配置本地埠port和host以及sourcemap關閉
下一篇:ES6語法,自定義組件的命名
