一、变量类型
1、js的数据类型
基本数据类型:undefined、null、Boolean、string、number、symbol(es6新增,表独一无二的值)
引用数据类型:数组、对象、函数。(统称为object对象)
题目:基本类型和引用类型的区别?
在参数传递方式上,有所不同:简单类型参数传递的是值,引用类型传递的是地址。
2.数据类型的判断
1)typeof:返回一个表示数据类型的字符串,返回结果包括:number、string、boolean、object、undefined、function、symbol等七种数据类型,但不能判断null、array等。
2)instanceof:是用来判断A是否为B的实例,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,但它不能检测null 和 undefined
3)constructor
constructor作用和instanceof非常相似。但constructor检测 Object与instanceof不一样,还可以处理基本数据类型的检测。不过函数的 constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor给覆盖了,这样检测出来的结果就是不准确的。
4)Object.prototype.toString.call()
Object.prototype.toString.call() 是最准确最常用的方式。
3.浅拷贝与深拷贝
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
深拷贝就是在拷贝的同时,将数据的所有引用结构都拷贝一份。
二、作用域和闭包
1、作用域和作用域链
2、闭包是什么:
闭包的作用:使用闭包可以访问函数中的变量。可以使变量长期保存在内存中,生命周期比较长。
闭包主要有两个应用场景:函数作为参数传递。函数作为返回值。
三、异步
1.同步 vs 异步
同步,我的理解是一种线性执行的方式,执行的流程不能跨越。
异步,是一种并行处理的方式,不必等待一个程序执行完,可以执行其它的任务。
2.Event Loop (事件循环)
四、原型链与继承
1.原型和原型链
原型:在JavaScript中原型是一个prototype对象,用于表示类型之间的关系。
原型链:对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。
2.继承(六种继承方式)
1、原型链+借用构造函数的组合继承 以上继承的方式核心是在子类的构造函数中通过 Parent.call(this) 继承父类的属性,然后改变子类的原型为 newParent() 来继承父类的函数。
2、寄生组合继承:这种继承方式对上一种组合继承进行了优化。继承实现的核心就是将父类的原型赋值给了子类,并且将构造函数设置为子类,这样既解决了无用的父类属性问题,还能正确的找到子类的构造函数。
3、ES6中class 的继承:class可以通过extends关键字实现继承,还可以通过static关键字定义类的静态方法。class关键字只是原型的语法糖,JavaScript继承仍然是基于原型实现的。