亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScript-如何實現(xiàn)克隆(clone)函數(shù)

JasonZhang / 3265人閱讀

摘要:前提知識在實現(xiàn)克隆函數(shù)之前你需要明白以下一些概念如果你已經(jīng)明白了請直接閱讀實現(xiàn)部分什么是值類型引用類型很多新手可能會對值類型引用類型原始類型基本類型等等名稱感到困惑這里就解釋一下這些概念一個事物是可以有多種區(qū)分形式的比如貓我們可以說它是貓科

前提知識

在實現(xiàn)克隆函數(shù)之前,你需要明白以下一些概念,如果你已經(jīng)明白了,請直接閱讀 “實現(xiàn)” 部分.

什么是值類型、引用類型?

很多新手可能會對 “值類型”、“引用類型”、“原始類型”、“基本類型”等等名稱感到困惑. 這里就解釋一下這些概念.

一個事物是可以有多種區(qū)分形式的.

比如,貓,我們可以說它是貓科動物,也可以說它是哺乳動物,也可以說它是食肉動物.

在編程語言的世界里也是一樣的.

在JavaScript的世界里, 數(shù)據(jù)被定義為以下 7 種 數(shù)據(jù)類型 :

6種 原始類型(又叫 基本類型):

Boolean

Null

Undefined

Number

String

Symbol

和 Object

(需要注意的是, 名詞從英文翻譯成中文,可能會出現(xiàn)多種叫法,比如“primitive type”,中文叫 “原始類型”,也有叫“基本類型”.)

另外,根據(jù)變量值傳遞的方式,我們又可以將數(shù)據(jù)區(qū)分為“值類型”和“引用類型”.

值類型 : 數(shù)據(jù)在傳遞和賦值時,數(shù)據(jù)將自己復(fù)制一份給對方.

JavaScript中原始類型都屬于值類型(string, number, boolean, null, undefined, symbol).

引用類型 : 在傳遞和賦值時, 數(shù)據(jù)將自身的引用(又叫“地址”、“指針”)給對方.

JavaScript中數(shù)組、函數(shù)、自定義對象,三種屬于引用類型.

更詳細(xì)的解釋請閱讀: //TODO: (新建文章,介紹 值類型、引用類型)

實現(xiàn)

引用類型數(shù)據(jù)都是由原始類型數(shù)據(jù)組成的,因此我們可以將引用類型數(shù)據(jù)一層層往下拆, 將里面的每一個原始類型數(shù)據(jù)賦值給新對象.

基于上述思路,我們主要對 數(shù)組、函數(shù)、自定義對象 這些引用類型的數(shù)據(jù)進(jìn)行特殊處理,

Object.prototype.clone = function(){ ?
? ? ? ? var copy = this.constructor === Array ? [] : {}; //#1

? ? ? ? for(var e in this){
                if (typeof this[e] ?=== "object") { //#2
                    copy[e] = ?this[e].clone(); 
                } else if (typeof this[e] ?=== "function") { //#3
                    copy[e] = ? this[e].bind(copy); //#5
                } else { //#4
                    copy[e] = ?this[e]; 
                }
? ? ? ? }

? ? ? ? return copy;
      }

#1: 判斷傳入的對象是數(shù)組類型的對象,還是其它類型的對象.
#2、#3: Array 和 Object 的 typeof是 “object”, Function 的typeof 是“function”. 它們都是引用類型,因此特殊處理.

//typeof 用于引用類型的數(shù)據(jù)
typeof Array(); // "object"
typeof Object(); // "object"
typeof function(){}; // "function" 

#4: 原始類型直接賦值.
#5: 創(chuàng)建一個新的函數(shù),并且將新函數(shù)與 copy 對象綁定.

參考資料:

JavaScript 數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)
Difference between a Value Type and a Reference Type
Javascript之實現(xiàn)一個clone克隆函數(shù)
JavaScript: clone a function
Function.prototype.bind()

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/101947.html

相關(guān)文章

  • [譯] 為什么原型繼承很重要

    摘要:使用構(gòu)造函數(shù)的原型繼承相比使用原型的原型繼承更加復(fù)雜,我們先看看使用原型的原型繼承上面的代碼很容易理解。相反的,使用構(gòu)造函數(shù)的原型繼承像下面這樣當(dāng)然,構(gòu)造函數(shù)的方式更簡單。 五天之前我寫了一個關(guān)于ES6標(biāo)準(zhǔn)中Class的文章。在里面我介紹了如何用現(xiàn)有的Javascript來模擬類并且介紹了ES6中類的用法,其實它只是一個語法糖。感謝Om Shakar以及Javascript Room中...

    xiao7cn 評論0 收藏0
  • JavaScript 深拷貝性能分析

    摘要:它接受任意數(shù)量的源對象,枚舉它們的所有屬性并分配給。所以現(xiàn)在怎么辦有幾種方法可以創(chuàng)建一個對象的深拷貝。為了防止發(fā)生任何意外,請使用而不是。我想測量哪種方法是最高性能的。圖表以下是,和中不同技術(shù)的性能。 原文:Deep-copying in JavaScript - DasSur.ma 如何在 JavaScript 中拷貝一個對象?對于這個很簡單的問題,但是答案卻不簡單。 引用傳值 在...

    MyFaith 評論0 收藏0
  • Javascript的對象拷貝

    摘要:的對象只是指向內(nèi)存中某個位置的指針。所以在拷貝中的對象時,要根據(jù)實際情況做一些考慮。結(jié)論中最好的對象拷貝的算法,很大程度上取決于其使用環(huán)境,以及你需要拷貝的對象類型。 翻譯:瘋狂的技術(shù)宅原文:https://smalldata.tech/blog/2... 本文首發(fā)微信公眾號:前端先鋒歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 在開始之前,我先普及一些基礎(chǔ)知識。Javascrip...

    simpleapples 評論0 收藏0
  • JS的深淺拷貝

    摘要:引用類型之所以會出現(xiàn)深淺拷貝的問題,實質(zhì)上是由于對基本類型和引用類型的處理不同。另外方法可以視為數(shù)組對象的淺拷貝。上面描述過的復(fù)雜問題依然存在,可以說是最簡陋但是日常工作夠用的深拷貝方式。 一直想梳理下工作中經(jīng)常會用到的深拷貝的內(nèi)容,然而遍覽了許多的文章,卻發(fā)現(xiàn)對深拷貝并沒有一個通用的完美實現(xiàn)方式。因為對深拷貝的定義不同,實現(xiàn)時的edge case過多,在深拷貝的時候會出現(xiàn)循環(huán)引用等問...

    xiaoxiaozi 評論0 收藏0
  • javascript設(shè)計模式與開發(fā)實踐(二)- 封裝和原型模式

    摘要:對象會記住它的原型給對象提供了一個名為的隱藏屬性,某個對象的屬性默認(rèn)會指向它的構(gòu)造器的原型對象,即。我們通過代碼來驗證再來實際上,就是對象跟對象構(gòu)造器的原型聯(lián)系起來的紐帶切記這句話,對未來理解原型鏈很有幫助。 封裝 封裝數(shù)據(jù) 在許多語言的對象系統(tǒng)中,封裝數(shù)據(jù)是由語法解析來實現(xiàn)的,這些語言也許提供了 private、public、protected 等關(guān)鍵字來提供不同的訪問權(quán)限。例如:j...

    luxixing 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<