为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
JavaScript

课程名称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]'
    

以上,结束。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消