Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、面试题一-运算符优先级
- 属性运算符优先级大于=号优先级
- 赋值顺序是从右往左的
- 将引用类型赋值给变量时为浅拷贝
- 在下面的代码中,执行完
var a = {n:1};var b = a;后,a和b指向同一个对象{n:1},即a=b={n:1} - 执行
a.x=a={n:2)时,由于属性运算运算符优先级大于=号优先级,所以首先会为a和b指向的对象添加属性x,属性值为undefined,即此时a=b={n:1,x:undefined} - 然后由于赋值顺序时从右往左的,所以接下来会指向
a={n:2},此时a和b不在指向同一个对象了,即a={n:2},b={n:1,x=undefined};然后执行a.x={n:2},由于此时a与b的指向不同了,但是a.x在之前就执行完毕了,a.x指向b.x,所以a.x={n:2}这一步改变的是对象b,不会改变对象a,即此时a={n:2},b={n:1,x:{n:2}} - 所以最后的打印结果为 2,1,undefine,{n:2}
二、面试题二
- 优先级:函数>参数>变量
- 在下面代码的预解析阶段,由var声明的变量和函数会继续变量提升,变量c和函数c同名,由于函数的优先级大于变量,所以预解析阶段结束后c=function(){},所以
console.log(c)会打印出function(){} - 函数c有函数作用域,所以函数c内部也会继续预解析,在这个预解析阶段会执行函数内变量a的提升
var a = undefined,函数参数a的变量提升var a = undefined,函数a的变量提升function a(){},由于函数的优先级大于函数参数,函数参数的优先级大于变量,所以最后a表示函数a,所以console.log(a)打印出function a(){}