笔试题
JavaScript
This

如何实现call?

Function.prototype.myCall = function (context, ...args) {
    const s = Symbol()
    context[s] = this // 该this指向的是调用的函数`func.myCall(...)`,此时func会当作对象来用
    const res = context[s](...args) // 此时该函数内的this指向的就是context了
    delete context[s]
    return res
}
add.call(obj, 1,2)

如何修改一个闭包里的数据?

Object上有一个valueOf属性,该属性为一个函数,执行可以返回对象自身,但是会有this指向问题,因此不行。 因此需要自己写一个类似的

Object.defineProperty(Object.prototype, 'myValueOf', {
  get: function() {
    return this // value, get(), set()
  }
})
o.get('myValueOf').a = 100 // 这样就能修改闭包内数据

如何避免这种修改,可以在读取obj的属性的时候加一个判断

get: function(k) {
    if (obj.hasOwnProperty(k)) {
        return obj[k]
    }
    return undefined
}

如何实现assign?

assign(target, source) // 将source的内容浅拷贝到target
function assign(target, source) {
    Object.getOwnPropertyNames(source).forEach(key => {
        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
    })
}

如何实现一个深拷贝?

// 一个简单的深拷贝
function clone(target) {
    if (typeof target === 'object') {
        let cloneTarget = Array.isArray(target) ? [] : {}; // 考虑数组
        for (const key in target) {
            cloneTarget[key] = clone(target[key]);
        }
        return cloneTarget;
    } else {
        return target;
    }
};