JavaScript概述
JS是一门单线程解释性语言;
JavaScript = ECMAScript + WebApi(DOM + BOM)
1. js为什么是单线程的?
因为JS是运行在浏览器的渲染主线程中的,而渲染主线程只有一个,所以js是单线程的
2. js是通过什么实现异步编程的?
事件循环(执行栈、webapi、任务队列(宏、微任务))
三者之间的关系:单线程是异步产生的原因,事件循环是异步的实现方案
常见的异步操作:定时器、事件处理函数、网络通信、promise.then(本质都是回调函数)
基础语法
变量
声明、赋值相分离
数据类型
原始值:number、string、boolean、undefined、null、bigint、symbol
引用值:object
运算符
> ??: 空值合并运算符(undefined、null)
> ?.: 链式操作 res?.data ?? {}
> typeof: 返回对应数据的数据类型('number'、'string'、'boolean'、'undefined'、'object'、'function')特殊:typeof null === 'object' typeof a === "undefined"
> a instanceof B:a对象的原型链上有没有B的原型
函数
普通函数、构造函数、立即执行函数、箭头函数
设计函数的时候需要着重考虑是否需要参数和返回值
对象
## 创建
- 字面量
- Object.create(原型) 创建的对象原型指向指定原型,如果没有指定原型则默认指向Object.prototype
## 增
- obj.abc = 1
- Object.defineProperty(obj, 'abc', {value:1,writable: true, // 默认false不可改变})
## 删
- delete obj.abc
## 改
- obj.abc = 2;
- Object.defineProperty(obj, 'abc', {value:1234})
## 查
- obj.abc
## 遍历
- for...in
## 静态属性和方法
- Object.defineProperty(obj, prop, {value: "123"}) 在指定对象上定义一个新属性或修改其现有属性,并返回此对象
- Object.getOwnPropertyDescriptor(obj, prop) 返回指定对象上的指定属性的描述
- Object.getPrototypeOf(obj) 返回指定对象的原型
- Object.setPrototypeOf(obj, prototype) 将指定对象的原型修改为指定原型
- Object.hasOwn(obj, prop) 指定的对象自身是否有指定的属性 `取代` Object.prototype.hasOwnProperty()
- Object.assgin()
- Object.create(指定原型) // 不指定默认为Object.prototype
- Object.entries()
- Object.keys()
- Object.values()
## 成员属性和方法
数组
字符串
日期
正则
核心概念
JS执行三部曲
语法分析、预编译、解释执行
预编译
GO、AO(函数声明整体提升,变量声明提升)
作用域、作用域链
全局作用域、函数作用域、块级作用域
原型、原型链
对象的隐式原型:proto,构造函数的显示原型:Fn.prototype
继承
// 圣杯模式
const inherit = (() => {
const F = function(){};
return function (Origin, Target){
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototype.uber = Origin.prototype;
}
})()
this指向
## this指向
1. 函数中的this,指向被调用者
2. setTimeout setInterval 中的this指向window
3. 函数作为构造函数被new关键字调用时,函数中的this指向构造出的新对象
4. 箭头函数中没有this和arguments,它里面使用的this是当前箭头函数所处的执行期上下文中的this
## 改变this指向
call、aplly、bind
相同点:都可以改变this指向
不同点:call 和 aplly 传参列表不同,bind不会调用函数会返回一个新函数,call和aplly会调用函数
异步、事件循环
## js中的异步
计时器、事件处理函数、网络通信、promise.then (本质都是回调函数)
## 事件循环
处理异步的一个过程称之为事件循环。
js代码会放在执行栈中执行,遇到异步操作会交给对应的webapi处理,处理完毕会将异步操作包装成一个异步任务推送到任务队列中,等到执行栈中的代码执行完毕,任务队列中的任务会依次推送到执行栈中执行。
DOM(文档对象模型)
- 创建、插入、删除、修改(元素样式、内容)元素
- 给元素绑定事件
- 事件流:事件冒泡、事件捕获、目标源
BOM(浏览器对象模型)
- history
- location
- setTimeout、clearTimeout / setInterval、clearInterval
- localStorage / sessionStorage
- cookie