javascript鄙视题

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


第一次输出10应该没有问题。我们知道取对象属于除了点操作符还可以用中括号,所以第二次执行时相当于arguments调用方法,this指向arguments,而这里传了两个参数,故输出arguments长度为2。

变量声明

1

console.log(typeof fn);
function fn(){};
var fn;

function


函数声明优于变量声明。我们知道在代码逐行执行前,函数声明和变量声明会提前进行,而函数声明又会优于变量声明,这里的优于可以理解为晚于变量声明后,如果函数名和变量名相同,函数声明就能覆盖变量声明。所以以上代码将函数声明和变量声明调换顺序还是一样结果。
.

2

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

function a() {} 2


var和function是会提前声明的,而且function是优先于var声明的(如果同时存在的话),所以提前声明后输出的a是个function,然后代码往下执行a进行重新赋值了,故第二次输出是2。

3变量隐式声明

if('a' in window){
    var a = 10;
}
alert(a);

10


function和var会提前声明,而其实{…}内的变量也会提前声明。于是代码还没执行前,a变量已经被声明,于是 ‘a’ in window 返回true,a被赋值。

给基本类型添加属性,不报错,但是取值是undefined

···
var a = 10;
a.pro = 10;
console.log(a.pro + a);

var s = ‘hello’;
s.pro = ‘world’;
console.log(s.pro + s);
···

NaN
undefined


给基本类型数据加属性不报错,但是引用的话返回undefined,10+undefined返回NaN,而undefined和string相加时转变成了字符串。

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

```哈希表
var s='aaabbbcccaaabbbaaa';
var obj = {};
var maxn = -1;
var letter;
for(var i=0;is.length;i++){
if(obj[s[i]]){
    obj[s[i]]++;
    if(obj[s[i]]>maxn){
        maxn = obj[s[i]];
        letter=s[i];
    }
}else{
    maxn=obj[s[i]];
    letter = s[i];
}
}alter(letter+":"+maxn);
```

```正则表达式
var s='aaabbbcccaaabbbaaa';
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);
```

猜你喜欢

转载自blog.csdn.net/sinat_34591693/article/details/81411616