继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第13天 解决问题(2)

ICHAYA
关注TA
已关注
手记 40
粉丝 15
获赞 378

课程名称2周刷完100道前端优质面试真题
课程章节:第9章 前端面试技能拼图7 :分析和解决问题的思路 - 可以独立解决问题
主讲老师双越
课程内容
今天学习的内容包括:

9-7 -读代码-构造函数和原型的重名属性
9-11 -读代码-对象和属性的连续赋值
9-12 -读代码-对象属性类型的问题
9-13 扩展补充:解决问题的常见思路
9-14 重点及注意事项总结
这一章主要是讲分析解决问题,避免踩坑。

课程收获
依然是相当于讲面试题。主要是第二题优先级要搞清楚。

  • 构造函数和原型的重名属性


自己有对应方法,直接执行,没有该方法,沿着原型链找。故为 2。
new Foo 执行后 Foo.a 被修改。故为 1。

  • 连续赋值

    let a = { n: 1 };
    let b = a;
    a.x = a = { n: 2 };
    console.log(a.x);
    console.log(b.x);

引用类型存在堆中。第二行 b 指向 a 存的地址。
a.x 比赋值优先级高。
第三行意味着: 对 a 存的对象 x 属性初始化;把 a 指向新的地址,并把新地址赋值给 对象 x 属性。

    // 初始状态 ab 都指向 堆里存的对象
    // a.x 堆里存的对象 x 属性初始化, 未赋值
    obj.x = undefined;
    // a 指向新对象,地址改变
    a = {n: 2};
    // 堆里存的对象 x 属性赋值
    obj.x = a;

故最后结果为 a.x 为,b.x 为 {n: 2},

  • obj 的 key

let a = {},
    b = "123",
    c = 123;
  a[b] = "b";
  a[c] = "c";
  console.log(a[b]);

属性名称
属性名称必须是字符串或符号 Symbol。这意味着非字符串对象不能用来作为一个对象属性的键。任何非字符串对象,包括 Number,都会通过 toString 方法,被转换成一个字符串。

故 a[b] 为 “c”。
相关其他类型:

    let a = {};
    
    let s1 = Symbol(123);
    let s2 = Symbol(123);
    a[s1] = 1;
    a[s2] = 2;
    console.log(a[s1], a[s2]); // 1 2 Symbol 不会覆盖

    let arr0 = [];
    let arr1 = ['1', '2'];
    let arr2 = ['1,2'];
    a[arr0] = 0;
    a[arr1] = 1;
    a[arr2] = 2;
    console.log(a[arr0], a[arr1], a[arr2]); // 0 2 2 arr.toString() 结果 '' '1,2' 

    let obj0 = {};
    let obj1 = {'obj1': 1};
    a[obj0] = 0;
    a[obj1] = 1;
    console.log(a[obj0], a[obj1]); // 2 2 obj1.toString() 都是 '[object Object]'
    

以上,结束。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP