面试题记录
面试题
代码执行类
1.写出以下代码输出结果
var a = 1;
if(true) {
var b = 2;
}
function foo() {
var c = 3;
}
foo()
console.log('a:', a)
console.log('b:', b)
console.log('c:', c)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
查看答案
结果:
- a: 1
- b: 2
- Uncaught ReferenceError: c is not defined
这是因为
foo()
函数内定义的c
具有局部作用域,在其作用域外无法访问c
,所以抛出c
未定义的错误。
2.请写出以下输出结果
function Foo(){
getName = function(){alert(1+'1');};
return this;
}
Foo.getName = function(){alert(typeof null);};
Foo.prototype.getName = function(){alert(NaN === NaN);};
var getName = function(){alert(parseInt('1234S'));};
function getName(){alert(4 && 5);};
//请写出一下输出结果
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
查看答案
结果:
function Foo(){ //构造函数
getName = function(){alert(1+'1');};
return this;
}
Foo.getName = function(){alert(typeof null);}; //静态方法
Foo.prototype.getName = function(){alert(NaN === NaN);}; //原型方法
var getName = function(){alert(parseInt('1234S'));}; //全局方法
function getName(){alert(4 && 5);}; //全局方法
//请写出一下输出结果
Foo.getName(); // object,弹出(typeof null)的结果
getName(); // 1234,最后一个全局方法函数声明提前,被倒数第二个只是变量声明提前的全局方法覆盖
Foo().getName(); // 11,无实例化地执行构造函数,构造函数内getName覆盖全局方法,并return了window,最后为:window.getName(),弹出11
getName(); // 11,全局方法已被上一步的构造函数内的方法覆盖
new Foo.getName(); // object,在这行执行代码中,'.'的优先级比'new'高,所以先执行Foo.getName(),弹出object,无返回值,new失效
new Foo().getName(); // false,有了()后,new Foo()就是调用构造函数了,比'.'优先级高,所以调用的是原型方法,结果应为 false
new new Foo().getName(); // false,先执行中间的new Foo()调用构造函数,然后执行 ' . ' 后的方法,即原型方法,然后再执行前面已经没有意义的new
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
3.下面代码输出什么
const shape = {
radius: 10,
diameter() {
return this.radius * 2;
},
perimeter: () => 2 * Math.PI * this.radius
};
shape.diameter();
shape.perimeter();
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- A:
20
and62.83185307179586
- B:
20
andNaN
- C:
20
and63
- D:
NaN
and63
查看答案
结果:B
请注意,diameter
是普通函数,而perimeter
是箭头函数。
对于箭头函数,this
关键字指向是它所在上下文(定义时的位置)的环境,与普通函数不同! 这意味着当我们调用perimeter
时,它不是指向shape
对象,而是指其定义时的环境(window
)。没有值radius
属性,返回undefined
。