1、原始类型(基本类型)有哪些?null是对象吗?
number、string、null、undefined、Boolean、symbol(ES6新增)
原始类型储存的是值,是没有函数可以调用的。'1'.tostring()做了隐式转换,转换为了String类型,就是字符串的对象包装类型,所以可以调用tostring()函数
null不是对象,虽然typeof null 会输出object,但是这是js的一个悠久bug。在js最初版本中使用的是32位系统,为了性能考虑使用低位储存变量的类型信息,000开头的是对象。而null表示为全零,所以将它错误的判断为object。虽然现在的内部类型代码判断已经改变,但是这个bug一直流传下来
2、对象类型(引用类型)与原始类型有什么区别?函数参数是对象会发生什么问题?
对象类型储存的是个地址,原始类型储存的是值
3、typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么?
typeof能判断除null之外的所有基本类型
instanceof正确判断对象是因为内部机制通过原型链来判断的
valueof()返回对象的原始值
4、如何正确判断this的指向?箭头函数的this是什么?
function foo(){
console.log(this.a) //this--->window
}
a=1
foo()
const obj = {
a:2,
foo:foo
}
obj.foo() //this--->obj
const c =new foo() //---> c
- 对于直接调用foo函数的,不管foo()位于什么位置,this指向都是window
- 对于obj.foo(),谁调用了foo(),this指向就是谁。所以这种情况下this就是obj
-
对于new的方式来说,this被永远绑定在了c上,不会被任何方式改变
this指向流程图,图中流程只针对单个规则:
但是可能会发生多个规则同时出现的情况,这时候不同的规则之间会根据优先级最高的来决定 this 最终指向哪里。
new的方式优先级>bind/apply()/call() >obj.foo() > foo()
箭头函数的this一旦绑定,就不会被任何方式改变