目录

1. 说出以下代码的打印结果:

const puppet = { 
rules: false
};
function Emperor() {
this.rules = true;
return puppet;
}
const emperor = new Emperor();
console.log(emperor.rules)

打印结果:​​false​

解析:当函数当做构造函数调用时,​​this​​指向的是构造函数的实例。但是如果构造函数返回值为一个对象,那么这个构造函数的实例就是这个返回的对象。

所以在此题中,​​emperor​​​和​​puppet​​​是相等的,​​emperor.rules​​​ 为​​false​​。

2. 说出以下代码的打印结果:

let a = {}
let fn = function () { console.log(this) }
fn.bind().bind(a)()

打印结果

【面试题】三道面试题_数据类型


解析:

​fn.bind().bind(a)​​ 等于:

let fn2 = function fn1() {
return function() {
return fn.bind()
}.bind(a)
}
fn2()

从上面的代码可知,无论我们给函数​​bind​​​几次,​​fn​​​函数的​​this​​​永远指向第一次绑定的​​bind​​​,所以此题中打印结果是​​Window​

拓展:

  • 对于直接调用的函数,​​this​​​永远指向​​Window​
  • 对于​​obj.fn​​​,谁调用函数,谁就是​​this​​​,这种情况下,​​this​​​指向​​obj​
  • 对于构造函数​​new​​​来说,​​this​​绑定在构造函数的实例上
  • 当这些规则同时出现的时候,根据规则之间的优先级来判断​​this​​的指向

优先级规则:​new​​​ > ​​bind/apply​​​ > ​​obj.fn​​​ > ​​fn​

3. ​​==​​​ 和 ​​===​​ 有什么区别?

对于​​==​​来说,如果双方的数据类型不一样,那就会先进行数据类型转换,在进行比较;而对于​​===​​来说,只有两个数据的数据类型相等,值也相等时才会相等。

两个数据对比的流程:

  1. 判断两者数据类型是否相等,相等的话就进行值的比较了
  2. 如果两者不相等,就进行数据类型转换
  3. 先判断是否是在判断​​null​​​和​​undefined​​​,如果是就返回​​true​
  4. 再判断两者是否是​​string​​​和​​number​​​,如果是就将字符串转换为​​number​
  5. 判断一方是否是​​boolean​​​,如果是先转换为​​number​​,在进行判断
  6. 判断一方是否是object且另一方是number、string、symbol,是的话就把object转化为原始类型在进行比较:​​{name: helloworld} => [object Object]​
  7. 【面试题】三道面试题_js_02