摘要:前言今天再看純函數(shù)的時(shí)候看到純函數(shù)過(guò)程沒(méi)有副作用就是說(shuō)在純函數(shù)中我們不能改變外部狀態(tài)想到了以前看過(guò)的函數(shù)中傳參的概念數(shù)據(jù)類(lèi)型在中數(shù)據(jù)類(lèi)型分為兩類(lèi)基本類(lèi)型值和引用類(lèi)型值變量的復(fù)制中變量的基本類(lèi)型和引用類(lèi)型保存方式是不同的這也就導(dǎo)致變量復(fù)制時(shí)也
前言
今天再看React純函數(shù)的時(shí)候,看到純函數(shù)過(guò)程沒(méi)有副作用,就是說(shuō)在純函數(shù)中我們不能改變外部狀態(tài).
想到了以前看過(guò)的函數(shù)中傳參的概念.
在js中,數(shù)據(jù)類(lèi)型分為兩類(lèi):基本類(lèi)型值(undefined,null,Boolean,Number,String)和引用類(lèi)型值(Object,Arrat,Function).
變量的復(fù)制1.js中變量的基本類(lèi)型和引用類(lèi)型保存方式是不同的,這也就導(dǎo)致變量復(fù)制時(shí)也就不同了.
如果從一個(gè)變量向另一個(gè)變量復(fù)制基本類(lèi)型的值時(shí),會(huì)將前者的值克隆一個(gè),然后將克隆的值
賦值到后者,因此這兩個(gè)值是完全獨(dú)立的,只是他們的value相同而已.
var num1 = 10; var num2 = num1; console.log(num1); // 10 num2 += 1; console.log(num1); // 10 console.log(num2); // 11
2.引用類(lèi)型的復(fù)制
引用類(lèi)型復(fù)制對(duì)象時(shí)并不會(huì)在堆內(nèi)存中新生成一個(gè)一模一樣的對(duì)象,只是多了一個(gè)保存指向這個(gè)對(duì)象指針的變量罷了.
將obj1的值復(fù)制給obj2,而這個(gè)值的副本實(shí)際上是一個(gè)指針,這個(gè)指針指向存儲(chǔ)在堆中的一個(gè)對(duì)象,
也就是說(shuō)創(chuàng)建了一個(gè)新的內(nèi)存地址傳給了obj2,obj1和obj2兩個(gè)變量同時(shí)指向了同一個(gè)Object,當(dāng)去改變這個(gè)對(duì)象,
他們的值都會(huì)改變,也即是說(shuō)他們中任何一個(gè)做出的改變都會(huì)反映到另一個(gè)身上.
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}函數(shù)參數(shù)的傳遞
所有函數(shù)的參數(shù)都是按值傳遞的,也就是說(shuō)把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制
到另一個(gè)變量一樣.所以如果能理解變量的復(fù)制,那么參數(shù)的傳遞也就很簡(jiǎn)單了.
1.基本類(lèi)型傳參
var count = 10; function num(num1) { num1 = 1; return num1; } var count1 = num(count); console.log(count1); // 1 console.log(count); //10
2.引用類(lèi)型傳參
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.引用類(lèi)型傳參指針改變
在函數(shù)中重新定義了一個(gè)對(duì)象,也就是現(xiàn)在堆內(nèi)存中有兩個(gè)對(duì)象,外部的oo指向的是老的對(duì)象,被傳入?yún)?shù)后
指向的是新定義的對(duì)象,所以調(diào)用后返回的值是新定義的對(duì)象的值.
如果參數(shù)是按引用傳遞的,那么oo也是a:10,從這點(diǎn)可以看出參數(shù)是按值傳遞的.
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}總結(jié)
函數(shù)的參數(shù)是值傳遞,對(duì)象類(lèi)型作為參數(shù)的時(shí)候傳遞的是地址(指針)的值,而不是對(duì)象本身堆內(nèi)存中的value.
所以這種場(chǎng)景,函數(shù)內(nèi)部用參數(shù)去修改對(duì)象,那么查找到的還是原對(duì)象,因?yàn)橹赶蛳嗤?所以修改的話原對(duì)象
也受影響.
如果實(shí)例化一個(gè)對(duì)象賦值給該指針,那么指針指向的是一個(gè)全新的對(duì)象了,和原來(lái)指向的對(duì)象失去聯(lián)系.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84630.html
摘要:在向參數(shù)傳遞引用類(lèi)型的值時(shí),會(huì)把這個(gè)值在內(nèi)存中的地址復(fù)制給一個(gè)局部變量,因此這個(gè)局部變量的變化會(huì)反映在函數(shù)的外部。當(dāng)在函數(shù)內(nèi)部重寫(xiě)時(shí),這個(gè)變量的引用就是一個(gè)局部變量了,這個(gè)局部變量在函數(shù)執(zhí)行完畢后立即銷(xiāo)毀。 前言:我入門(mén)學(xué)的 java這種強(qiáng)類(lèi)型語(yǔ)言,剛開(kāi)始學(xué)js第一感覺(jué)是挺簡(jiǎn)單,后來(lái)發(fā)現(xiàn)還是too young。所以,本次就把作用域、匿名函數(shù)做一個(gè)完整總結(jié),黑喂狗~~~ --------...
摘要:學(xué)習(xí)中函數(shù)參數(shù)值傳遞和引用傳遞的學(xué)習(xí)中函數(shù)參數(shù)值傳遞和引用傳遞在紅寶書(shū)中說(shuō)到,中所有函數(shù)的參數(shù)都是按值傳遞的。 學(xué)習(xí)JS中函數(shù)參數(shù)值傳遞和引用傳遞的學(xué)習(xí) JS中函數(shù)參數(shù)值傳遞和引用傳遞 在JavaScript紅寶書(shū)中說(shuō)到,ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。理解這個(gè)概念先要從JS的堆內(nèi)存和棧內(nèi)存說(shuō)起:棧內(nèi)存為自動(dòng)分配的內(nèi)存空間,它由系統(tǒng)自動(dòng)釋放;堆內(nèi)存則是動(dòng)態(tài)分配的內(nèi)存...
摘要:關(guān)于的求值策略,問(wèn)中函數(shù)的參數(shù)傳遞是按值傳遞還是按引用傳遞回答很經(jīng)典。所以不能說(shuō)中函數(shù)的參數(shù)傳遞嚴(yán)格按值傳遞或按引入傳遞。中還采用一種參數(shù)傳遞策略,叫按共享傳遞。中參數(shù)是必須先求值再作為實(shí)參傳入函數(shù)的。參考求值策略中函數(shù)參數(shù)的默認(rèn)值 最近在研究 lambda 演算中的 η-變換 在 JavaScript 中的應(yīng)用,偶然在 stackoverflow 上看到一個(gè)比較有意思的問(wèn)題。關(guān)于 J...
摘要:基本類(lèi)型和引用類(lèi)型用操作符定義的變量將成為作用域中的局部變量。在向參數(shù)傳遞基本類(lèi)型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量即命名參數(shù)。結(jié)果依舊是在調(diào)用函數(shù)初時(shí),與引用的是同一對(duì)象,所以首次的屬性賦值會(huì)對(duì)有所影響。 函數(shù) 參數(shù) 1.js函數(shù)不介意傳遞進(jìn)來(lái)多少個(gè)參數(shù),也不在乎傳遞進(jìn)來(lái)參數(shù)是什么類(lèi)型。2.arguments對(duì)象:類(lèi)數(shù)組 arguments對(duì)象的長(zhǎng)度是由傳入的參數(shù)個(gè)數(shù)決定的,...
摘要:基本類(lèi)型和引用類(lèi)型用操作符定義的變量將成為作用域中的局部變量。在向參數(shù)傳遞基本類(lèi)型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量即命名參數(shù)。結(jié)果依舊是在調(diào)用函數(shù)初時(shí),與引用的是同一對(duì)象,所以首次的屬性賦值會(huì)對(duì)有所影響。 函數(shù) 參數(shù) 1.js函數(shù)不介意傳遞進(jìn)來(lái)多少個(gè)參數(shù),也不在乎傳遞進(jìn)來(lái)參數(shù)是什么類(lèi)型。2.arguments對(duì)象:類(lèi)數(shù)組 arguments對(duì)象的長(zhǎng)度是由傳入的參數(shù)個(gè)數(shù)決定的,...
摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專(zhuān)門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前面的章節(jié),可...
閱讀 3834·2021-09-27 13:56
閱讀 881·2021-09-08 09:36
閱讀 765·2019-08-30 15:54
閱讀 609·2019-08-29 17:29
閱讀 927·2019-08-29 17:21
閱讀 1684·2019-08-29 16:59
閱讀 2757·2019-08-29 13:03
閱讀 2964·2019-08-29 12:47