javascript常见面试题总结

问题1:创建“内置”方法

给String对象定义一个repeatify方法。该方法接收一个整数参数,作为字符串重复的次数,最后返回重复指定次数的字符串。例如:

1
2
var str = 'hello';
console.log(str.repeatify(3));

输出应该是: hellohellohello

答案:

1
2
3
4
5
6
7
8
9
String.prototype.repeatify = String.prototype.repeatify || function (times) {
var str = '';

for (var i = 0; i < times; i++) {
str += this;
}

return str;
};

问题2:this

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var fullname = 'paul';

var obj = {

fullname: 'kobe',

prop: {

fullname: 'bryant',

getFullname: function() {

return this.fullname;

}
}
};

console.log(obj.prop.getFullname());

var test = obj.prop.getFullname;

console.log(test());
```
**答案:** 代码输出:bryant 和 paul

### 问题3:call()和apply()

修复前一个问题,让最后一个console.log() 打印输出bryant
**答案:**

```js

console.log(test.call(obj.prop))
console.log(test.apply(obj.prop))

追加提问,call和apply的区别

问题4: 闭包

1
2
3
4
5
6
7
for (var i = 0; i < 3; i++) {
setTimeout(function() {
console.log(i);
console.log(0);
}, 1000);
console.log(5);
}

答案:
5
5
5
3
0
3
0
3
0

追加提问:如果想输出:
5
5
5
0
0
1
0
2
0
答案1: 严格模式下,var改成let
答案2: 闭包

1
2
3
4
5
6
7
8
9
10
for(var i = 0; i < 3; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
console.log(0);
}, 1000);
})(i)

console.log(5)
}

问题5: 声明提前

1
2
3
4
5
6
7
8
9
10
11
function test() {
console.log(a);
console.log(foo());

var a = 1;
function foo() {
return 2;
}
}

test();

答案: undefined 2
变量和函数的声明都被提前至函数体的顶部,而同时变量并没有被赋值。因此,当打印变量a时,它虽存在于函数体(因为a已经被声明),但仍然是undefined。换句话说,上面的代码等同于下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
function test() {
var a;
function foo() {
return 2;
}

console.log(a);
console.log(foo());

a = 1;
}

test();

问题6:递归

1
2
3
4
5
6
7
8
9
10
function test(n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return test(n-1) + test(n-2);
}
console.log(test(5));

改成非递归的形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function test2(n) {
var arr = [0, 1];

for (var i = 2; i <= n; i++) {
arr.push(arr[i-1] + arr[i-2]);
}
return arr[n];
}
console.log(test2(5))


function test3(n) {
var obj = {};
obj[0] = 0;
obj[1] = 1;

for(var i = 2; i <=n; i++) {
obj[i] = obj[i-1] + obj[i-2];
}
return obj[n];
}
console.log(test3(5))