isPrototypeOf & instanceof
A.isPrototypeOf(B)
判断的是A对象是否存在于B对象的原型链之中
A instanceof B
判断的是B.prototype
(原型对象)是否存在与A的原型链之中
结论:
如果 A.isPrototypeOf(B)
返回true
则B instanceof A
一定返回true
==和===的区别
简单来说,==在比较的时候,会发生数据类型转换,而===不会发生类型转换,也就是说,对于===的话,会先判断是否是同一个类型,如果不是的话,直接返回false,而==的话呢,如果不是同一个类型,则会先根据一些规则,把他们转换成同种类型的,然后再进行比较。
对于==的话,究竟都是根据哪些规则来转换的呢?
1. 如果相比较的两个操作数,其中一个是数字类型,另一个是字符串类型的话,那么字符串将会转换为数字,再进行比较
也就是说
"1111" == 1111
等价于 Number("1111") == 1111
2. 如果操作数中,有布尔类型的,那么他将会转为数字类型
也就是说,true == 12
等价于 Number(true) == 12
,所以结果为false
3. 如果比较的两个操作数,一个是undefined
另一种是null
,则返回true
undefined == null
的值为true
4. 对于两个操作数,如果其中一个是字符串或数字,另一个是对象的话,那么对象会转为原始值,然后再进行比较
那么对象怎么转换呢?
通常来说,在转换的时候,会先判断对象中是否有valueOf()
函数,有的话,就执行这个,获取到原始值,如果通过valueOf()
函数获取不到原始值,或者这个函数不存在的话,就调用toString()
函数。
看下面这个例子
var obj = {
valueOf() {
return 3;
}
}
console.log(obj == 3); // true