日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳細(xì)討論JavaScript中的求值策略

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

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

一栗以蔽之

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中函數(shù)的參數(shù)傳遞是按值傳遞,那么在函數(shù)changeStuff內(nèi)部改變b.item的值將不會(huì)影響外部的obj1對(duì)象的值。

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

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

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

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

參數(shù)傳遞

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

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

按值傳遞

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

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

這里看到函數(shù)內(nèi)部參數(shù)的改變并沒有影響到外部變量。按值傳遞沒錯(cuò)。

按共享傳遞

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

修改參數(shù)的屬性將會(huì)影響到外部對(duì)象

重新賦值將不會(huì)影響到外部對(duì)象

按上面栗子函數(shù)內(nèi)部修改了參數(shù)b的屬性item,會(huì)影響到函數(shù)外部對(duì)象,因而obj1的屬性item也變了。

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

從b === obj1打印結(jié)果為true可以看出,函數(shù)內(nèi)部修改了參數(shù)的屬性并沒有影響到參數(shù)的引用。b和obj1共享一個(gè)對(duì)象地址,所以修改參數(shù)的屬性將會(huì)影響到外部對(duì)象。

而將參數(shù)c重新賦值一個(gè)新對(duì)象,將不會(huì)影響到外部對(duì)象。

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

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

總結(jié)

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

可以把 ECMAScript 函數(shù)的參數(shù)想象成局部變量。-- 《JavaScript高級(jí)程序設(shè)計(jì)》

延伸 - 惰性求值

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

參數(shù)默認(rèn)值不是傳值的,而是每次都重新計(jì)算默認(rèn)值表達(dá)式的值。也就是說,參數(shù)默認(rèn)值是惰性求值的。 -- 《ECMAScript 6 入門》

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

上面代碼中,參數(shù)p的默認(rèn)值是x + 1。這時(shí),每次調(diào)用函數(shù)foo,都會(huì)重新計(jì)算x + 1,而不是默認(rèn)p等于 100

以上就是詳細(xì)討論JavaScript中的求值策略的詳細(xì)內(nèi)容,更多關(guān)于JavaScript求值策略的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本久久二区| 精品视频一区二区三区四区五区 | 亚洲先锋成人| 久久国产三级精品| 蜜桃av一区二区| 91久久国产| 精品免费视频| 亚洲区国产区| 一本大道色婷婷在线| 国产精品欧美三级在线观看 | 久久久久久黄| 日产精品一区二区| 亚洲资源在线| 日韩成人综合| 91精品麻豆| 日韩区欧美区| 日本成人一区二区| 亚洲3区在线| 免费在线欧美视频| 日韩中文字幕1| 三级一区在线视频先锋| 亚洲精品91| 日本在线精品| 激情不卡一区二区三区视频在线| 日韩高清中文字幕一区| 成人片免费看| 91精品一区二区三区综合在线爱| 久久麻豆视频| 视频二区不卡| 亚洲一级少妇| 在线观看一区| 日本不卡视频在线观看| 亚洲91网站| 国产日韩亚洲欧美精品| 国产精品久久国产愉拍| 91亚洲自偷观看高清| 香蕉成人av| 欧美aa一级| 蜜桃久久久久久| 国产精品视频3p| 三上悠亚国产精品一区二区三区| 免费视频一区三区| 日本少妇一区二区| 免费在线日韩av| 欧美99久久| 国产精品白丝一区二区三区| 欧美好骚综合网| 免费观看日韩电影| 91视频一区| 日本综合视频| 国产成人免费| 国产精区一区二区| 亚洲精品无播放器在线播放| 国产极品久久久久久久久波多结野| 欧美激情日韩| 老司机免费视频一区二区| 精品美女视频| 亚洲男人在线| 综合色一区二区| 免费高潮视频95在线观看网站| 久久国产视频网| 国产精品99久久免费观看| 日韩不卡一二三区| 亚州欧美在线| 亚洲精品自拍| 国产精品自拍区| 国产精品久一| 在线国产日韩| 亚洲欧洲日韩| 麻豆国产精品777777在线| 日韩电影免费网址| 国产精品久久久久蜜臀 | 成人免费网站www网站高清| 久久婷婷久久| 欧美激情麻豆| 久久亚洲专区| 日韩免费精品| 成人一区而且| 亚洲一区二区av| 国产调教精品| 日韩毛片在线| 亚洲国内精品| 欧美久久一区二区三区| 午夜久久av| 国产精品一区二区三区www| 精品一区二区三区免费看 | 欧美日本一区| 国产精品激情电影| 尤物tv在线精品| 日本天堂一区| 精品在线91| 久久97视频| 午夜久久久久| 久久久久观看| 亚洲午夜久久| 成人在线网站| 国产精品调教视频| 在线亚洲激情| 国产资源在线观看入口av| 狠狠干综合网| 成人亚洲一区| 久久国产人妖系列| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲乱码久久| www.九色在线| 伊人网在线播放| 成人国产精品一区二区免费麻豆| 成人在线黄色| 久久一二三区| 亚洲免费影视| 国产精品日韩欧美一区| 婷婷五月色综合香五月| 香蕉精品视频在线观看| 欧美一级二级三级视频| 亚洲调教视频在线观看| 肉色欧美久久久久久久免费看| 精品一区二区三区在线观看视频| 国产精品调教| 国产精品一区免费在线| 国产欧美一区二区精品久久久 | 国产欧美日韩综合一区在线播放| 亚洲精品观看| 日韩美女国产精品| 久久国产人妖系列| 麻豆国产精品777777在线| 国产a久久精品一区二区三区| 精品美女视频 | 国产精品二区不卡| 亚洲伊人av| 在线日韩中文| 久久xxxx| 91嫩草精品| 麻豆国产精品一区二区三区| 精品久久91| 欧美日韩尤物久久| 欧美日韩国产高清电影| 老牛影视一区二区三区| 综合一区在线| 国产精品探花在线观看| 水蜜桃久久夜色精品一区| а√天堂8资源中文在线| 久久91导航| 国产模特精品视频久久久久| 欧美日韩一区二区三区视频播放| 国产精品久久乐| 老牛影视一区二区三区| 天堂av在线一区| 精品中国亚洲| 日韩精品一级中文字幕精品视频免费观看 | 日韩影院免费视频| 免费人成在线不卡| 久久国产生活片100| 日韩精品一区二区三区中文| 91麻豆国产自产在线观看亚洲| 亚洲一区国产| 精品欧美一区二区三区在线观看| av亚洲免费| 久久影视三级福利片| 日韩一区二区三区免费视频| 私拍精品福利视频在线一区| 精品国产亚洲一区二区三区| 欧美亚洲人成在线| 久久影院一区| 黄色aa久久| 国产乱码精品一区二区三区四区 | 亚洲一区中文| 91精品蜜臀一区二区三区在线 | 桃色一区二区| 国产v综合v| 美女被久久久| 日韩精品中文字幕吗一区二区| 国产精品白丝久久av网站| 成人精品亚洲| 日韩国产在线观看一区| av资源亚洲| 中文字幕av亚洲精品一部二部| 9999国产精品| 日韩欧美二区| 91日韩免费| 欧美日韩在线观看视频小说| 亚洲大全视频| 国产精品久久久久蜜臀| 精品国产一级| 美女精品一区二区| 另类专区亚洲| 人在线成免费视频| 久久国产66| 久久精品亚洲| 国产亚洲网站| 国产福利一区二区三区在线播放| 成人羞羞在线观看网站| 欧美日韩亚洲一区二区三区在线| 日韩欧美二区| 日本精品在线播放| 欧美午夜精品一区二区三区电影| 国产日本精品| 国产精品毛片一区二区三区| 福利精品在线| 亚州av日韩av| 免费观看不卡av|