Javascript實(shí)現(xiàn)hashcode函數(shù)實(shí)現(xiàn)對象比較與原理說明
在JavaScript中,數(shù)值的比較是比較簡單的,使用相等(==)和全等(===)符號基本上可以解決大多數(shù)非對象的比較。但是相等(==)和全等(===)符號在對象 object 的比較上,就不能滿足所有的要求了,hashCode是用于查找使用的,而equals是用于比較兩個對象是否相等的
如下面的代碼:
// 定義2個屬性值完全相同的實(shí)例對象 var obj1 = { name: "neil", age: 100 }; var obj2 = { name: "neil", age: 100 }; var obj3 = obj2; console.log(obj1 == obj2) // false console.log(obj2 == obj3) // true console.log(obj2 === obj3) // true
從上面的代碼中可以看出,對象 obj1 和 obj2 是不等的,但是 obj2 和 obj3 是相等的。這是因?yàn)樵诒容^對象的時候,比較的是對象的地址,只有兩個對象的引用地址指向同一個地址時,對象才相等。
但有時,我們希望如果兩個對象的內(nèi)容完全一樣時(即使引用的不是同一個對象),就判斷兩個對象相等。如果需要判斷兩個對象在字面意義上相等,可以使用類似Java中的 hashcode 方法來實(shí)現(xiàn):
// 定義hashcode函數(shù) function hashcode(obj) { // 將對象obj轉(zhuǎn)換為字符串 var str = JSON.stringify(obj); var hash = 0, i, chr, len; if (str.length === 0) return hash; for (i = 0, len = str.length; i < len; i++) { chr = str.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; // Convert to 32bit integer } return hash; }
注意:計(jì)算使用的是字符串,因此先將參數(shù) obj 轉(zhuǎn)換為字符串
通過以上方法,我們可以計(jì)算兩個對象的hashcode,然后再進(jìn)行比較:
// 定義2個屬性值完全相同的實(shí)例對象 var obj1 = { name: "neil", age: 100 }; var obj2 = { name: "neil", age: 100 }; // 定義hashcode函數(shù) function hashcode(obj) { var str = JSON.stringify(obj); var hash = 0, i, chr, len; if (str.length === 0) return hash; for (i = 0, len = str.length; i < len; i++) { chr = str.charCodeAt(i); hash = ((hash << 5) - hash) + chr; hash |= 0; // Convert to 32bit integer } return hash; } console.log(hashcode(obj1)); // -311732675 console.log(hashcode(obj2)); // -311732675 console.log(obj1 == obj2); // false console.log(hashcode(obj1) == hashcode(obj2)); // true
以上代碼,對應(yīng) obj1 和 obj2,hashcode方法都輸出同一個值:-311732675。因此再比較兩個對象的hashcode值時,返回 true。
javascript中獲得HashCode值
直接使用這三個方法即可:
function hashCode(strKey) { var hash = 0; if(!isNull(strKey)) { for (var i = 0; i < strKey.length; i++) { hash = hash * 31 + strKey.charCodeAt(i); hash = intValue(hash); } } return hash; } function isNull(str){ return str == null || str.value == ""; } function intValue(num) { var MAX_VALUE = 0x7fffffff; var MIN_VALUE = -0x80000000; if(num > MAX_VALUE || num < MIN_VALUE) { return num &= 0xFFFFFFFF; } return num; }
腳本之家小編推薦一個不錯的寫法
String.prototype.hashCode = function() { for (var a = 31,b = 0,c = this.length; b < c;) a ^= (a << 5) + (a >> 2) + this.charCodeAt(b++); return a };
到此這篇關(guān)于Javascript實(shí)現(xiàn)hashcode函數(shù)實(shí)現(xiàn)對象比較與原理說明的文章就介紹到這了,更多相關(guān)Javascript hashcode內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用ES6的Promise.all實(shí)現(xiàn)至少請求多長時間的實(shí)例
下面小編就為大家?guī)硪黄肊S6的Promise.all實(shí)現(xiàn)至少請求多長時間的實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08javascript間隔定時器(延時定時器)學(xué)習(xí) 間隔調(diào)用和延時調(diào)用
這篇文章主要介紹了javascript間隔調(diào)用和延時調(diào)用示例,介紹setInterval方法和clearInterval方法的使用方法,大家參考使用吧2014-01-01BootStrap創(chuàng)建響應(yīng)式導(dǎo)航條實(shí)例代碼
這篇文章主要介紹了BootStrap創(chuàng)建響應(yīng)式導(dǎo)航條實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-05-05關(guān)于Javascript回調(diào)函數(shù)的一個妙用
相信在剛開始學(xué)習(xí)JavaScript的時候,很多人感到最困惑的就是回調(diào)函數(shù)了。本文通過一個小小的例子來分析回調(diào)函數(shù)的用法。對大家學(xué)習(xí)Javascript回調(diào)函數(shù)很有幫助,有需要的可以來參考學(xué)習(xí)。2016-08-08代碼觸發(fā)js事件(click、change)示例應(yīng)用
Chrome , Firfox 不支持fireEvent的方法可以使用dispatchEvent的方法替代,直接給一個兼容的Code,下面有個不錯的示例,喜歡的朋友可以收藏下2013-12-12uin-app+mockjs實(shí)現(xiàn)本地數(shù)據(jù)模擬
這篇文章主要為大家詳細(xì)介紹了uin-app+mockjs實(shí)現(xiàn)本地數(shù)據(jù)模擬,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08javascript 控制input只允許輸入的各種指定內(nèi)容
這篇文章主要介紹了通過javascript控制input只允許輸入的各種指定內(nèi)容,需要的朋友可以參考下2014-06-06