面试那些事

手写js对象常用方法

2021-11-23  本文已影响0人  _静夜听雨_

趁着有时间,整理一下Object常用的一些方法,加深记忆~~

entries

将对象转成键值对数组

Object.prototype.my_entries = function(obj){
    const res = [];
    for(let key in obj){
        console.log(key,  obj[key]);
        if(obj.hasOwnProperty(key)){
            //key本身还包含了原型上的方法,所以要过滤掉
            res.push([key, obj[key]]);
        }
    }
    return res;
}

fromEntries

跟entries相反,将键值对数组转成对象

Object.prototype.my_fromEntries = function(arr=[]){
    const res = {};
    for(let i = 0; i < arr.length; i++){
        const [key, value] = arr[i];
        res[key] = value;
    }
    return res;
}

keys

将对象的key转成一个数组合集

Object.prototype.my_keys = function(obj){
    const res = [];
    for(let key in obj){
        console.log(key);
        if(obj.hasOwnProperty(key)){
            //key本身还包含了原型上的方法,所以要过滤掉
            res.push(key);
        }
    }
    return res;
}

values

将对象的value转成一个数组合集

Object.prototype.my_values = function(obj){
    const res = [];
    for(let key in obj){
        console.log(key);
        if(obj.hasOwnProperty(key)){
            //key本身还包含了原型上的方法,所以要过滤掉
            res.push(obj[key]);
        }
    }
    return res;
}

assign

对象拷贝,接收多个对象,并将多个对象合成一个对象,
如果有重名属性,以后来的对象属性值为准

Object.prototype.my_assign = function(target, ...args){
    if(target === null || target === undefined){
        throw new Error('cannot canvert to Object');
    }
    target = Object(target);
    for(let nextObj in args){
        for(let key in nextObj){
            if(nextObj.hasOwnProperty(key)){
                target[key] = nextObj[key];
            }
        }
    }
    return target;
}

instanceOf

A instanceOf B,判断A是否是B的原型

Object.prototype.my_instanceOf = function(parent, child){
    const fp = parent.prototype;
    let cp = child.__proto__;
    while(cp){
        if(cp === fp){
            return true;
        }
        cp = cp.__proto__;//顺着原型链往上找
    }
    return false;
}

Object.is(x, y)

判断x是否等于y

Object.prototype.my_is = function (x, y) {
    if (x === y) {
        // 排除 -0 和 +0
        return x !== 0 || 1 / x === 1 / y
    }
    // 排除NaN
    return x !== x && y !== y
}
上一篇下一篇

猜你喜欢

热点阅读