面试题详细分析-小白教程

前言

最近做了一些面试题,情况不太好,所以,就想写出来分析总结一下。也给大家做个反面案例,警醒一下,以免出现类似错误。

试题1

废话不多说,直接上试题。

 (()=>{
        let x,y;
        try{
            throw new Error()
        }catch(x){
            (x= 1),(y=2);
            console.log(x);
        }
        console.log(x);
        console.log(y);
    })()

大家可以边看题目,边思考思考答案是什么。
下面我给一点提升。分析一下try catch语句。

 try{
//try语句用于检查是否有错误的代码块。
        throw new Error()
        //抛出错误语句
    }catch(x){
    //catch 语句允许我们定义当 try 代码块发生错误时,所执行的代码块。
        (x= 1),(y=2);
        console.log(x);
    }

之前,我在看这段代码时,根本就不知道try catch语句是什么。我还以为会输出error语句。后面查资料才知道,是上面那样的。所以,一开始分析这个题,我就出现了思维误区,导致一步错步步错。
而且在看catch里的x时,我把它当成了全局的变量,完全没有注意到它只是传入的参数。
这些小细节最终就导致,我把这道题做错了。

分析试题1

然后,我们接着从整体来分析。

  1. 在自调用函数中,先 let x,y;声明了作用于自调用函数作用域内的x,y。
  2. 在try catch 语句中,由于try抛出错误,所以执行catch中的操作。
  3. 在catch中,声明并赋值了函数内部的y,并且传入了一个参数x,(这个x一定要注意不是全局变量,而是传入的参数),并且给这个参数赋值。(这个参数相当于作用于这个catch语句的局部变量)
  4. 所以,catch语句里的 console.log(x)语句,是输出这个赋值的x的值1
  5. catch外的console.log(x)语句,由于let x只声明了,并没有赋值,所以输出undefined
  6. catch外的console.log(y)语句,由于let y只声明了,但是y 在catch中被赋值了,所以输出2
  7. 最终的输出结果分别是 1,undefined,2。

练一练

我再把这道题改变一下,看看你们能不能做出来。

 (()=>{
        let x,y;
        function a(x){
            (x= 1),(y=2);
            console.log(x);
        }
        a()
        console.log(x);
        console.log(y);
    })()

大家思考思考,其实这道题的思路跟上面的题没什么两样。
结果都是 1,undefined,2。
具体思路如下:

  1. 在自调用函数中,先 let x,y;声明了作用于自调用函数作用域内的x,y。
  2. 在函数 a 中,声明并赋值了函数内部的y,并且传入了一个参数x,(这个x一定要注意不是全局变量,而是传入的参数),并且给这个参数赋值。(这个参数相当于作用于这个catch语句的局部变量)。虽然函数 a 会发生函数提升,但不影响它的输出结果。
  3. 当调用函数a 时, 函数a语句里的 console.log(x)语句,是输出这个赋值的x的值1
  4. 函数a外的console.log(x)语句,由于let x只声明了,并没有赋值,所以输出undefined
  5. 函数a外的console.log(y)语句,由于let y只声明了,但是y 在函数a中被赋值了,所以输出2
  6. 最终的输出结果分别是 1,undefined,2。

试题2

   let c = {greeting :'hey!'}
        const d;
        d = c;
        c.greeting = 'hello'
        console.log(d.greeting);

分析步骤:

  1. 在JavaScript中,当设置它们彼此相等时,所有对象都通过引用进行交互。
  2. 首先,变量c为对象保存一个值。
  3. 之后,我们将d指定为c与对象相同的引用。但是这里需要注意的是:通过 const 定义的变量不能重新赋值。
  4. 使用,在输出结果时,会报语法错。

试题3

 class Chameleon{
        static colorChange(newColor){
            this.newColor = newColor
         }
         constructor({newColor = 'green'}={}){
            this.newColor = newColor
        }
  }
   const freddie = new Chameleon({newColor :'purple'})
   freddie.colorChange('orange')

分析步骤:

  1. colorChange方法是静态的。 静态方法仅在创建它们的构造函数中存在,并且不能传递给任何子级。
  2. 由于freddie是一个子级对象,函数不会传递,所以在freddie实例上不存在freddie方法:抛出TypeError-语法错误。

总结

在做面试题时,一定要小心抽丝剥茧。一定要注意到参数与普通的声明变量的区别。const的特征以及静态方法的特点。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值