JS总结

52 阅读3分钟

JavaScript概述

JS是一门单线程解释性语言;

JavaScript = ECMAScript + WebApi(DOM + BOM)

1. js为什么是单线程的?
因为JS是运行在浏览器的渲染主线程中的,而渲染主线程只有一个,所以js是单线程的

2. js是通过什么实现异步编程的?
事件循环(执行栈、webapi、任务队列(宏、微任务))

三者之间的关系:单线程是异步产生的原因,事件循环是异步的实现方案
常见的异步操作:定时器、事件处理函数、网络通信、promise.then(本质都是回调函数)

基础语法

变量

声明、赋值相分离

数据类型

原始值:number、string、boolean、undefined、null、bigint、symbol

引用值:object

运算符

> ??: 空值合并运算符(undefinednull)
> ?.: 链式操作  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. 箭头函数中没有thisarguments,它里面使用的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

676b8919b83da8ff15d527690cf4c07.jpg