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

詳解JavaScript中Hash Map映射結(jié)構(gòu)的實(shí)現(xiàn)

 更新時(shí)間:2016年05月21日 16:03:19   作者:kittyjie  
Hash Map通常在JavaScript中作為一個(gè)簡單的來存儲鍵值對的地方,不過哈希對象Object并不是一個(gè)真正的哈希映射,沒Java中的Hash Map來的那么強(qiáng)大,well,接下來帶大家詳解JavaScript中Hash Map映射結(jié)構(gòu)的實(shí)現(xiàn)

Hash Map通常在JavaScript中作為一個(gè)簡單的來存儲鍵值對的地方。然而,Object并不是一個(gè)真正的哈希映射,如果使用不當(dāng)可能會帶來潛在的問題。而且JavaScript可能不提供本地哈希映射(至少不是跨瀏覽器兼容的),有一個(gè)更好的聲明對象屬性的方法。

Hash Map的簡單實(shí)現(xiàn):

var hashMap = { 
  Set : function(key,value){this[key] = value}, 
  Get : function(key){return this[key]}, 
  Contains : function(key){return this.Get(key) == null?false:true}, 
  Remove : function(key){delete this[key]} 
} 

使用方法示例:

hashMap.Set("name","John Smith"); 
hashMap.Set("age",24); 
hashMap.Get("name");//John Smith 
hashMap.Contains("title");//false 
hashMap.Contains("name");//true 
hashMap.Remove("age"); 

在Object聲明成員的問題

該問題可能緣于對象原型鏈的繼承機(jī)制。就拿toString方法來說,如果使用in操作符來判斷對象是否存在的話:

var map = {};
'toString' in map; // true

因?yàn)閕n操作符會從所有原型繼續(xù)對象查找該對象是否存在。要解決這個(gè)問題,可使用hasOwnProperty方法檢測該對象是否存在:

var map = {};
map.hasOwnProperty('toString'); // false

這個(gè)方法可以工作地很正常,不過如果你定義了一個(gè)hasOwnProperty屬性那可能就麻煩了:

var map = {};
map.hasOwnProperty = 'foo';
map.hasOwnProperty('hasOwnproperty'); // TypeError

快速修復(fù)這個(gè)的方法是使用原生對象的方法。

var map = {};
map.hasOwnProperty = 'foo';
{}.hasOwnProperty.call(map, 'hasOwnproperty'); // true


這種方法不會引起任何問題,每次你判斷對象中的屬性是否存在時(shí)都要過濾掉原型鏈中的方法:

var map = {};
var has = {}.hasOwnProperty;

for(var key in map){
 if(has.call(map, key)){
  // do something
 }
}

裸對象

創(chuàng)建一個(gè)真正的Hash Map的訣竅是解藕所有的原型對象。我們可以通過 Object.create 來實(shí)現(xiàn)這個(gè)效果

var obj = {};
// is equivalent to:
var obj = Object.create(Object.prototype);



另外,這種方法可以讓你完全放棄原型,直接使用 null 來繼承。

var map = Object.create(null);

map instanceof Object; // false
Object.prototype.isPrototypeOf(map); // false
Object.getPrototypeOf(map); // null


這些裸對象(或字典)是作為Hasp Map的理想選擇。因?yàn)椴粫腥魏螞_突,它會抵制任何類型轉(zhuǎn)換,比如這樣就會產(chǎn)生錯(cuò)誤。

var map = Object.create(null);
map + ""; // TypeError: Cannot convert object to primitive value

這里沒有任何保留字,它就是為Hash Map設(shè)計(jì)的,比如。

var map = Object.create(null);
'toString' in map; // false

更進(jìn)一步,for ... in 循環(huán)變得更加簡單了,我們只需要把循環(huán)寫成這樣。
var map = Object.create(null);

for(var key in map){
 // do something
}

除了這些區(qū)別,它使用起來跟一般的Object鍵值存儲沒有任何區(qū)別。該對象可以被序列化,可以聲明原型和被繼承,上下文變量的使用也是一樣的。

var map = Object.create(null);

Object.defineProperties(map, {
 'foo': {
  value: 1,
  enumerable: true
 },
 'bar': {
  value: 2,
  enumerable: false
 }
});

map.foo; // 1
map['bar']; // 2

JSON.stringify(map); // {"foo":1}

{}.hasOwnProperty.call(map, 'foo'); // true
{}.propertyIsEnumerable.call(map, 'bar'); // false

甚至上面提到的那些變量檢測方法同樣適用。

var map = Object.create(null);

typeof map; // object
{}.toString.call(map); // [object Object]
{}.valueOf.call(map); // Object {}

相關(guān)文章

  • JavaScript替換當(dāng)前頁面的方法

    JavaScript替換當(dāng)前頁面的方法

    這篇文章主要介紹了JavaScript替換當(dāng)前頁面的方法,涉及javascript中replace方法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • JavaScript的六種繼承方式(推薦)

    JavaScript的六種繼承方式(推薦)

    繼承是面向?qū)ο缶幊讨杏忠环浅V匾母拍?,JavaScript支持實(shí)現(xiàn)繼承,不支持接口繼承,實(shí)現(xiàn)繼承主要依靠原型鏈來實(shí)現(xiàn)的
    2017-06-06
  • JS去除字符串中空格的方法

    JS去除字符串中空格的方法

    這篇文章主要介紹了JS去除字符串中空格的方法,涉及javascript字符串的正則、遍歷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • JavaScript設(shè)計(jì)模式策略模式案例分享

    JavaScript設(shè)計(jì)模式策略模式案例分享

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式策略模式案例分享,策略設(shè)計(jì)模式就是指一個(gè)問題匹配多個(gè)解決方法,不一定要用到哪一個(gè),而且有可能隨時(shí)增加多個(gè)方案
    2022-06-06
  • js 綁定鍵盤鼠標(biāo)事件示例代碼

    js 綁定鍵盤鼠標(biāo)事件示例代碼

    用jq提交時(shí)想同時(shí)按回車鍵可以提交,此時(shí)就不要用form,需要的朋友可以參考下
    2014-02-02
  • js實(shí)現(xiàn)內(nèi)容顯示并使用json傳輸數(shù)據(jù)

    js實(shí)現(xiàn)內(nèi)容顯示并使用json傳輸數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)內(nèi)容顯示并使用json傳輸數(shù)據(jù)的方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 探析瀏覽器執(zhí)行JavaScript腳本加載與代碼執(zhí)行順序

    探析瀏覽器執(zhí)行JavaScript腳本加載與代碼執(zhí)行順序

    本文主要基于向HTML頁面引入JavaScript的幾種方式,分析HTML中JavaScript腳本的執(zhí)行順序問題,通過本文給大家分享瀏覽器執(zhí)行JavaScript腳本加載與代碼執(zhí)行順序,對瀏覽器執(zhí)行javascript及執(zhí)行順序相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • JavaScript獲取function所有參數(shù)名的方法

    JavaScript獲取function所有參數(shù)名的方法

    本文使用javascript獲取function所有參數(shù)名的方法,對js獲取function所有參數(shù)名感興趣的朋友一起學(xué)習(xí)吧
    2015-10-10
  • JavaScript重定向URL參數(shù)的兩種方法小結(jié)

    JavaScript重定向URL參數(shù)的兩種方法小結(jié)

    關(guān)于JavaScript重定向URL參數(shù)的實(shí)現(xiàn)方法網(wǎng)站有很多,這篇文章的主要內(nèi)容是從網(wǎng)上查找,并進(jìn)行了修改,簡單粗暴的實(shí)現(xiàn)使用JavaScript重置url參數(shù),文中給出了詳細(xì)的示例代碼和調(diào)用代碼,對大家的理解和學(xué)習(xí)很有幫助,感興趣的朋友們下面來一起看看吧。
    2016-10-10
  • Javascript的表單與驗(yàn)證-非空驗(yàn)證

    Javascript的表單與驗(yàn)證-非空驗(yàn)證

    JavaScript 可用來在數(shù)據(jù)被送往服務(wù)器前對 HTML 表單中的這些輸入數(shù)據(jù)進(jìn)行驗(yàn)證。本文給大家介紹javascript的表單與驗(yàn)證-非空驗(yàn)證,對javascript表單驗(yàn)證相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03

最新評論

镇赉县| 常州市| 麦盖提县| 河池市| 忻州市| 海口市| 临沧市| 吴旗县| 察雅县| 澄城县| 临沭县| 公安县| 通榆县| 麟游县| 武城县| 天津市| 高邮市| 阿拉善右旗| 柘城县| 精河县| 陇川县| 汕尾市| 印江| 凯里市| 江安县| 阳信县| 东城区| 宣威市| 林甸县| 洪江市| 扎鲁特旗| 岳普湖县| 龙川县| 怀柔区| 安达市| 广河县| 宣城市| 永清县| 安龙县| 莫力| 安丘市|