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);
```