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
call
、apply
: 与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值的总结 原文在这里
- 在全局作用域或者一个匿名函数中,
this
指向window
对象 - 严格模式下,在一个立即执行函数(IIFE)中
this
是undifined
,需要将window
作为参数传入。 - 当在一个对象的环境(context)中执行函数市,
this
的值就指向这个对象 - 在
setTimeOut
中,this
指向全局对象 - 使用构造函数创建一个对象时(使用
new
关键字),this指向这个新创建的对象 - 使用
bind
、cal
l、apply
指定this的值 - 在dom事件处理的handler中,
this
指向触发事件的元素