目录
1. 说出以下代码的打印结果:
打印结果:false
解析:当函数当做构造函数调用时,this
指向的是构造函数的实例。但是如果构造函数返回值为一个对象,那么这个构造函数的实例就是这个返回的对象。
所以在此题中,emperor
和puppet
是相等的,emperor.rules
为false
。
2. 说出以下代码的打印结果:
打印结果:
解析:
fn.bind().bind(a)
等于:
从上面的代码可知,无论我们给函数bind
几次,fn
函数的this
永远指向第一次绑定的bind
,所以此题中打印结果是Window
拓展:
- 对于直接调用的函数,
this
永远指向Window
- 对于
obj.fn
,谁调用函数,谁就是this
,这种情况下,this
指向obj
- 对于构造函数
new
来说,this
绑定在构造函数的实例上 - 当这些规则同时出现的时候,根据规则之间的优先级来判断
this
的指向
优先级规则: new
> bind/apply
> obj.fn
> fn
3. ==
和 ===
有什么区别?
对于==
来说,如果双方的数据类型不一样,那就会先进行数据类型转换,在进行比较;而对于===
来说,只有两个数据的数据类型相等,值也相等时才会相等。
两个数据对比的流程:
- 判断两者数据类型是否相等,相等的话就进行值的比较了
- 如果两者不相等,就进行数据类型转换
- 先判断是否是在判断
null
和undefined
,如果是就返回true
- 再判断两者是否是
string
和number
,如果是就将字符串转换为number
- 判断一方是否是
boolean
,如果是先转换为number
,在进行判断 - 判断一方是否是object且另一方是number、string、symbol,是的话就把object转化为原始类型在进行比较:
{name: helloworld} => [object Object]