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

Javascript實(shí)現(xiàn)hashcode函數(shù)實(shí)現(xiàn)對(duì)象比較與原理說(shuō)明

 更新時(shí)間:2023年06月14日 06:25:26   作者:ztnhnr  
在JavaScript中,數(shù)值的比較是比較簡(jiǎn)單的,使用相等(==)和全等(===)符號(hào)基本上可以解決大多數(shù)非對(duì)象的比較。但是相等(==)和全等(===)符號(hào)在對(duì)象 object 的比較上,就不能滿足所有的要求了

在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)文章

最新評(píng)論

咸阳市| 茂名市| 中江县| 岳西县| 洛阳市| 辉县市| 甘德县| 商洛市| 呼和浩特市| 台江县| 泸州市| 海阳市| 瓦房店市| 涡阳县| 平邑县| 大同县| 隆子县| 石狮市| 买车| 祁阳县| 陵川县| 无极县| 茶陵县| 抚松县| 镇坪县| 新巴尔虎右旗| 新乐市| 清丰县| 玉屏| 太谷县| 蒙山县| 沾益县| 化隆| 肇庆市| 类乌齐县| 柳河县| 无极县| 闸北区| 尚志市| 阿坝县| 宁阳县|