Javascript 笔试题集锦

1.有关this的使用

下面这段代码会输出什么?

var length = 10;
function fn() {
    console.log(this.length);
}
var obj = {
    length: 5,
    method: function(fn) {
        fn();
        arguments[0]();
    }
};
obj.method(fn, 1);

 答案:10,2;

 this是包含它的函数作为方法被调用时所属的对象。

 调用fn()方法的时候,默认是window对象,所以第一方法会输出10;

 使用arguments[0]()方法的时候,调用方法的对象是arguments,此时this指向arguments,我们传递了两个参数,所以输出结果是2

2.var和函数的提前声明

下面这段代码会输出什么?

function fn(a) {
    console.log(a);
    var a = 2;
    function a() {}
    console.log(a);
}
fn(1);

 答案:function a() {},2;

varfunction是会提前声明的,而且function还会优先于var,如果是这样,那上面的代码就等价于:

function fn(a) {
    var a;
    function a() {}
    console.log(a);
    a = 2;
    console.log(a);
}
fn(1);

这样就比较容易理解了,而且我们声明的变量对传入的参数进行了覆盖;

3、局部变量和全局变量

下面这段代码会输出什么?

var f = true;
if (f === true) {
    var a = 10;
}
function fn() {
    var b = 20;
    c = 30;
}
fn();
console.log(a);
console.log(b);
console.log(c);

 答案:10,报错,30;

首先我们先明确一下,只有在函数内定义的变量才是局部变量,在{...}内定义的变量并不一定就是局部变量。但是不管在哪里,如果变量没有通过关键字var声明的变量,都是全局变量。在使用一个没有定义的变量的时候会报错,但是如果使用了一个没有定义的属性的话,只会返回undefined

4、给基本类型数据添加属性

下面这段代码会输出什么?

var a = 10;
a.pro = 10;
console.log(a.pro + a);
var s = 'hello';
s.pro = 'world';
console.log(s + s.pro);

 答案:NaN,helloundefined;

给基本类型数据添加属性并不会报错,但是如果引用该属性,则会返回undefined,10+undefined会返回NaN,而字符串"hello"+undefined时,undefined会被转换成字符串,所以输出了helloundefined

5、判断一个字符串中出现次数最多的字符,并统计次数

下面这段代码会输出什么?

 答案1:hash table 方式:

var s = 'aaabbbcccaaabbbaaa';
var obj = {};
var maxn = -1;
var letter;
for(var i = 0; i < s.length; i++) {
    if(obj[s[i]]) {
        obj[s[i]]++;
        if(obj[s[i]] > maxn) {
            maxn = obj[s[i]];
            letter = s[i];
        }
    } else {
        obj[s[i]] = 1;
        if(obj[s[i]] > maxn) {
            maxn = obj[s[i]];
            letter = s[i];
        }
    }
}
alert(letter + ': ' + maxn);

 答案2:正则表达式方法:

var s = 'aaabbbcccaaabbbaaabbbbbbbbbb';
var a = s.split('');
a.sort();
s = a.join('');
var pattern = /(\w)\1*/g;
var ans = s.match(pattern);
ans.sort(function(a, b) {
    return a.length < b.length;
});;
console.log(ans[0][0] + ': ' + ans[0].length);