24Js面试题

72 阅读2分钟

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}

image.png

二、面试题二

  • 优先级:函数>参数>变量
  • 在下面代码的预解析阶段,由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(){}

image.png