1、javascript中的数据类型
基本数据类型:
Number,String,Boolean,Undefined,null
复杂数据类型:
object,Array等
基本数据类型的数据直接存储在栈中,而复杂数据类型存储在堆中
PS:栈内存是自动分配内存的,而堆内存是动态分配内存的,不会自动释放的,所以每次使用完对象的时候都要设置为null,从而减少无用内存的消耗
2、判断数据类型的几种方法
- typeof
- instanceof
- constructor
- object.prototype.toString.call()
3、== 和 === 有什么区别
=== 是全等,会比较两边的数据类型和值的大小
== 是相等 两边类型相同,比较大小,两边类型不同
4、call、apply、bind的区别
call:
- 非严格模式:如果不传参数,或者第一个参数是null或undefined,this都指向window
- 严格模式:第一个参数是谁,this就指向谁,包括null和undefined,如果不传参数this就是undefined
apply:
- 和call基本一致,区别在于apply需要把传递的参数放入数组
bind:
- 语法和call一模一样,区别在于bind只改变指向,不调用函数,参数为单个的值
5、字面量创建对象和new创建对象有什么区别?
字面量:
- 字面量创建对象更简单,方便阅读
- 不需要作用解析,速度更快
new内部:
- 创建一个新对象
- 使新对象的__proto__指向原函数的prototype
- 改变this指向(指向新的obj)并执行该函数,执行结果保存起来作为result
- 判断执行函数的结果是不是null或undefined,如果是则返回之前的新对象,如果不是则返回result
6、什么是闭包?怎么解决闭包
闭包:
函数嵌套函数
函数内部可以引用函数外部的参数和变量
参数和变量不会被垃圾回收机制回收
解决办法:1.立即执行函数 2. let声明变量----let定义变量
7、原型链
原型链:
多个__proto__组成的集合成为原型链
所有实例的__proto__都指向他们的构造函数prototype
所有的prototype都是对象,自然它的__proto__指向的是object()的prototype
所有的构造函数的隐式原型指向的都是Function()的显示原型
Object的隐式原型是null
8、JS中的常用的继承方式有哪些?
原型继承、类继承、ES6中的extend<