Javascript實現hashcode函數實現對象比較與原理說明
在JavaScript中,數值的比較是比較簡單的,使用相等(==)和全等(===)符號基本上可以解決大多數非對象的比較。但是相等(==)和全等(===)符號在對象 object 的比較上,就不能滿足所有的要求了,hashCode是用于查找使用的,而equals是用于比較兩個對象是否相等的
如下面的代碼:
// 定義2個屬性值完全相同的實例對象
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 是相等的。這是因為在比較對象的時候,比較的是對象的地址,只有兩個對象的引用地址指向同一個地址時,對象才相等。
但有時,我們希望如果兩個對象的內容完全一樣時(即使引用的不是同一個對象),就判斷兩個對象相等。如果需要判斷兩個對象在字面意義上相等,可以使用類似Java中的 hashcode 方法來實現:
// 定義hashcode函數
function hashcode(obj) {
// 將對象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;
}注意:計算使用的是字符串,因此先將參數 obj 轉換為字符串
通過以上方法,我們可以計算兩個對象的hashcode,然后再進行比較:
// 定義2個屬性值完全相同的實例對象
var obj1 = {
name: "neil",
age: 100
};
var obj2 = {
name: "neil",
age: 100
};
// 定義hashcode函數
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以上代碼,對應 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
};到此這篇關于Javascript實現hashcode函數實現對象比較與原理說明的文章就介紹到這了,更多相關Javascript hashcode內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于BootStrap Metronic開發(fā)框架經驗小結【九】實現Web頁面內容的打印預覽和保存操作
本篇文章主要介紹如何實現Web頁面內容的打印預覽和保存操作的相關知識,感興趣的朋友一起學習吧2016-05-05
一個非常全面的javascript URL解析函數和分段URL解析方法
本文詳細介紹了一個非常全面的javascript URL解析函數,可以解析一個URL中的協(xié)議、主機、查詢字符串甚至錨鏈接,非常實用,一并總結了js自帶的分段URL解析方法,需要的朋友可以參考下2014-04-04

