Javascript實(shí)現(xiàn)hashcode函數(shù)實(shí)現(xiàn)對(duì)象比較與原理說(shuō)明
在JavaScript中,數(shù)值的比較是比較簡(jiǎn)單的,使用相等(==)和全等(===)符號(hào)基本上可以解決大多數(shù)非對(duì)象的比較。但是相等(==)和全等(===)符號(hào)在對(duì)象 object 的比較上,就不能滿足所有的要求了,hashCode是用于查找使用的,而equals是用于比較兩個(gè)對(duì)象是否相等的
如下面的代碼:
// 定義2個(gè)屬性值完全相同的實(shí)例對(duì)象
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從上面的代碼中可以看出,對(duì)象 obj1 和 obj2 是不等的,但是 obj2 和 obj3 是相等的。這是因?yàn)樵诒容^對(duì)象的時(shí)候,比較的是對(duì)象的地址,只有兩個(gè)對(duì)象的引用地址指向同一個(gè)地址時(shí),對(duì)象才相等。
但有時(shí),我們希望如果兩個(gè)對(duì)象的內(nèi)容完全一樣時(shí)(即使引用的不是同一個(gè)對(duì)象),就判斷兩個(gè)對(duì)象相等。如果需要判斷兩個(gè)對(duì)象在字面意義上相等,可以使用類(lèi)似Java中的 hashcode 方法來(lái)實(shí)現(xiàn):
// 定義hashcode函數(shù)
function hashcode(obj) {
// 將對(duì)象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)換為字符串
通過(guò)以上方法,我們可以計(jì)算兩個(gè)對(duì)象的hashcode,然后再進(jìn)行比較:
// 定義2個(gè)屬性值完全相同的實(shí)例對(duì)象
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以上代碼,對(duì)應(yīng) obj1 和 obj2,hashcode方法都輸出同一個(gè)值:-311732675。因此再比較兩個(gè)對(duì)象的hashcode值時(shí),返回 true。
javascript中獲得HashCode值
直接使用這三個(gè)方法即可:
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;
}腳本之家小編推薦一個(gè)不錯(cuò)的寫(xiě)法
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)對(duì)象比較與原理說(shuō)明的文章就介紹到這了,更多相關(guān)Javascript hashcode內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于BootStrap Metronic開(kāi)發(fā)框架經(jīng)驗(yàn)小結(jié)【九】實(shí)現(xiàn)Web頁(yè)面內(nèi)容的打印預(yù)覽和保存操作
本篇文章主要介紹如何實(shí)現(xiàn)Web頁(yè)面內(nèi)容的打印預(yù)覽和保存操作的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2016-05-05
JavaScript中常用的數(shù)組過(guò)濾方法例子
這篇文章主要給大家介紹了關(guān)于JavaScript中常用的數(shù)組過(guò)濾方法的相關(guān)資料,數(shù)組過(guò)濾器方法是JavaScript中使用最廣泛的方法之一,它允許我們快速過(guò)濾出具有特定條件的數(shù)組中的元素,需要的朋友可以參考下2023-11-11
javascript笛卡爾積算法實(shí)現(xiàn)方法
這篇文章主要介紹了javascript笛卡爾積算法實(shí)現(xiàn)方法,實(shí)例分析了笛卡爾積算法的javascript實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
js跳轉(zhuǎn)頁(yè)面方法實(shí)現(xiàn)匯總
js跳轉(zhuǎn)頁(yè)面的方法有很多,本文搜集整理了一些,個(gè)人感覺(jué)還不錯(cuò),希望對(duì)大家有所幫助2014-02-02
一個(gè)非常全面的javascript URL解析函數(shù)和分段URL解析方法
本文詳細(xì)介紹了一個(gè)非常全面的javascript URL解析函數(shù),可以解析一個(gè)URL中的協(xié)議、主機(jī)、查詢字符串甚至錨鏈接,非常實(shí)用,一并總結(jié)了js自帶的分段URL解析方法,需要的朋友可以參考下2014-04-04

