JS實現(xiàn)深拷貝、instanceof、判斷是否為數(shù)組

JS深拷貝

JS中拷貝對象可以按照拷貝的程度可以分為淺拷貝和深拷貝,有些時候我們需要拷貝之后的對象和拷貝之前的對象解耦,即脫離聯(lián)系,也就是改變其中一者,另一者不會變化,典型的場景有:狀態(tài)的回溯。如果我們對狀態(tài)對象使用淺拷貝,則無法對狀態(tài)進(jìn)行回溯,但如果使用深拷貝,則可以很容易的對狀態(tài)進(jìn)行回溯和跟蹤。實現(xiàn)深拷貝,主要由以下兩種方式:(值得一提的是,JS原生數(shù)組中的 concat、slice 方法還有 Object.assign 方法都是一層拷貝,即淺拷貝)

  1. JSON (缺點:無法拷貝函數(shù))
function copy(o) {
    return JSON.parse(JSON.stringify(o))
}
  1. 遞歸實現(xiàn)
var deepCopy = function(obj) {
    if (typeof obj !== 'object') return obj
    var newObj = (Object.prototype.toString.call(obj) === '[object Array]') ? [] : {}
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = (typeof obj[key] !== 'object') ? obj[key]: deepCopy(obj[key])
        }
    }
    return newObj
}

instanceof

instanceof 是用來判斷對象是是某類的實例,或者是否是某類的子類的實例,它的實現(xiàn)原理可以是下面這樣,L 表示實例,R 表示某類。

function instanceOf(L, R) {
    R = R.prototype
    L = L.__proto__
    while (true){
        if (L === null)
            return false
        if (R === L) 
            return true
        L = L.__proto__
    }
}

判斷是否為數(shù)組

JS中數(shù)組也屬于對象,所以無法通過 typeof 直接判斷,這個時候就得采用其他方式,主要有一下幾種方式:

  1. 使用 instanceof
var arr = []
console.log(arr instanceof Array)
  1. 使用 constructor
var arr = []
console.log(arr.constructor === Array)
  1. 判斷對象是否有 push 等數(shù)組的一些方法
var arr = []
console.log(!!arr.push && !!arr.concat)
  1. 使用對象的 toString
var arr = []
console.log(Object.prototype.toString.call(arr) === '[object Array]')
  1. 使用 ES5 中的 Array.isArray 方法
var arr = []
console.log(Array.isArray(arr))

方法 1-3 有兼容性問題,方法 5 可能不兼容老款瀏覽器,所以最好使用方法 4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 0. 寫在前面 當(dāng)你開始工作時,你不是在給你自己寫代碼,而是為后來人寫代碼。 —— Nichloas C. Zak...
    康斌閱讀 5,526評論 1 42
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,681評論 1 32
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,282評論 8 265
  • 一晃便是冬天,那年那月,那時間,都是一去不復(fù)返,而我們卻是曾今,擦肩而過,留下了印痕,偶然回想,似是存在。 ...
    銘悅閱讀 553評論 0 2
  • 坐上這個出租車,內(nèi)心突然涌現(xiàn)出一些落寞!不知自己在奔向什么!還有,今天為什么會有這么多的累!
    花樣兒閱讀 182評論 0 0

友情鏈接更多精彩內(nèi)容