写代码的时候,想到的和遇到的一些问题。想来可以做面试题。特记录于此。

对象

1、{} === {} 是否相等?
2、obj.a === obj.a 是否相等?

const obj = {
    a: {}
}

3、怎样使 obj.a !== obj.a

const obj = {
    get a() {
        return {}
    }
}

4、obj.a === obj.a 是否相等? obj.a 访问到的是哪一个?

const obj = {
    a: {}
    get a() {
        return {}
    }
}

5、getter 访问与访问器访问有何区别?
getter 可定义在实例和类上,值为一个无参数的函数,可以惰性赋值。

6、getter 访问与访问器存在相同属性的情况下,如何通过getter访问

const obj = {
    a: {}
    get a() {
        return {}
    }
}

当在实例上定义 getter 访问,则 getter 存在于实例上。虽然可以定义同名属性,但却访问不到 。

使用 delete obj.a 将会都删掉。

可以考虑将其定义到原型上。

class A {
    a = 1
    get a() {
        return 2
    }
}
const obj = new A()

obj.a === 1 // true
obj.__proto__a === 2 // true

delete obj.a

obj.a === 2 // true

7、arr[0] === null 是否相等?为什么?

const obj = { a: 1 }
const arr = [obj]
obj = null

8、arr.get(obj) === null 是否相等?为什么?

let obj = { a: 1 }
const map = new WeakMap()
map.set(obj, { a: 1 })
obj = null

9、a, b, c 的区别?如何在 class 写法上的原型上定义值?

class A {
    a = 1

    constructor() {
        this.b = 2
    }

    c() {
        return 3
    }
}

a, b, c 的区别?如何在原型上定义值?