前言
最近做了一些面试题,情况不太好,所以,就想写出来分析总结一下。也给大家做个反面案例,警醒一下,以免出现类似错误。
试题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
然后,我们接着从整体来分析。
- 在自调用函数中,先 let x,y;声明了作用于自调用函数作用域内的x,y。
- 在try catch 语句中,由于try抛出错误,所以执行catch中的操作。
- 在catch中,声明并赋值了函数内部的y,并且传入了一个参数x,(这个x一定要注意不是全局变量,而是传入的参数),并且给这个参数赋值。(这个参数相当于作用于这个catch语句的局部变量)
- 所以,catch语句里的 console.log(x)语句,是输出这个赋值的x的值1。
- catch外的console.log(x)语句,由于let x只声明了,并没有赋值,所以输出undefined。
- catch外的console.log(y)语句,由于let y只声明了,但是y 在catch中被赋值了,所以输出2。
- 最终的输出结果分别是 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。
具体思路如下:
- 在自调用函数中,先 let x,y;声明了作用于自调用函数作用域内的x,y。
- 在函数 a 中,声明并赋值了函数内部的y,并且传入了一个参数x,(这个x一定要注意不是全局变量,而是传入的参数),并且给这个参数赋值。(这个参数相当于作用于这个catch语句的局部变量)。虽然函数 a 会发生函数提升,但不影响它的输出结果。
- 当调用函数a 时, 函数a语句里的 console.log(x)语句,是输出这个赋值的x的值1。
- 函数a外的console.log(x)语句,由于let x只声明了,并没有赋值,所以输出undefined。
- 函数a外的console.log(y)语句,由于let y只声明了,但是y 在函数a中被赋值了,所以输出2。
- 最终的输出结果分别是 1,undefined,2。
试题2
let c = {greeting :'hey!'}
const d;
d = c;
c.greeting = 'hello'
console.log(d.greeting);
分析步骤:
- 在JavaScript中,当设置它们彼此相等时,所有对象都通过引用进行交互。
- 首先,变量c为对象保存一个值。
- 之后,我们将d指定为c与对象相同的引用。但是这里需要注意的是:通过 const 定义的变量不能重新赋值。
- 使用,在输出结果时,会报语法错。
试题3
class Chameleon{
static colorChange(newColor){
this.newColor = newColor
}
constructor({newColor = 'green'}={}){
this.newColor = newColor
}
}
const freddie = new Chameleon({newColor :'purple'})
freddie.colorChange('orange')
分析步骤:
- colorChange方法是静态的。 静态方法仅在创建它们的构造函数中存在,并且不能传递给任何子级。
- 由于freddie是一个子级对象,函数不会传递,所以在freddie实例上不存在freddie方法:抛出TypeError-语法错误。
总结
在做面试题时,一定要小心抽丝剥茧。一定要注意到参数与普通的声明变量的区别。const的特征以及静态方法的特点。