最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Immutable 在 JavaScript 中的應用

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

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

var obj = { /* 一個復雜結構的對象 */ };
doSomething(obj);
// 上面的函數之行完后,此時的 obj 還是最初的那個 obj 嗎?

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

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

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

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

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

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

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

而 Immutable 對象需要通過 set 和 get 來對數據進行「讀」和「寫」。

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

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

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

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

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

如果是原生的 Mutable 對象,在鏈式訪問一個深層級的數據時可能會報對象 undefined 的錯誤,而 Immutable 對象在碰到這種情況時不會報錯,返回的是 undefined。
在調試的時候,如果想查看一個 Immutable 對象的內部結構,建議使用 toJSON() 先轉換為普通的 Mutable 對象。

相關文章

  • 關于COOKIE個數與大小的問題

    關于COOKIE個數與大小的問題

    在一次面試過程中,面試官問過我關于瀏覽器cookie的問題包括:cookie大小,cookie個數限制以及如何操作cookie等一系列的問題。
    2011-01-01
  • JavaScript實現數據類型的相互轉換

    JavaScript實現數據類型的相互轉換

    這篇文章主要為大家詳細介紹了JavaScript實現數據類型的相互轉換,感興趣的朋友可以參考一下
    2016-03-03
  • 淺談小程序 setData學問多

    淺談小程序 setData學問多

    這篇文章主要介紹了淺談小程序 setData學問多,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 比較簡單實用的使用正則三種版本的js去空格處理方法

    比較簡單實用的使用正則三種版本的js去空格處理方法

    比較簡單實用的使用正則三種版本的js去空格處理方法...
    2007-11-11
  • 前端實現HTML網頁轉PDF并導出

    前端實現HTML網頁轉PDF并導出

    這篇文章主要為大家詳細介紹了前端如何通過html2canvas和jsPDF實現HTML網頁轉PDF并導出,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2025-01-01
  • 基于JavaScript實現移動端TAB觸屏切換效果

    基于JavaScript實現移動端TAB觸屏切換效果

    我們使用移動端時可以通過觸屏手勢左右滑動來切換TAB欄目,如網易新聞等APP欄目切換。我們說的TAB一般由導航條和TAB對應的內容組成,切換導航條上的標簽同時標簽對應的內容也會跟著切換。本文將結合實例給大家介紹一個移動端TAB觸屏切換效果。
    2015-10-10
  • js判斷對象是否是某一類型

    js判斷對象是否是某一類型

    下面的代碼就是判斷腳本之家是不是字符串類型的代碼
    2008-11-11
  • JavaScript操作DOM元素的childNodes和children區(qū)別

    JavaScript操作DOM元素的childNodes和children區(qū)別

    這篇文章主要介紹了JavaScript操作DOM元素的childNodes和children區(qū)別,本文直接給出測試代碼和運行效果來講解它們之間的區(qū)別,需要的朋友可以參考下
    2015-04-04
  • 開發(fā)跨瀏覽器javascript常見注意事項

    開發(fā)跨瀏覽器javascript常見注意事項

    對于javascript的開發(fā)人員來說,多瀏覽器的支持性,一直是個問題,每次都要經過測試,多個瀏覽器,才能使用下面一些常見的一些注意事項。
    2009-01-01
  • JS實現自定義彈窗功能

    JS實現自定義彈窗功能

    瀏覽器自帶的原生彈窗很不美觀,而且功能比較單一,絕大部分時候我們都會按照設計圖自定義彈窗或者直接使用注入layer的彈窗等等。下面小編給大家?guī)砹薐S實現自定義彈窗,感興趣的朋友一起看看吧
    2018-08-08

最新評論

来安县| 若羌县| 唐海县| 顺义区| 云南省| 武威市| 青冈县| 台东市| 枣庄市| 乌恰县| 天水市| 肇东市| 土默特右旗| 台中市| 吴江市| 故城县| 乌兰浩特市| 东乡县| 聊城市| 封丘县| 宝清县| 政和县| 孟津县| 寿宁县| 宝山区| 达尔| 四川省| 桓台县| 政和县| 阜平县| 宁南县| 龙游县| 朝阳市| 九寨沟县| 嘉黎县| 河源市| 临江市| 浦北县| 阿合奇县| 普格县| 南投县|