1.JS基础
1.原始类型有哪几种?分别是?null是对象么?
在 JS 中,存在着 6 种原始值:
boolean
null
undefined
number
string
symbol
虽然 typeof null
会输出 object
但是这只是 JS 存在的一个悠久 Bug
2.引用类型和原始类型的不同之处?函数参数是引用类型会发生什么问题?
引用类型和原始类型不同的是,原始类型存储的是值,引用类型存储的是地址(指针),当改变函数引用类型参数的值,则原来的引用对象中的值也会随之发生变化。
3.typeof 是否能正确判断类型?instanceof 能正确判断对象的原理是什么?
typeof
对于原始类型来说,除了 null
都可以显示正确的类型,typeof
对于对象来说,除了函数都会显示 object,instanceof内部机制是通过原型链来判断的。
扩展:可以使用toString方式判断类型
function typeOf(obj) {
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
}
4.如何正确判断 this?箭头函数的 this 是什么?
显示绑定:call、apply、bind指向绑定的对象。
隐式绑定:
- 全局上下文:全局上下文默认this指向window, 严格模式下指向undefined。
- 直接调用函数:this相当于全局上下文的情况
- 对象.方法的形式调用:谁调用这个方法,它就指向谁
- DOM事件绑定(特殊):onclick和addEventerListener中 this 默认指向绑定事件的元素。IE比较奇异,使用attachEvent,里面的this默认指向window。
- new构造函数绑定:此时构造函数中的this指向实例对象
- 箭头函数:箭头函数没有this, 因此也不能绑定。里面的this会指向当前最近的非箭头函数的this,找不到就是window(严格模式是undefined)
5.==和===的区别
===是值和类型都相等才会返回true
==首先会判断两者类型是否相同,相同的话就是比大小了,类型不相同的话,那么就会进行类型转换。
6.如何理解原型?如何理解原型链?
Object
是所有对象的爸爸,所有对象都可以通过__proto__
找到它Function
是所有函数的爸爸,所有函数都可以通过__proto__
找到它- 函数的 prototype 是一个对象,也就是原型
- 对象的
__proto__
属性指向原型,__proto__
将对象和原型连接起来组成了原型链
在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会天生自带一个prototype属性,这个属性指向函数的原型对象。
当函数经过new调用时,这个函数就成为了构造函数,返回一个全新的实例对象,这个实例对象有一个proto属性,指向构造函数的原型对象。
实例的proto属性与构造函数的prototype属性都是指向原型对象,原型对象的constructor属性又是指向构造函数
JavaScript对象通过proto 指向父类的原型对象,直到指向Object的原型对象为止,这样就形成了一个原型指向的链条, 即原型链。