今天再看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