js函數中參數的傳遞

前言

今天再看React純函數的時候,看到純函數過程沒有反作用,就是說在純函數中咱們不能改變外部狀態.
想到了之前看過的函數中傳參的概念.函數

數據類型

在js中,數據類型分爲兩類:基本類型值(undefined,null,Boolean,Number,String)和引用類型值(Object,Arrat,Function).指針

變量的複製

1.js中變量的基本類型和引用類型保存方式是不一樣的,這也就致使變量複製時也就不一樣了.
若是從一個變量向另外一個變量複製基本類型的值時,會將前者的值克隆一個,而後將克隆的值
賦值到後者,所以這兩個值是徹底獨立的,只是他們的value相同而已.code

var num1 = 10;
var num2 = num1;
console.log(num1); // 10
num2 += 1;
console.log(num1);  // 10
console.log(num2);  // 11

2.引用類型的複製
引用類型複製對象時並不會在堆內存中新生成一個如出一轍的對象,只是多了一個保存指向這個對象指針的變量罷了.
將obj1的值複製給obj2,而這個值的副本其實是一個指針,這個指針指向存儲在堆中的一個對象,
也就是說建立了一個新的內存地址傳給了obj2,obj1和obj2兩個變量同時指向了同一個Object,當去改變這個對象,
他們的值都會改變,也便是說他們中任何一個作出的改變都會反映到另外一個身上.對象

var obj1 = {
    a: 1
};
var obj2 = obj1;
console.log(obj2);  // {a: 1}
obj2.a = 10;
console.log(obj1);  // {a: 10}
console.log(obj2);  // {a: 10}

函數參數的傳遞

全部函數的參數都是按值傳遞的,也就是說把函數外部的值複製給函數內部的參數,就和把值從一個變量複製
到另外一個變量同樣.因此若是能理解變量的複製,那麼參數的傳遞也就很簡單了.
1.基本類型傳參內存

var count = 10;
function num(num1) {
    num1 = 1;
    return num1;
}
var count1 = num(count);
console.log(count1); // 1
console.log(count); //10

2.引用類型傳參io

var o = {
    a: 1
};
function fun(o) {
    o.a = 10;
    return o;
}
var p = fun(o);
console.log(o); // {a: 10}
console.log(p); // {a: 10}

3.引用類型傳參指針改變
在函數中從新定義了一個對象,也就是如今堆內存中有兩個對象,外部的oo指向的是老的對象,被傳入參數後
指向的是新定義的對象,因此調用後返回的值是新定義的對象的值.
若是參數是按引用傳遞的,那麼oo也是a:10,從這點能夠看出參數是按值傳遞的.console

var oo = {
    a: 1
};
function gun(o) {
    o = {
        a: 10
    };
    return o;
}
var pp = gun(oo);
console.log(oo);    // {a: 1}
console.log(pp);    // {a: 10}

總結

函數的參數是值傳遞,對象類型做爲參數的時候傳遞的是地址(指針)的值,而不是對象自己堆內存中的value.
因此這種場景,函數內部用參數去修改對象,那麼查找到的仍是原對象,由於指向相同,因此修改的話原對象
也受影響.
若是實例化一個對象賦值給該指針,那麼指針指向的是一個全新的對象了,和原來指向的對象失去聯繫.function

相關文章
相關標籤/搜索