ES5,斐波那契

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值