摘要:前言今天再看純函數的時候看到純函數過程沒有副作用就是說在純函數中我們不能改變外部狀態想到了以前看過的函數中傳參的概念數據類型在中數據類型分為兩類基本類型值和引用類型值變量的復制中變量的基本類型和引用類型保存方式是不同的這也就導致變量復制時也
前言
今天再看React純函數的時候,看到純函數過程沒有副作用,就是說在純函數中我們不能改變外部狀態.
想到了以前看過的函數中傳參的概念.
在js中,數據類型分為兩類:基本類型值(undefined,null,Boolean,Number,String)和引用類型值(Object,Arrat,Function).
變量的復制1.js中變量的基本類型和引用類型保存方式是不同的,這也就導致變量復制時也就不同了.
如果從一個變量向另一個變量復制基本類型的值時,會將前者的值克隆一個,然后將克隆的值
賦值到后者,因此這兩個值是完全獨立的,只是他們的value相同而已.
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.引用類型傳參
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,從這點可以看出參數是按值傳遞的.
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.
所以這種場景,函數內部用參數去修改對象,那么查找到的還是原對象,因為指向相同,所以修改的話原對象
也受影響.
如果實例化一個對象賦值給該指針,那么指針指向的是一個全新的對象了,和原來指向的對象失去聯系.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84630.html
摘要:在向參數傳遞引用類型的值時,會把這個值在內存中的地址復制給一個局部變量,因此這個局部變量的變化會反映在函數的外部。當在函數內部重寫時,這個變量的引用就是一個局部變量了,這個局部變量在函數執行完畢后立即銷毀。 前言:我入門學的 java這種強類型語言,剛開始學js第一感覺是挺簡單,后來發現還是too young。所以,本次就把作用域、匿名函數做一個完整總結,黑喂狗~~~ --------...
摘要:學習中函數參數值傳遞和引用傳遞的學習中函數參數值傳遞和引用傳遞在紅寶書中說到,中所有函數的參數都是按值傳遞的。 學習JS中函數參數值傳遞和引用傳遞的學習 JS中函數參數值傳遞和引用傳遞 在JavaScript紅寶書中說到,ECMAScript中所有函數的參數都是按值傳遞的。理解這個概念先要從JS的堆內存和棧內存說起:棧內存為自動分配的內存空間,它由系統自動釋放;堆內存則是動態分配的內存...
摘要:關于的求值策略,問中函數的參數傳遞是按值傳遞還是按引用傳遞回答很經典。所以不能說中函數的參數傳遞嚴格按值傳遞或按引入傳遞。中還采用一種參數傳遞策略,叫按共享傳遞。中參數是必須先求值再作為實參傳入函數的。參考求值策略中函數參數的默認值 最近在研究 lambda 演算中的 η-變換 在 JavaScript 中的應用,偶然在 stackoverflow 上看到一個比較有意思的問題。關于 J...
摘要:基本類型和引用類型用操作符定義的變量將成為作用域中的局部變量。在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量即命名參數。結果依舊是在調用函數初時,與引用的是同一對象,所以首次的屬性賦值會對有所影響。 函數 參數 1.js函數不介意傳遞進來多少個參數,也不在乎傳遞進來參數是什么類型。2.arguments對象:類數組 arguments對象的長度是由傳入的參數個數決定的,...
摘要:基本類型和引用類型用操作符定義的變量將成為作用域中的局部變量。在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量即命名參數。結果依舊是在調用函數初時,與引用的是同一對象,所以首次的屬性賦值會對有所影響。 函數 參數 1.js函數不介意傳遞進來多少個參數,也不在乎傳遞進來參數是什么類型。2.arguments對象:類數組 arguments對象的長度是由傳入的參數個數決定的,...
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
閱讀 3851·2021-09-27 13:56
閱讀 889·2021-09-08 09:36
閱讀 775·2019-08-30 15:54
閱讀 618·2019-08-29 17:29
閱讀 939·2019-08-29 17:21
閱讀 1695·2019-08-29 16:59
閱讀 2772·2019-08-29 13:03
閱讀 2975·2019-08-29 12:47