欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Immutable 在 JavaScript 中的應(yīng)用

 更新時(shí)間:2016年05月02日 22:01:53   作者:雨夜帶刀  
在 JavaScript 中,對象是引用類型的數(shù)據(jù),其優(yōu)點(diǎn)在于頻繁的修改對象時(shí)都是在原對象的基礎(chǔ)上修改,并不需要重新創(chuàng)建,這樣可以有效的利用內(nèi)存,不會(huì)造成內(nèi)存空間的浪費(fèi),對象的這種特性可以稱之為 Mutable,中文的字面意思是「可變」

Mutable 對象
在 JavaScript 中,對象是引用類型的數(shù)據(jù),其優(yōu)點(diǎn)在于頻繁的修改對象時(shí)都是在原對象的基礎(chǔ)上修改,并不需要重新創(chuàng)建,這樣可以有效的利用內(nèi)存,不會(huì)造成內(nèi)存空間的浪費(fèi),對象的這種特性可以稱之為 Mutable,中文的字面意思是「可變」。
對于 Mutable 的對象,其靈活多變的優(yōu)點(diǎn)有時(shí)可能會(huì)成為其缺點(diǎn),越是靈活多變的數(shù)據(jù)越是不好控制,對于一個(gè)復(fù)雜結(jié)構(gòu)的對象來說,一不小心就在某個(gè)不經(jīng)意間修改了數(shù)據(jù),假如該對象又在多個(gè)作用域中用到,此時(shí)很難預(yù)見到數(shù)據(jù)是否改變以及何時(shí)改變的。

var obj = { /* 一個(gè)復(fù)雜結(jié)構(gòu)的對象 */ };
doSomething(obj);
// 上面的函數(shù)之行完后,此時(shí)的 obj 還是最初的那個(gè) obj 嗎?

針對這種問題,常規(guī)的解決辦法可以通過將對象進(jìn)行深拷貝的形式復(fù)制出一個(gè)新的對象,再在新對象上做修改的操作,這樣能確保數(shù)據(jù)的可控性,但是頻繁的復(fù)制會(huì)造成內(nèi)存空間的大量浪費(fèi)。

var obj = { /* 一個(gè)復(fù)雜結(jié)構(gòu)的對象 */ };
// copy 出一個(gè)新的 obj2
// 但是 copy 操作會(huì)浪費(fèi)內(nèi)存空間
var obj2 = deepClone(obj);
doSomething(obj2);
// 上面的函數(shù)之行完后,無論 obj2 是否變化,obj 肯定還是原來那個(gè) obj

Immutable 對象
為了能更好的解決上述的問題,出現(xiàn)了 Immutable 對象,Immutable 從字面上翻譯成中文是「不可變」。每次修改一個(gè) Immutable 對象時(shí)都會(huì)創(chuàng)建一個(gè)新的不可變的對象,在新對象上操作并不會(huì)影響到原對象的數(shù)據(jù)。這種特殊的對象并不是 JavaScript 新出的功能特性,而是業(yè)界為了解決這種問題提供的一套解決方案,并且涌現(xiàn)出了一些優(yōu)秀的開源類庫,其中最有名的就是 Facebook 的 Lee Byron 開源的 immutable.js。當(dāng)然,Immutable 的這種解決方案并不是獨(dú)創(chuàng)的,而是來源于 Clojure 和 Scala。
Mutable 和 Immutable 的性能對比
對于 Mutable 的對象的低效率操作主要體現(xiàn)在復(fù)制和比較上,而 Immutable 對象就是解決了這兩大低效的痛點(diǎn)。
普通的 Mutable 對象的深拷貝操作會(huì)將一整份數(shù)據(jù)都復(fù)制一遍,而 Immutable 對象在修改數(shù)據(jù)時(shí)并不會(huì)復(fù)制一整份數(shù)據(jù),而是將變化的節(jié)點(diǎn)與未變化的節(jié)點(diǎn)的父子關(guān)系轉(zhuǎn)移到一個(gè)新節(jié)點(diǎn)上,類似于鏈表的結(jié)構(gòu)。從 “復(fù)制” 的角度來看,做到了最小化的復(fù)制,未變化的部分都是共享的,Mutable 在復(fù)制的時(shí)候是 “全量”,而 Immutable 復(fù)制的是 “增量”,對于內(nèi)存空間的使用率的比較高低立判。
并且基于每次修改一個(gè) Immutable 對象都會(huì)創(chuàng)建一個(gè)新的 Immutable 對象的這種特性可以將數(shù)據(jù)的修改狀態(tài)保存成一組快照,這也是挺方便的。
再來說說比較操作。對于 Mutable 的對象,如果要比較兩個(gè)對象是否相等,必須遍歷對象的每個(gè)節(jié)點(diǎn)進(jìn)行比較,對于結(jié)構(gòu)復(fù)雜的對象來說,其效率肯定高不到哪去。對于 Immutable 對象,immutable.js 提供了直接判斷兩個(gè) Immutable 對象的「值」是否相等的 API。

var map1 = Immutable.Map({a:1, b:1, c:1});
var map2 = Immutable.Map({a:1, b:1, c:1});
assert(map1 !== map2); // 不同的 Immutable 實(shí)例,此時(shí)比較的是引用地址
assert(Immutable.is(map1, map2)); // map1 和 map2 的值相等,比較的是值
assert(map1.equals(map2)); // 與 Immutable.is 的作用一樣

在實(shí)際的開發(fā)應(yīng)用中,性能并不總是最關(guān)鍵和重要的,對于普通的 JavaScript 的項(xiàng)目來說,由于 Immutable 的特性帶來的數(shù)據(jù)的可控性比起性能來說更有優(yōu)勢,對于 Mutable 對象適合在封閉的作用域小范圍使用,而 Immutable 對象適合數(shù)據(jù)需要跨多個(gè)作用域傳遞時(shí)使用。

Mutable 和 Immutable 在使用上的區(qū)別

immutable.js 提供了多種 Immutable 的數(shù)據(jù)結(jié)構(gòu):包含了 List Stack Map OrderedMap Set OrderedSet Record,這些數(shù)據(jù)結(jié)構(gòu)與原生的 Mutable 的數(shù)據(jù)結(jié)構(gòu)大致對應(yīng)。
各數(shù)據(jù)結(jié)構(gòu)的用法這里不細(xì)說,主要說說 Immutable 對象與 Mutable 對象在使用上的區(qū)別吧。
原生的 Mutable 對象在「讀」和「寫」上非常方便。

var mutableObj = {};
// 寫入數(shù)據(jù)
mutableObj.foo = 'bar';
// 讀取數(shù)據(jù)
console.log(mutableObj.foo);

而 Immutable 對象需要通過 set 和 get 來對數(shù)據(jù)進(jìn)行「讀」和「寫」。

var immutableObj1 = Immutable.Map();
// 寫入數(shù)據(jù)
var immutableObj2 = immutableObj1.set('foo', 'bar');
// 讀取數(shù)據(jù)
console.log(immutableObj2.get('foo')); // => 'bar'

上面的例子為了說明 set 方法的使用才在一開始創(chuàng)建了一個(gè)空對象,實(shí)際上可以在實(shí)例化的時(shí)候傳初始值。

var immutableObj = Immutable.Map({'foo', 'bar'});

對于層級比較深的數(shù)據(jù),immutable.js 提供的訪問接口很方便。

var immutableObj1 = Immutable.fromJS({
 a: {
  b: 'c'
 },
 d: [1, 2, 3]
});
// 讀取深層級的數(shù)據(jù)
console.log(immutableObj1.getIn(['a', 'b'])); // => 'c'
console.log(immutableObj1.getIn(['d', 1])); // => 2
// 修改深層級的數(shù)據(jù)
var immutableObj2 = immutableObj1.setIn(['a', 'b'], 'd');
console.log(immutableObj2.getIn(['a', 'b'])); // => 'd'

如果是原生的 Mutable 對象,在鏈?zhǔn)皆L問一個(gè)深層級的數(shù)據(jù)時(shí)可能會(huì)報(bào)對象 undefined 的錯(cuò)誤,而 Immutable 對象在碰到這種情況時(shí)不會(huì)報(bào)錯(cuò),返回的是 undefined。
在調(diào)試的時(shí)候,如果想查看一個(gè) Immutable 對象的內(nèi)部結(jié)構(gòu),建議使用 toJSON() 先轉(zhuǎn)換為普通的 Mutable 對象。

相關(guān)文章

  • 實(shí)現(xiàn)js保留小數(shù)點(diǎn)后N位的代碼

    實(shí)現(xiàn)js保留小數(shù)點(diǎn)后N位的代碼

    最近在做項(xiàng)目的時(shí)候,遇到要保留小數(shù)點(diǎn)后N位的問題,經(jīng)過一番思索,最終完成了,這里記錄一下,下次需要直接就能拉出來用了
    2014-11-11
  • 通過babel操作AST精準(zhǔn)插入配置代碼全流程

    通過babel操作AST精準(zhǔn)插入配置代碼全流程

    這篇文章主要為大家介紹了通過babel操作AST精準(zhǔn)插入配置代碼的全流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • 利用CSS、JavaScript及Ajax實(shí)現(xiàn)圖片預(yù)加載的三大方法

    利用CSS、JavaScript及Ajax實(shí)現(xiàn)圖片預(yù)加載的三大方法

    本文主要介紹了利用CSS、JavaScript及Ajax實(shí)現(xiàn)圖片預(yù)加載的三大方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • 簡單談?wù)凟S6的六個(gè)小特性

    簡單談?wù)凟S6的六個(gè)小特性

    ES6(ECMAScript2015)的出現(xiàn),無疑給前端開發(fā)人員帶來了新的驚喜,它包含了一些很棒的新特性,可以更加方便的實(shí)現(xiàn)很多復(fù)雜的操作,提高開發(fā)人員的效率。JS社區(qū)的每個(gè)人都喜歡新的API、語法以及一些簡單、明了更高效的完成重要任務(wù)的新特性。下面來一起看看吧。
    2016-11-11
  • 在JS中解析HTML字符串示例代碼

    在JS中解析HTML字符串示例代碼

    這篇文章主要介紹了在JS中如何解析HTML字符串,需要的朋友可以參考下
    2014-04-04
  • javascript 內(nèi)存回收機(jī)制理解

    javascript 內(nèi)存回收機(jī)制理解

    javascript語言是一門優(yōu)秀的腳本語言.其中包含腳本語言的靈活性外還擁有許多高級語言的特性.
    2011-01-01
  • javascript結(jié)合canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)效果

    javascript結(jié)合canvas實(shí)現(xiàn)圖片旋轉(zhuǎn)效果

    圖片的旋轉(zhuǎn)可以說是一種效果,但是逐漸旋轉(zhuǎn)已經(jīng)不單單是屬于視覺效果那個(gè)范疇,其更具有使用性,功能性。照片有時(shí)候是需要橫過來的拍的,當(dāng)我們預(yù)覽或共享到web上時(shí)需要進(jìn)行旋轉(zhuǎn)。這個(gè)操作在以往可能更多的是交給軟件去完成,然后再將旋轉(zhuǎn)到正常角度的圖片發(fā)布到web上。
    2015-05-05
  • javascript中對象的定義、使用以及對象和原型鏈操作小結(jié)

    javascript中對象的定義、使用以及對象和原型鏈操作小結(jié)

    這篇文章主要介紹了javascript中對象的定義、使用以及對象和原型鏈操作,結(jié)合實(shí)例形式總結(jié)分析了javascript對象操作的常用技巧,需要的朋友可以參考下
    2016-12-12
  • JavaScript實(shí)現(xiàn)簡單計(jì)算器

    JavaScript實(shí)現(xiàn)簡單計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Typescript使用修飾器混合方法到類的實(shí)例

    Typescript使用修飾器混合方法到類的實(shí)例

    這篇文章主要介紹了Typescript使用修飾器混合方法到類的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論