经典面试题与其衍生思考 JS篇(一)

268 阅读1分钟

例题

//例题一
    let a = {}
    b = '0'
    c = 0
    a[b] = 'bb'
    a[c] = 'cc'
    console.log(a[b])  //cc
    
    //解题思路
    //a[b] -> a['0'] = 'bb'
    //a[c] -> a[0] = 'cc'
    //a['0'] <=> a[0]
//例题二
    let a = {}
    b = Symbol('a')
    c = Symbol('a')
    a[b] = 'bb'
    a[c] = 'cc'
    console.log(a[b])  //bb
    
    //解题思路
    //Symbol是创建一个唯一性的标识
    //Symbol('a') == Symbol('a')  false
//例题三
    let a = {}
    b = {
        bb:'bbb'
    }
    c = {
        cc:'ccc'
    }
    a[b] = 'bbbb'
    a[c] = 'cccc'
    console.log(a[b])  //cccc
    
    //解题思路
    //a[b] -> a['[object Object]'] = 'bbbb'
    //a[c] -> a['[object Object]'] = 'cccc'

衍生思考

为什么第三题的属性名是[object Object]?
因为可以认为对象的属性名应该时一个string类型的,所以该对象会使用toString方法。可以定义一个对象重写toString验证
    let a = {}
    let b = {toString:function (){return 'bb'}}
    a[b] = 'bbb'
    console.log(a) //{bb: "bbb"}