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;
var
和function
是会提前声明的,而且function
还会优先于var
,如果是这样,那上面的代码就等价于:
function fn(a) {
var a;
function a() {}
console.log(a);
a = 2;
console.log(a);
}
fn(1);
这样就比较容易理解了,而且我们声明的a
变量对传入的参数a
进行了覆盖;
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);