js小技巧搜集

1.比较两个对象是否相等
function isEqual(a, b) {
    var aProps = Object.getOwnPropertyNames(a),
        bProps = Object.getOwnPropertyNames(b);
    //1.先比较属性的个数是否相等
    if (aProps.length != bProps.length) {
        return false;
    }
    //2.属性个数相等,再比较每个属性的值是否相等
    for (var i = 0; i < aProps.length; i++) {
        var propName = aProps[i];
        
        if (a[propName] !== b[propName]) {
            return false;
        }
    }
    return true;
}
2.bind、call、apply
  • bind:Function.prototype.bind(context),用于在不调用函数的情况下,将this固定在context上,并返回一个有新的this值的函数。
    用法:
var moneyGorden = {
        name:"gorden",
        money:1000,
        addMoney:function (x) {
            this.money += x;
            console.log(this.name+" has "+this.money) ;
        }
    };
    var moneyJack = {
        name:"jack",
        money:100
    };
    //直接调用
    moneyGorden.addMoney(100);//gorden has 1100
    
    //使用bind
    var newFuntionUseBind = moneyGorden.addMoney.bind(moneyJack);
    newFuntionUseBind(100);//jack has 200
    
    //可以看到bind返回的是一个新函数,原函数不受影响
    moneyGorden.addMoney(100);//gorden has 1200
  • callapply: 与bind不同的是,这两个方法直接修改函数运行时的this值,并且可以给运行的函数传递参数,以参数列表的形式跟在context后面。他们两的不同在于参数传递,call跟一个参数列表,将参数全部列出来,而apply跟一个参数数组。可以记忆为 apply、array都以"a"开头,所以apply跟一个array。

  • 重写bind方法

Function.prototype.bind = Function.prototype.bind || function(context){
      var self = this;
      return function(){
      return self.apply(context, arguments);
    };
}
3. this值的总结 原文在这里
  1. 在全局作用域或者一个匿名函数中,this指向window对象
  2. 严格模式下,在一个立即执行函数(IIFE)中thisundifined,需要将window作为参数传入。
  3. 当在一个对象的环境(context)中执行函数市,this的值就指向这个对象
  4. setTimeOut中,this指向全局对象
  5. 使用构造函数创建一个对象时(使用new关键字),this指向这个新创建的对象
  6. 使用bindcall、apply指定this的值
  7. 在dom事件处理的handler中,this指向触发事件的元素

你可能感兴趣的:(js小技巧搜集)