国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

深入學(xué)習(xí) JavaScript中的函數(shù)調(diào)用

2024-05-06 15:19:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

定義

可能很多人在學(xué)習(xí) JavaScript 過(guò)程中碰到過(guò)函數(shù)參數(shù)傳遞方式的迷惑,本著深入的精神,我想再源碼中尋找些答案不過(guò)在做這件事之前,首先明確幾個(gè)概念。拋棄掉值傳遞、引用傳遞等固有叫法,回歸英文:

call by reference && call by value && call by sharing

分別是我們理解的 C++ 中的引用傳遞,值傳遞。第三種比較迷惑,官方解釋是 receives the copy of the reference to object 。我用通俗的話解釋一下:

Object 可以理解為 key 的集合,Object 對(duì) key 指向的數(shù)據(jù)是引用性質(zhì)的(這里不深究是指針實(shí)現(xiàn)還是C++引用實(shí)現(xiàn)),函數(shù)接收的是一個(gè)變量的 copy,變量包含了 Object 的引用 ,是一個(gè)值傳遞。

那么很明顯,函數(shù)傳參的時(shí)候我們接收到的對(duì)象型參其實(shí)是實(shí)參的復(fù)制,所以直接更改型參的指向是不可行的;由于 Object 本身的 key 都是引用,所以修改 key 的指向是可行的。

證明

簡(jiǎn)單來(lái)幾段代碼即可證明

Code 1: 函數(shù)能修改 key 指向的數(shù)據(jù)

let func = obj => { obj.name = 'Dosk' };let obj = {name : 'Alxw'};console.log(obj); //{ name: 'Alxw' }func(obj)console.log(obj); //{ name: 'Dosk' }

Code 2: 函數(shù)不能修改 obj

let func = obj => { obj = {} };let obj = {name : 'Alxw'};console.log(obj); //{ name: 'Alxw' }func(obj)console.log(obj); //{ name: 'Alxw' }

Code 3: 內(nèi)部 obj 和外部 === 結(jié)果相等

let def = {name : 'Alxw'};let func = obj => { console.log(obj === def) };func(def); //true

所以第三段代碼可能有疑問(wèn)了,既然 obj 是 def 的復(fù)制,為什么 === 操作還能夠?yàn)檎妫坎皇钦f(shuō) === 操作對(duì)于 Object 比較的是在內(nèi)存中的地址么,如果是復(fù)制應(yīng)該是 false 才對(duì)啊?

所以我們回到 Google V8 的源碼來(lái)看這件事。

深入 Google V8

我們來(lái)看看源碼里嚴(yán)格等于操作代碼部分:

bool Object::StrictEquals(Object* that) { if (this->IsNumber()) {  if (!that->IsNumber()) return false;  return NumberEquals(this, that); } else if (this->IsString()) {  if (!that->IsString()) return false;  return String::cast(this)->Equals(String::cast(that)); } else if (this->IsSimd128Value()) {  if (!that->IsSimd128Value()) return false;  return Simd128Value::cast(this)->Equals(Simd128Value::cast(that)); } return this == that;}

看起來(lái)應(yīng)該是最后一種情況,理論上如果 def 和 obj 是不同的對(duì)象,那么應(yīng)該返回 false 才對(duì),這不是推翻了上文所述么?其實(shí)不,忽略了一件事,即 Google V8 內(nèi)部在實(shí)例化一個(gè) Object 的時(shí)候,本身就是動(dòng)態(tài)實(shí)例化,而我們知道在編譯型語(yǔ)言中如果動(dòng)態(tài)實(shí)例化只能夠在堆內(nèi)存上,即只能夠指針引用。這個(gè)結(jié)論是的證明涉及到 Local 、Handle 等 class 的實(shí)現(xiàn),我覺(jué)得太麻煩,有一個(gè)簡(jiǎn)單的證明方式,即搜索源碼得到所有調(diào)用

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 米林县| 蕲春县| 闽侯县| 新泰市| 凤庆县| 论坛| 介休市| 武威市| 锡林浩特市| 雅安市| 凉山| 滦南县| 如东县| 山东| 邵阳县| 杂多县| 古蔺县| 蒙山县| 松阳县| 永胜县| 绥滨县| 个旧市| 乌兰县| 洛浦县| 荥经县| 大石桥市| 锦屏县| 通海县| 阳新县| 松溪县| 故城县| 来宾市| 彩票| 安吉县| 临朐县| 图片| 盐池县| 门头沟区| 冷水江市| 新龙县| 松溪县|