ES5:
**一:**use strict:严格模式。
1:在es5之前,给未声明的变量赋值,会在全局创建变量,造成全局污染,启用严格模式则会报错。
2:在es5之前,有时执行一段代码时,没执行成功,但是不报错(静默失败),在严格模式下会将静默失败提升为报错。
3:普通函数调用中的this不再指向window,而是undefined
4:强烈不建议使用递归(效率太低)
//斐波那契数列:
function fei(num){
if(num<3) return 1
else
//在函数内使用本函数名,紧耦合,不建议
// return fei(num-1)+fei(num-2)
return arguments.callee(num-1)+arguments.callee(num-2)//建议,但严格模式下被禁用
}
console.log(fei(100))
用循环代替递归计算斐波那契数列
// f1 f2 fn
// 1 1 2
// 1 2 3
// 2 3 5
// 3 5 8
function fei(n){
var f1=1,f2=1,fn
for(var i=3;i<=n;i++){
fn=f1+f2
f1=f2
f2=fn
}
return fn
}
console.log(fei(100))
二:保护对象
call,apply,bind
call和apply的区别:都是立刻调用函数一次,并临时绑定this。call只能一个一个传参,而apply可以将数组作为参数传入。
var nums = [2,3,4,5]
console.log(Math.max.apply(null,nums))//本案例不需要this,所以第一个参数写null;
bind:永久绑定。将传入参数的方法赋给调用的方法。需要再调用一次方法。
var a=10
var obj={
a:20,
fun:function(){
var a=30
console.log(this.a)
}
}
setTimeout(obj.fun,1000)//10
分析:obj.fun就是将function放到了这里,当一秒后执行时与obj再无关系。指向window。
setTimeout(obj.fun.bind(obj),1000)//20
重写indexOf方法。
因为indexOf是es5里的方法,低版本浏览器不支持(IE6之前)。
var arr = [3,1,3,2,5,4,3,6]
Array.prototype.myIndexOf=function(num,starti){
//设置默认参数
if(starti===undefined) starti=0
for(var i = starti;i<this.length;i++){
if(this[i]==num)
return i
}
return -1
}
console.log(arr.myIndexOf(3,1))
重写forEach():
var arr = [3,22,4,5]
Array.prototype.myForEach=function(callback){
for(var i=0;i<this.length;i++){
callback(this[i],i,this)
}
}
arr.myForEach(function(elem,i,arr){
return arr[i]*=2
})
console.log(arr)
重写map()
var arr = [3,22,4,5]
Array.prototype.myMap=function(callback){
var newArr = []
for(var i=0;i<this.length;i++){
newArr[i] = callback(this[i],i,this)
}
return newArr
}
arr1 = arr.myMap(function(elem,i,arr){
return elem+=2
})
console.log(arr)
console.log(arr1)
以上方法不够严谨,因为数组可能是稀疏数组,如:[1,,2,,3],这个数组的下标是0,2,4,如果用以上方法,则下标是0,1,2,3,4
修改:
var arr = [3,,22,,4,5]
Array.prototype.myMap=function(callback){
var newArr = []
for(var i=0;i<this.length;i++){
if(this[i]!==undefined)//增加这一句话。
newArr[i] = callback(this[i],i,this)
}
return newArr
}
arr1 = arr.myMap(function(elem,i,arr){
return elem+=2
})
console.log(arr)
console.log(arr1)