1、js基本数据类型:string、number、boolean、null、undefined、bigint、symbol 引用数据类型 object
2、typeof 能区分数据类型,返回结果有 string、number、boolean、undefined、object、function、symbol
instanceof 只能判断引用类型(array、object、function),无法判断基本数据类型(string、number、boolean),判断对象的原型链上是否存在构造函数的原型,常用来判断A是否是B的实例, 返回结果只有true 、false
3、隐式类型转换:
加法: 一方有string,另一方也会被转成string;一方有number,另一方为原始值类型,则将原始值类型转换为number;一方有number,另一方为引用类型,双方都转为string
- * / 都会将非number 转为number
==:NaN 不等于任何类型, null == undefined,null 、undefined与任何类型进行比较结果都为 false,boolean 与 其他类型进行比较 boolean转换为number, string和number进行比较, string转换为 number
4、事件循环机制:代码开始执行时,script会作为宏任务开始执行,执行过程中,同步任务会立刻执行,异步任务会根据任务类型分为宏任务和微任务,分别注册到宏任务和微任务队列中,同步任务执行完,会去微任务队列执行,微任务队列执行完(包括微任务产生的新的微任务)会去宏任务列表执行第一个宏任务,宏任务执行完,去执行微任务列表......
宏任务和微任务分类
5、call 、apply、 bind:
call 和 apply 的第一个参数相同,就是指的上下文,call 可以有多个参数,第一个参数后面的所有参数就是需要传入的值,apply只有两个参数,第二个参数是一个数组,数组里可以存放需要传入的值。
call和apply是立刻执行,bind会绑定上下文的函数,不会立刻执行,bind和call的参数一致
6、防抖和节流:防抖是在高频操作之后只会执行最后一次,节流是每隔一段时间执行一次,将高频操作改为低频操作
7、arguments:arguments是一个类数组对象,用来存储实际传递给函数的参数
8、DOM、BOM:
DOM(document object modal):文档对象模型,提供操作页面元素的方法和属性
BOM(browser object modal):浏览器对象模型,提供操作浏览器的方法和属性
BOM的核心是window, window对象包含属性:document、frames、history、location、navigator、screen
document根节点包含子节点:forms、images、layers、links、anchors等
BOM包含了DOM(对象),浏览器提供出来给予访问的是BOM对象,从BOM对象再访问到DOM对象,从而js可以操作浏览器以及浏览器读取到的文档。
9、事件委托:像一个ul 下面有一万个li的时候,点击li标签如何捕捉到哪个li出发的点击事件?监听ul上的点击事件,由于冒泡机制,点击了li会冒泡到ul,就会出发ul上的点击事件,在通过target就可以获取到实际触发的li。
function colorChange(e){
var e=e||window.event;//兼容性的处理
if(e.target.nodeName.toLowerCase()==="li"){
box.innerHTML="该颜色为 "+e.target.innerHTML;
}
}
color_list.addEventListener("click",colorChange,false)
10、查询某个对象是否有某个属性的方法
对象的hasOwnProperty(),判断自有属性是否存在
11、判断数据类型的方法:Object.prototype.toString.call()
12、构造函数和普通函数的区别:
调用方式不同,构造函数通过new 来创建实例,普通函数可以直接调用
this指向不同,构造函数this指向它的创建对象,普通函数严格模式下指向undefined,非严格模式下指向的是window
13、this指向:
- 默认绑定:this严格模式下指向undefined,非严格模式下指向的是全局对象window
- 隐式绑定:满足XXX.fn()的格式,fn的this指向的是XXX。如果存在链式调用,this永远指向最后调用它的那个对象。
- 显示绑定:通过call、apply、bind来改变this指向
- new绑定:通过new来调用构造函数,构造函数this指向它的创建对象
- 箭头函数的this:箭头函数没有this,他的this是通过作用域链查询到外部作用域的this
14、原型和原型链
15、js继承
- 原型链继承
function Parent () {
this.name = 'kevin';
}
Parent.prototype.getName = function () {
console.log(this.name);
}
function Child () {
}
Child.prototype = new Parent();
var child1 = new Child();
console.log(child1.getName()) // kevin
缺点:1、引用类型的属性被所有实例共享(parent属性被child实例共享)例如:
function Parent () {
this.names = ['kevin', 'daisy'];
}
function Child () {
}
Child.prototype = new Parent();
var child1 = new Child();
child1.names.push('yayu');
console.log(child1.names); // ["kevin", "daisy", "yayu"]
var child2 = new Child();
console.log(child2.names); // ["kevin", "daisy", "yayu"]
2、在创建child实例是不可以向parent传递参数
- new构造函数
function Parent () {
this.names = ['kevin', 'daisy'];
}
function Child () {
Parent.call(this);
}
var child1 = new Child();
child1.names.push('yayu');
console.log(child1.names); // ["kevin", "daisy", "yayu"]
var child2 = new Child();
console.log(child2.names); // ["kevin", "daisy"]
优点:1、避免了引用类型属性被所有实例共享
2、可以在Child中向Parent传参
缺点:方法在构造函数定义,每次创建实例都会创建一遍方法
Object.getPrototypeOf()
方法可以用来从子类上获取父类。