【九月打卡】第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 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦