10道典型的JavaScript面试题(一)
2017-03-20 17:32
393 查看
转载自:http://www.css88.com/archives/7052
问题1: 作用域(Scope)
(function() {
var a = b = 5;
})();
console.log(b);
控制台(console)会打印出什么?
上述代码会打印出
这个问题的陷阱就是,在立即执行函数表达式(IIFE)中,有两个赋值,但是其中变量
这个问题另一个陷阱就是,在函数中没有使用”严格模式” (
严格模式开启,那么代码就会报错 ” Uncaught ReferenceError: b is not defined” 。请记住,如果这是预期的行为,严格模式要求你显式地引用全局作用域。所以,你需要像下面这么写:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);
问题2: 创建 “原生(native)” 方法
在
console.log('hello'.repeatify(3));
应该打印出
一个可行的做法如下:
String.prototype.repeatify = String.prototype.repeatify || function(times) {
var str = '';
for (var i = 0; i < times; i++) {
str += this;
}
return str;
};
这个问题测试了开发人员对 javascript 中继承及原型(
在这里,另一个关键点是,看你怎样避免重写可能已经定义了的方法。这可以通过在定义自己的方法之前,检测方法是否已经存在。
当你被问起去扩展一个Javascript方法时,这个技术非常有用。
问题3: 变量提升(Hoisting)
执行以下代码的结果是什么?为什么?
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
这段代码的执行结果是
这个结果的原因是,变量和函数都被提升(hoisted) 到了函数体的顶部。因此,当打印变量
function test() {
var a;
function foo() {
return 2;
}
console.log(a);
console.log(foo());
a = 1;
}
test();
问题4: 在javascript中,`this`是如何工作的
以下代码的结果是什么?请解释你的答案。
var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: {
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.fullname;
}
}
};
console.log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console.log(test());
这段代码打印结果是:
在第一个
问题5: call() 和 apply()
修复前一个问题,让最后一个
这个问题可以通过运用
function.call和function.apply之间有和区别?。 下面的代码中,我用了
console.log(test.call(obj.prop));
问题1: 作用域(Scope)
(function() {
var a = b = 5;
})();
console.log(b);
控制台(console)会打印出什么?
上述代码会打印出
5。
这个问题的陷阱就是,在立即执行函数表达式(IIFE)中,有两个赋值,但是其中变量
a使用关键词
var来声明。这就意味着
a是这个函数的局部变量。与此相反,
b被分配给了全局作用域(译注:也就是全局变量)。
这个问题另一个陷阱就是,在函数中没有使用”严格模式” (
'use strict';)。如果
严格模式开启,那么代码就会报错 ” Uncaught ReferenceError: b is not defined” 。请记住,如果这是预期的行为,严格模式要求你显式地引用全局作用域。所以,你需要像下面这么写:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);
问题2: 创建 “原生(native)” 方法
在
String对象上定义一个
repeatify函数。这个函数接受一个整数参数,来明确字符串需要重复几次。这个函数要求字符串重复指定的次数。举个例子:
console.log('hello'.repeatify(3));
应该打印出
hellohellohello.
一个可行的做法如下:
String.prototype.repeatify = String.prototype.repeatify || function(times) {
var str = '';
for (var i = 0; i < times; i++) {
str += this;
}
return str;
};
这个问题测试了开发人员对 javascript 中继承及原型(
prototype)属性的知识。这也验证了开发人员是否有能力扩展原生数据类型功能(虽然不应该这么做)。
在这里,另一个关键点是,看你怎样避免重写可能已经定义了的方法。这可以通过在定义自己的方法之前,检测方法是否已经存在。
当你被问起去扩展一个Javascript方法时,这个技术非常有用。
问题3: 变量提升(Hoisting)
执行以下代码的结果是什么?为什么?
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
这段代码的执行结果是
undefined和
2。
这个结果的原因是,变量和函数都被提升(hoisted) 到了函数体的顶部。因此,当打印变量
a时,它虽存在于函数体(因为
a已经被声明),但仍然是
undefined。换言之,上面的代码等同于下面的代码:
function test() {
var a;
function foo() {
return 2;
}
console.log(a);
console.log(foo());
a = 1;
}
test();
问题4: 在javascript中,`this`是如何工作的
以下代码的结果是什么?请解释你的答案。
var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: {
fullname: 'Aurelio De Rosa',
getFullname: function() {
return this.fullname;
}
}
};
console.log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console.log(test());
这段代码打印结果是:
Aurelio De Rosa和
John Doe。原因是,JavaScript中关键字
this所引用的是函数上下文,取决于函数是如何调用的,而不是怎么被定义的。
在第一个
console.log(),
getFullname()是作为
obj.prop对象的函数被调用。因此,当前的上下文指代后者,并且函数返回这个对象的
fullname属性。相反,当
getFullname()被赋值给
test变量时,当前的上下文是全局对象
window,这是因为
test被隐式地作为全局对象的属性。基于这一点,函数返回
window的
fullname,在本例中即为第一行代码设置的。
问题5: call() 和 apply()
修复前一个问题,让最后一个
console.log()打印输出
Aurelio De Rosa.
这个问题可以通过运用
call()或者
apply()方法强制转换上下文环境。如果你不了解这两个方法及它们的区别,我建议你看看这篇文章
function.call和function.apply之间有和区别?。 下面的代码中,我用了
call(),但
apply()也能产生同样的结果:
console.log(test.call(obj.prop));
相关文章推荐
- 10道典型的JavaScript面试题
- 10道典型的JavaScript面试题
- 10道典型的JavaScript面试题
- 10道典型的JavaScript面试题
- 10道典型的JavaScript面试题
- 10道典型的JavaScript面试题
- 10道典型的JavaScript面试题+5道JavaScript基础面试题
- 10道典型的JavaScript面试题
- 5个典型的JavaScript面试题(上)
- 5个典型的JavaScript面试题
- 5个典型的JavaScript面试题
- 5个典型的JavaScript面试题
- 5个典型的JavaScript面试题
- 五个典型的JavaScript面试题
- 5个典型的JavaScript面试题
- 每一个JavaScript开发者都应该知道的10道面试题
- 5个典型的JavaScript面试题(上)
- 5个典型的JavaScript面试题
- 数组名与指针典型面试题的分析(2)
- 分析两道javascript面试题-主要考查的是javascript基本语法知识