亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

您的位置:首頁技術文章
文章詳情頁

詳細討論JavaScript中的求值策略

瀏覽:64日期:2023-10-01 10:51:40

最近在研究 lambda演算 中的 η-變換 在JavaScript中的應用,偶然在 stackoverflow 上看到一個比較有意思的問題。關于JavaScript的求值策略,問js中函數的參數傳遞是按值傳遞還是按引用傳遞?回答很經典。

一栗以蔽之

function changeStuff(a, b, c) { a = a * 10; b.item = 'changed'; c = {item: 'changed'};}var num = 10;var obj1 = {item: 'unchanged'};var obj2 = {item: 'unchanged'};changeStuff(num, obj1, obj2);console.log(num); // 10console.log(obj1.item); // changedconsole.log(obj2.item); // unchanged

如果說js中函數的參數傳遞是按值傳遞,那么在函數changeStuff內部改變b.item的值將不會影響外部的obj1對象的值。

如果說JS中函數的參數傳遞是按引入傳遞,那函數changeStuff內部所做的改變將會影響到函數外部所有的變量定義,num將會變成100、obj2.item將會變成changed。很顯然實際不是這樣子的。

所以不能說JS中函數的參數傳遞嚴格按值傳遞或按引入傳遞。總的來說函數的參數都是按值傳遞的。JS中還采用一種參數傳遞策略,叫按共享傳遞。這要取決于參數的類型。

如果參數是基本類型,那么是按值傳遞的;

如果參數是引用類型,那么是按共享傳遞的。

參數傳遞

ECMAScript 中所有函數的參數都是按值傳遞的。也就是說,把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。基本類型值的傳遞如同基本類型變量的復制一樣,而引用類型值的傳遞,則如同引用類型變量的復制一樣。-- 《JavaScript高級程序設計》

紅寶書上講所有函數的參數都是按值傳遞的,到底是不是呢?讓我們分析下上面的栗子:

按值傳遞

JavaScript中基本類型作為參數的策略為按值傳遞(call by value):

function foo(a) { a = a * 10;}var num = 10;foo(num);console.log(num); // 10 沒有變化

這里看到函數內部參數的改變并沒有影響到外部變量。按值傳遞沒錯。

按共享傳遞

JavaScript中對象作為參數傳遞的策略為按共享傳遞(call by sharing):

修改參數的屬性將會影響到外部對象

重新賦值將不會影響到外部對象

按上面栗子函數內部修改了參數b的屬性item,會影響到函數外部對象,因而obj1的屬性item也變了。

function bar(b) { b.item = 'changed'; console.log(b === obj1) // true}var obj1 = {item: 'unchanged'};bar(obj1);console.log(obj1.item); // changed 修改參數的屬性將會影響到外部對象

從b === obj1打印結果為true可以看出,函數內部修改了參數的屬性并沒有影響到參數的引用。b和obj1共享一個對象地址,所以修改參數的屬性將會影響到外部對象。

而將參數c重新賦值一個新對象,將不會影響到外部對象。

function baz(c) { c = {item: 'changed'}; console.log(c === obj2) // false}var obj2 = {item: 'unchanged'};baz(obj2);console.log(obj2.item); // unchanged 重新賦值將不會影響到外部對象

將參數c重新賦值一個新對象,那么c就綁定到了一個新的對象地址,c === obj2打印結果為false,判斷他們不再共享同一個對象地址。它們各自有獨立的對象地址。所以重新賦值將不會影響到外部對象。

總結

可以說按共享傳遞是按值傳遞的特例,傳遞的是引用地址的拷貝。所以紅寶書上說的也沒錯。

可以把 ECMAScript 函數的參數想象成局部變量。-- 《JavaScript高級程序設計》

延伸 - 惰性求值

前面了解到了所有函數的參數都是按值傳遞的。JavaScript 中參數是必須先求值再作為實參傳入函數的。但是在ES6中有一個特例。

參數默認值不是傳值的,而是每次都重新計算默認值表達式的值。也就是說,參數默認值是惰性求值的。 -- 《ECMAScript 6 入門》

let x = 99;function foo(p = x + 1) { console.log(p);}foo() // 100x = 100;foo() // 101

上面代碼中,參數p的默認值是x + 1。這時,每次調用函數foo,都會重新計算x + 1,而不是默認p等于 100

以上就是詳細討論JavaScript中的求值策略的詳細內容,更多關于JavaScript求值策略的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 爱呦视频在线播放网址 | 真人一级毛片免费观看视频 | 欧美成人h版在线观看 | 国产精品成人在线播放 | 欧美aaaaaabbbbb | 欧美野外性k8播放性迷宫 | 精品欧美小视频在线观看 | 国产欧美日韩综合精品一区二区 | 欧美激情伦妇在线观看 | 日韩精品一区二区三区 在线观看 | 日本一级特黄大一片免 | 欧美在线视频不卡 | 呦女亚洲一区精品 | 成人做爰视频www在线观看 | 手机在线看片国产日韩生活片 | 亚洲欧美激情视频 | 日本特黄特色免费大片 | 日本国产最新一区二区三区 | 欧美三级久久 | 中文字幕亚洲天堂 | 亚洲国产爱久久全部精品 | 国产一区二区在线观看视频 | 三级视频在线观看 | 欧洲亚洲综合一区二区三区 | 国产99久久亚洲综合精品 | 成年人网站免费 | 一级看片免费视频囗交 | 成人丝袜激情一区二区 | 亚洲精品免费视频 | 黄色美女视频网站 | 亚洲国产精品线播放 | 国产成人久久精品 | 国产精品免费一级在线观看 | 欧美 日韩 国产 成人 在线观看 | 在线观看免费黄色网址 | 欧美88| bt天堂午夜国产精品 | 国产精品久久久久一区二区 | 欧洲女同互慰在线视频 | 国产精品色午夜视频免费看 | 一及黄色 |