js高级(coderwhy之个人笔记)

Day1

打开终端快捷:(ctrl+`

uploading.4e448015.gif

正在上传…重新上传取消

在终端使用node运行js文件:  使用  node 文件名

快速打开vscode当前目录的终端:

uploading.4e448015.gif

正在上传…重新上传取消

闭包:

闭包定义:函数+访问变量

Javas中的函数+去访问外层变量==闭包

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

闭包作用:

存数据—>函数执行完不销毁

闭包函数的作用:访问外部的数据====JavaScript函数的优点(灵活)

This:

1全局作用域下:

// 在大多数情况下,this都在出现 在函数中

// 全局作用域下

// this指:windowglobalObject

// log(this)==log(window)

console.log(this);

console.log(window);

// Node环境下:[]  this指向空字符串(了解)

console.log(this)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2同个函数不同this指向

uploading.4e448015.gif

正在上传…重新上传取消

3四种this绑定规矩(重点)

规则一:独立函数绑定

uploading.4e448015.gif

正在上传…重新上传取消

规则二:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

书接上回

uploading.4e448015.gif

正在上传…重新上传取消

Apply—call—bind函数调用

规则三:

Call-apply 绑定:指定的this()

uploading.4e448015.gif

正在上传…重新上传取消

Bind绑定

uploading.4e448015.gif

正在上传…重新上传取消

规则四:new绑定

uploading.4e448015.gif

正在上传…重新上传取消

绑定规则优先级

uploading.4e448015.gif

正在上传…重新上传取消

箭头函数:

uploading.4e448015.gif

正在上传…重新上传取消

箭头函数this绑定:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

Day2对象 

作用域:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

With:语句:(了解一下)略

面向对象:

1创建对象:

uploading.4e448015.gif

正在上传…重新上传取消

2对对象属性的操作:

  1. 获取属性,赋值,删除,遍历
  2. definProperty方法精准对对象操作

uploading.4e448015.gif

正在上传…重新上传取消

扩展(了解):关于definproperty的参数二:属性

包括数据属性,存储属性

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

重点:创建对象:

法一:字面量

如上

法二:工厂模式(函数模式):缺点无法获取最真实的对象类型

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

法三:构造函数(重点)

// 规范:(约定熟成)function 函数名()  函数名为大写或驼峰命名法=======构造函数

function Person(name,age,height,address){

this.name=name……..

this.eationg=function(){}

}

//new Person

 var p1 = new Person("张三",18 ,1.99,"广州市")

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

案例分析:

1生成{}对象  2{}赋值给this   3执行代码体  4返回this

uploading.4e448015.gif

正在上传…重新上传取消

具体构造函数创建对象:

uploading.4e448015.gif

正在上传…重新上传取消

对象原型和函数原型(重点)

对象原型

uploading.4e448015.gif

正在上传…重新上传取消

函数原型(函数=<对象)

函数原型运行内存图

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

P1对象中-proto-==person函数原型对象

面向对象原型链和继承的实现:

Js中面向对象:

uploading.4e448015.gif

正在上传…重新上传取消

原型链:

uploading.4e448015.gif

正在上传…重新上传取消

顶部原型:来自()

补充:Object是是所有函数(包括person)的父类---

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

继承:原理(重点)

实现继承:Function .prototype===Object .__proto

uploading.4e448015.gif

正在上传…重新上传取消

(1)原型链实现继承:

详细解读:

uploading.4e448015.gif

正在上传…重新上传取消

实现继承

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

优化继承:借助构造函数继承(解决三个弊端)

(2)构造函数实现继承{调用call、apply函数}

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

具体实现

uploading.4e448015.gif

正在上传…重新上传取消

疑惑:(解决)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

-继承-对象之间的关系最简继承:

uploading.4e448015.gif

正在上传…重新上传取消

(3)原型式

uploading.4e448015.gif

正在上传…重新上传取消

1通过setPrototypeOf设置 一个对象为另一个对象的原型  (实现原型式继承函数)

uploading.4e448015.gif

正在上传…重新上传取消

2优化

(4)寄生式继承

(了解即可)-继承-对象(寄生式)继承:

寄生式原型是es6的新方法:create方法 可以将一个对象 指向 另一个对象的原型

uploading.4e448015.gif

正在上传…重新上传取消

寄生式继承

uploading.4e448015.gif

正在上传…重新上传取消

(5)寄生组合式继承

最终方案:

uploading.4e448015.gif

正在上传…重新上传取消

抽离:封装Object为函数

uploading.4e448015.gif

正在上传…重新上传取消

图解:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

小结:

1继承方法

* 1/js继承

<!-- 1 原型链继承:最原始的方式;缺点不可传参 -->

<!-- 2改进原型链继承 》》 构造函数继承  -->

原理都是:Stu.prototype =new Person()

<!-- 3原型式继承: -->

<!-- 4改进原型式继承:寄生式 -->

es6之前的方法:通过setPrototypeOf 方法:设置 o Object的原型

了解在没有setPrototypeOf 方法时怎么继承 (了解)

<!-- 5改进原型式继承:寄生组合式继承 -->

通过es6新方法create 可以将一个对象 作为(指向) 另一个对象的原型

2原型继承关系图解:

uploading.4e448015.gif

正在上传…重新上传取消

原型上的方法补充和总结:

(4条消息) JavaScript的原型方法_zyk_520的博客-优快云博客_javascript 原型方法

uploading.4e448015.gif

正在上传…重新上传取消

一、hasOwnProperty()

判断是否是对象的属性(非继承属性),无法判断原型链上的属性;返回boolean值,true-是对象的属性;false-不是对象的属性

二、isPrototypeOf() 和instanceof  判断

判断一个对象是否是另一个对象的原型;

常见的面试题instanceof typeOf的区别

三、Obeject.getPrototypeOf() / set PrototypeOf()

获取某个对象的原型对象。

es6之前的方法:通过setPrototypeOf 方法:设置 o Object的原型

四、in/ for in操作符

检测属性是存在于实例还是原型中。

注意:可以和hasOwnProperty()配合使用,判断属性是否是原型中的属性

Day3:es6

了解一下咯

前言:babeljs.io工具-将代码转化低级

uploading.4e448015.gif

正在上传…重新上传取消

例如es6转化-es5

在线官网:Babel · The compiler for next generation JavaScript (babeljs.io)

uploading.4e448015.gif

正在上传…重新上传取消

Es6语法(上):类

1类的定义:

uploading.4e448015.gif

正在上传…重新上传取消

2类的声明和理解:

uploading.4e448015.gif

正在上传…重新上传取消

3类的使用

(1)类中的构造方法:

uploading.4e448015.gif

正在上传…重新上传取消

// 1类的声明+类中构造函数的声明(创建)

class Person {

  // 类的构造方法

  // 注意: 一个类只能有一个构造函数

  // 0.在类的构造方法只能通过 constructor 方法(唯一)

  // 1.在内存中创建一个对象 moni = {}

  // 2.将类的原型prototype赋值给创建出来的对象 moni.__proto__ = Person.prototype

  // 3.将对象赋值给函数的this: new绑定 this = moni

  // 4.执行函数体中的代码

  // 5.自动返回创建出来的对象

  constructor(name, age) {

    this.name = name

    this.age = age

  }

}

// 2调用(同function

var p1 = new Person("why", 18)

var p2 = new Person("kobe", 30)

console.log(p1, p2)

// 小结和疑惑:为什么构造函数会使用 类的方法尼? 因为class这种模式在继承是很简单和方便的

(2)class中的方法使用:(实战)

1》在class中定义类

uploading.4e448015.gif

正在上传…重新上传取消

2》实战:(类的实例方法)

uploading.4e448015.gif

正在上传…重新上传取消

3》类的访问器方法:get、set

4》类的继承一(父类与子类):继承的关键:extends和super的使用

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

5》了解类的继承二(创建类继承自内置类)

6》了解类的继承三(类的混入:使用js技巧实现混入)

Es6语法(中): 字面量/let、、

1字面增强写法:

uploading.4e448015.gif

正在上传…重新上传取消

属性+方法(即可)

uploading.4e448015.gif

正在上传…重新上传取消

2解构(重点)

使开发效率更高

(最常用的)案例:解构传递的function()对象

uploading.4e448015.gif

正在上传…重新上传取消

解构:数组,对象(function)

具体解构看代码去:

1数组解构:(vue3中的map方法常用。。。)

uploading.4e448015.gif

正在上传…重新上传取消

2对象解构:

uploading.4e448015.gif

正在上传…重新上传取消

函数解构

uploading.4e448015.gif

正在上传…重新上传取消

3let/const基本使用:

Const:

uploading.4e448015.gif

正在上传…重新上传取消

//*const==(常量、衡量)   声明是常量:一、const声明后是不可修改的*/

const name="abc"

 name="cba"   //报错

//注意事项一: 具体const本质上传递的值是不可修改

// 二、当如果传递的是一个引用类型(内存地址),可以通过引用找到对应的对象,去修改对应的属性

// 什么是引用类型?==》函数、对象

const obj ={

    foo:"foo"

}

// obj={}     //报错

obj.foo="aaa" //foo:"aaa"

let:和const区别:变量和常量的区别,用法一致

uploading.4e448015.gif

正在上传…重新上传取消

4(了解)作用域提升-var/let/const的区别

Var就有作用域提升

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

因为let/const没有作用域提升:作用域:为当前的块级作用

Var 和let/const区别

uploading.4e448015.gif

正在上传…重新上传取消

小结:var和let/const区别:

1constlet不能重复定义变量,var可以重复定义变量。
2constlet有块级作用域var没有块级作用域。

let和const的区别:

(1)let设置变量,const设置常量(函数、对象、常量)

(const是设置常量,也就是不能改变。const定义的数值字符串的时候值不能改变。
const 定义的对象的时候,对象不能改变,但是对象的属性值可以改变。

(3)let的内存原理:栈内存

     const的内存原理:堆内存

5、ES5作用域和ES6块级作用域

Es5作用域:

uploading.4e448015.gif

正在上传…重新上传取消

Es6块级作用域:

Var无效

// ES6的代码块级作用域

// let/const/function/class声明的类型是有效

{

    let foo = "why"

    function demo() {

      console.log("demo function")

    }

    class Person {}

}

  console.log(foo) // foo is not defined

   demo()          

  var p = new Person() // Person is not defined

全打印不了

块级作用域使用场景:

If/switch/for块级代码 –自带块级作用域

定时器函数setTimout…………

6块级作用域补充:暂时性死区

var/let/const区别和块级作用域图解

uploading.4e448015.gif

正在上传…重新上传取消

Es6新增遍历方法:

For(….of…)

uploading.4e448015.gif

正在上传…重新上传取消

暂时性死区:在声明前变量是无法访问的(为什么const有变量-因为const可以声明对象(包含变量))

uploading.4e448015.gif

正在上传…重新上传取消

Es6语法(下): 字符串模板+es6函数(箭头函数)

1模板字符串的基本使用:

Tab上面的键:``+${拼接对象}

uploading.4e448015.gif

正在上传…重新上传取消

2标签字符串的使用(了解一下)rectify框架使用

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

3Es6函数补充:

Es5之前的默认值:

// Es5之前给函数默认值

// 缺点:

// 1写起来麻烦,还要使用||代码阅读性差

// 2bug:如果传入(0"",log->打印不出来  log(aaa,bbb)

// function  foo(m,n){

//     m=m||"aaa"           //m等于m,“aaa” m没有值即等于 aaa(m默认值==aaa)

//     n=n||"bbb"

//     console.log(m,n);

// }

// // foo()

// foo(0,"")  //aaa,bbb

Es6函数默认值:

// 1.Es6可以给函数参数直接提供默认值

function foo(m="aaa",n="bbb"){

    console.log(m,n);

}

foo(0,"")//0,""

// 2对象参数和默认值以及解构

function printInfo({name,age}={name:"why",age:18}){

    console.log(name,age)

}

printInfo({name:"kobe",age:40})

// 另一种写法

function printInfo1({name="why",age=18}={}){

    console.log(name,age)

}

printInfo1()

作业:给一个对象解构+默认值:

uploading.4e448015.gif

正在上传…重新上传取消

(了解)Es6函数剩余参数:

Es6args替代argument

uploading.4e448015.gif

正在上传…重新上传取消

Es6箭头函数补充:

uploading.4e448015.gif

正在上传…重新上传取消

4Es6中的展开运算符和浅拷贝

1)什么是浅拷贝什么是深拷贝:

(4条消息) 面试题:深拷贝和浅拷贝(超级详细,有内存图)_田江的博客-优快云博客_深拷贝和浅拷贝面试题

2)例子es6展开运算符实现浅拷贝:

浅拷贝:将:info对象的内存地址拷贝一份到obj中(指向同一个地址),

uploading.4e448015.gif

正在上传…重新上传取消

5Es6对象symbol属性(了解一下)

前因:es6之前的对象属性名,添加相同对象属性名会覆盖掉原来的属性和值。

uploading.4e448015.gif

正在上传…重新上传取消

// 3.1在定义对象字面量时使用

// 3.2新增属性

console.log(obj[s1], obj[s2], obj[s3], obj[s4])//注意不能通过。语法获取:console.log(obj.s1)

其他了解一下

6新增数据结构Set使用和weakSet

0)别人的理解:(4条消息) 彻底弄懂ES6中的Map和Set_asteriaV的博客-优快云博客_es6 map set

1)介绍set和map是什么

uploading.4e448015.gif

正在上传…重新上传取消

Set去重:

Set结构转化为数组结构:两种方式

Set常见的方法:size/add/detete/clear/forEach         (数组中的方法==)

2)set的基本使用:

(4条消息) ES6:Set数据结构的使用方法及使用set数组去重_奄奄一息的一条咸鱼的博客-优快云博客_set数据结构去重

uploading.4e448015.gif

正在上传…重新上传取消

set自带的方法:add/delte/has/clear

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

set的具体使用(去重+遍历)

uploading.4e448015.gif

正在上传…重新上传取消

set方法数组去重:推荐使用写法二—》(为啥因为写法一Array.from方法看不太懂)

(掌握)写法二:{set去重的方法(自带、这个结构输出的元素不能重复)}

const num = new Set([1,1,2,3,2,1]);

console.log(num); // 输出:{1, 2, 3} 重复的内容不会被输出

console.log(num.size); // 输出3,重复的内容不记为量         为什么输出3?因为size方法是个数(不包含重复的)

// 利用扩展运算符,将set数据结果转换成数组形式

const newNum = [...num];

console.log(newNum); // 输出: [1, 2, 3]

遍历:

uploading.4e448015.gif

正在上传…重新上传取消

3)了解weakSet的基本使用:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

7新增数据结构Map的使用 和weakMap (使用为0%)

Map:

map和set的区别:map可以使用key来映射对象,set不能

uploading.4e448015.gif

正在上传…重新上传取消

Map的使用:

Map的常用方法:size/detete/clear/set/get/    

// set :设置“why"”eee“--->   key:value

// get(key)   //通过key获取value

console.log(map2.get("why"))   //"eee"

开发中唯一使用的map:将对象作为key

uploading.4e448015.gif

正在上传…重新上传取消

了解weakMap:

8(了解)es6响应式原理-vue3响应式的关系

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

ES6-ES12小结:

基础:类、let/const、模板字符串、解构+默认值、symbol属性

函数方法:类、

          箭头函数

          数组方法: (4条消息) js数组常用方法_on my-own的博客-优快云博客_js数组方法

          es6新增的数据结构set方法和map方法

其他补充:浅拷贝……

Day4(复习)

前言:es7-es12略了

Promise、迭代器、async这些其实也是es6的知识

Proxy-Refect:

前言:proxy-Refect是什么呢?在那使用呢?

uploading.4e448015.gif

正在上传…重新上传取消

  1. 监听对象一:object.defineProperty(api)

     面向对象(原型、原型链的一个api)同时也是vue2的响应式原理

uploading.4e448015.gif

正在上传…重新上传取消

复习一些obj.definProperty使用:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2监听对象二:Proxy

Proxy是Object.defineProperty的进阶( es6中新增的类)。 同时也是vue3的响应式原理

uploading.4e448015.gif

正在上传…重新上传取消

1)proxy的具体使用:

uploading.4e448015.gif

正在上传…重新上传取消

1基本使用:类比obj.dp

uploading.4e448015.gif

正在上传…重新上传取消

2其他捕获器使用:

uploading.4e448015.gif

正在上传…重新上传取消

补充:obj.definePropertyproxy作用和区别

// 3小结:obj.definePropertyproxy作用和区别

//1 obj-为了修改属性:可通过obj.definePropertyproxy方法 {增删改查}

//2 区别:

// 通过Object.defineProperty会将数据属性描述符变成一个访问属性描述符 (然后再进行操作修改)

// name: "why", // 数据属性描述符

// Object.defineProperty(obj, "name", {

// })

// 通过proxy代理就不会 将一个对象中属性数据属性描述符变成一个访问属性描述符(直接通过捕获器实现)

2)proxy所有捕获器(了解)

uploading.4e448015.gif

正在上传…重新上传取消

3)proxy在函数中的调用方式:

uploading.4e448015.gif

正在上传…重新上传取消

3Refect (其实是java的知识-了解)

refect是什么?有什么用?---

比较object上的方法和reflect上的方法:

uploading.4e448015.gif

正在上传…重新上传取消

4vue2和vue3的响应式原理:

0)vue2和vue3原理

(4条消息) 三、【Vue3】——Vue2与Vue3响应式原理区别_YIFEI132的博客-优快云博客_vue2和vue3响应式的区别

(4条消息) 【前端面试题之Vue篇】Object.defineProperty()和Proxy来进行数据劫持有什么不同?_其实我叫二喵同学�的博客-优快云博客_前端面试proxy

1)响应式的实现:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2)优化响应式的实现-响应式依赖的收集

uploading.4e448015.gif

正在上传…重新上传取消

3)优化自动收集响应式对象:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

4)最终优化重构类:

uploading.4e448015.gif

正在上传…重新上传取消

1(优化)数组-》类:

太长了p代码

2(优化)类-》自动监听对象类:

3(最终优化)自动监听对象类:-》重构

太长了p代码

5)vue2和vue3的响应式原理:

vue3

uploading.4e448015.gif

正在上传…重新上传取消

5小结:这章节掌握什么是proxy和object.defineProperty的区别,以及set/get,了解vue2-vue3的响应式原理即可(面试能回答即可)

Promise:(简写看vue2---手写promise

0总结(面试题)

promsie理解:(5条消息) 前端Promise_yin_ping1101的博客-优快云博客_前端promise

promsie实战开发你说你会Promise?那你解决一下项目中的这五个难题? - 掘金 (juejin.cn)

1>理解什么是promise和基本使用

uploading.4e448015.gif

正在上传…重新上传取消

什么是异步

uploading.4e448015.gif

正在上传…重新上传取消

Es6之前异步操作处理:(了解)弊端大

uploading.4e448015.gif

正在上传…重新上传取消

1)什么是promise:

uploading.4e448015.gif

正在上传…重新上传取消

promise的作用:异步编程的使用----常见与网络请求、vue项目的异步编程(api+vuex+组件具体逻辑的编程)

2)Promise的基本使用:

Promise:原理如上同样是传递一个回调函数,但这个回调函数会立即执行,(上面的优化)

格式:

function requestData(url, ) {

return new Promise((resolve,reject)=>{

     setTimeout(() => {

             if (url === "coderwhy") {

          // 成功

          let names = ["abc", "cba", "nba"]

          resolve(names)                                  //1调用这个成功回调时

        } else { // 否则请求失败

          // 失败

          let errMessage = "请求失败, url错误"

          reject(errMessage)                              //2调用rejext失败回调时

        }

}, 3000);

    })

  }

//   main.js  (简写。then

  const promise = requestData("coderwhy")

  promise.then((res) => {                                //1.1当上面调用resolve-返回

    console.log("请求成功:", res)                        //promise.then(res)方法

  }, (err) => {

     console.log("请求失败:", err)

  })

 

//   // main.js  (不简写)

//   const promise = requestData("coderwhy")

//   promise.then(() => {

//     console.log("请求成功:", res)

//   }

//  promise .catch() => {                                   //2.1调用rejext失败回调时-返回

//      console.log("请求失败:", err)                       //promise.catch()方法 

//   })

图解:

uploading.4e448015.gif

正在上传…重新上传取消

promise具体实现原理:

1成功回调:then()方法

uploading.4e448015.gif

正在上传…重新上传取消

2失败回调:cath()方法

uploading.4e448015.gif

正在上传…重新上传取消

2>promise的回调和参数理解

关于promise回调的理解:(包括res/err)

res/err:形参

reject和resolve:也能传递参数—>通过res/err传递到异步

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

3>关于promise的其他补充

一:promise三个状态(了解)

uploading.4e448015.gif

正在上传…重新上传取消

二:promise的resolve参数

参数一:普通的值或者对象

resolve(参数)

 *  1> 普通的值或者对象  状态:pending -> fulfilled

uploading.4e448015.gif

正在上传…重新上传取消

参数二: 传入一个Promise

*  2> 传入一个Promise

 *    那么当前的Promise的状态会由传入的(new)Promise来决定

 *    相当于状态进行了移交

uploading.4e448015.gif

正在上传…重新上传取消

即:

uploading.4e448015.gif

正在上传…重新上传取消

参数三:传入一个对象

 *  3> 传入一个对象, 并且这个对象有实现then方法

 *    那么也会执行该then方法, 并且又该then方法决定后续状态

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

4>promise的类方法:

(0)promise的对象所有方法:

uploading.4e448015.gif

正在上传…重新上传取消

①:promise的对象方法.then

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

②:promise的对象方法.catch :

uploading.4e448015.gif

正在上传…重新上传取消

③:promise的对象方法.finally:

uploading.4e448015.gif

正在上传…重新上传取消

④:promise类方法:resolve和reject:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

小结:promise中的方法重要resolve/reject和 then/cath(其他了解)

5>手写promise和promise实战

简单总结手写Promise

. Promise规范

Promises/A+

. Promise类设计

class HYPromise {}
function HYPromise() {}

. 构造函数的规划

class HYPromise {

   constructor(executor) {
// 定义状态

   // 定义resolvereject回调

   // resolve执行微任务队列:改变状态、获取valuethen传入执行成功回调

   // reject执行微任务队列:改变状态、获取reasonthen传入执行失败回调

   

   // try catch

   executor(resolve, reject)

  }

}

. then方法的实现

class HYPromise {
then(onFulfilled, onRejected) {
 // this.onFulfilled = onFulfilled// this.onRejected = onRejected 
// 1.判断onFulfilledonRejected,会给默认值

   

   // 2.返回Promise resolve/reject

   

   // 3.判断之前的promise状态是否确定

   // onFulfilled/onRejected直接执行(捕获异常) // 4.添加到数组中push(() => { 执行 onFulfilled/onRejected 直接执行代码})

    }

}

. catch方法

class HYPromise {

   catch(onRejected) {

   return this.then(undefined, onRejected)

  }

}

. finally

class HYPromise {

 finally(onFinally) {

   return this.then(() => {onFinally()}, () => {onFinally()})

}
}

. resolve/reject

. all/allSettled

核心:要知道new Promiseresolvereject在什么情况下执行

all

  • 情况一:所有的都有结果
  • 情况二:有一个reject

allSettled

  • 情况:所有都有结果,并且一定执行resolve

.race/any

race:

  • 情况:只要有结果

any:

  • 情况一:必须等到一个resolve结果
  • 情况二:都没有resolve,所有的都是reject

实战:略待补充

迭代器:(了解)

遍历容器

Es6语法遍历For(。。。。。of。。。。)

  var arr = ['nick','freddy','mike','james'];

     for(var item of arr){  

      console.log(item);

//nick ,freddy,mike,james

uploading.4e448015.gif

正在上传…重新上传取消

(了解)生成器

uploading.4e448015.gif

正在上传…重新上传取消

普通函数执行:

生成器控制函数执行:

uploading.4e448015.gif

正在上传…重新上传取消

生成器格式:

Function * ()

异常处理:略p代码:

一)异常处理

常见的方案:法1----3(了解) 法四(掌握)

法123===法四的理解(法四的演变)

法一:

uploading.4e448015.gif

正在上传…重新上传取消

法二:

uploading.4e448015.gif

正在上传…重新上传取消

法三:(重点了解)

uploading.4e448015.gif

正在上传…重新上传取消

(了解即可)优化法三:(封装一个递归函数:实现自动调用)

uploading.4e448015.gif

正在上传…重新上传取消

优化三(使用npm包来实现函数调用):npm install co

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

最终方案:法四(掌握)

// request.js

function requestData(url,) {

  // 异步请求的代码会被放入到executor

  return new Promise((resolve, reject) => {

    // 模拟网络请求

    setTimeout(() => {

      // 拿到请求的结果

     resolve(url)

    }, 3000);

  })

}

// 第四钟方案:最终方案:async/await

async function getData() {

  const res1 = await requestData("why")

  const res2 = await requestData(res1 + "aaa")

  const res3 = await requestData(res2 + "bbb")

  const res4 = await requestData(res3 + "ccc")

  console.log(res4);

}

getData()

二)错误处理:

01throw: “提示词“抛出异常

02最常用方式:

uploading.4e448015.gif

正在上传…重新上传取消

优化:

uploading.4e448015.gif

正在上传…重新上传取消

// 强调: 如果函数中已经抛出了异常, 那么后续的代码都不会继续执行了

03对抛出异常的处理

第一种:不处理抛出的异常

uploading.4e448015.gif

正在上传…重新上传取消

第二种:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

真实开发:弹出异常

uploading.4e448015.gif

正在上传…重新上传取消

Async:

0async实战:

uploading.4e448015.gif

正在上传…重新上传取消

重点(res与返回值关系res====return

1.Async 函数的执行:》》》》》调用一个promise函数(固定

uploading.4e448015.gif

正在上传…重新上传取消

  1. async函数和普通函数的区别一:返回值

2.1返回一个值(或没返回值默认)

uploading.4e448015.gif

正在上传…重新上传取消

2.2返回一个对象:return{ then:function(resolve,reject)}

uploading.4e448015.gif

正在上传…重新上传取消

2.3返回Promise

uploading.4e448015.gif

正在上传…重新上传取消

retrun===res

3.async函数和普通函数区别二:异常

普通函数异常:直接中断报错

Async函数异常:会作为异步函数promise的reject值(err)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

4小结:

uploading.4e448015.gif

正在上传…重新上传取消

5async-await关键字使用:(复习

uploading.4e448015.gif

正在上传…重新上传取消

表达式:跟generator异曲同工(原理一样)

1.表达式运行流程:(then的复习)

.Then(=>)这就是个格式问题:执行后面的代码

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2跟上其他值

逻辑如res==return 

Res==await

2.1常数:123

uploading.4e448015.gif

正在上传…重新上传取消

2.2对象{}è 

uploading.4e448015.gif

正在上传…重新上传取消

2.3Promiseè

uploading.4e448015.gif

正在上传…重新上传取消

面试题:

promise和async

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

Day5:

进程和线程:

uploading.4e448015.gif

正在上传…重新上传取消

例如操作系统:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

Mainsrcipt、微任务和宏任任务:(事件队列)

在了解什么是微任务和宏任务之前我们需要了解js是怎么执行函数,以及有异步操作怎么执行。

例如:

uploading.4e448015.gif

正在上传…重新上传取消

(一)事件队列:

mainSript

宏任务:

1. ajax  2. setTimeout/setInterval3. UI rendering/UI事件4. postMessageMessageChannel5. setImmediateI/ONode.js

微任务:  

1. Promise (aysnc)   2process.nextTickNode.js 3. Object.observe(已废弃;Proxy 对象替代)4. MutaionObserver

(二)宏任务、微任务是怎么执行的?

先执行mainSirpte—异步代码放队列中--

在执行任何宏任务之前,都必须保证微任务清空

执行顺序:先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

uploading.4e448015.gif

正在上传…重新上传取消

面试题:(原理:宏任务之前微任务必须清空,宏任务包多个微任务

uploading.4e448015.gif

正在上传…重新上传取消

模块化:

uploading.4e448015.gif

正在上传…重新上传取消

CommonJS:导出与导入

uploading.4e448015.gif

正在上传…重新上传取消

// 使用另外一个模块导出的对象, 那么就要进行导入 require

// const { aaa, bbb } = require("./why.js")

const { name, age, sum } = require("./why.js")

// console.log(aaa)

// console.log(bbb)

                                                   导入

console.log(name)

console.log(age)

console.log(sum(20, 30))

EsModule:import导出导入:

第一种使用:html和js

Html文件:引用加上type属性

  <script src="./main.js" type="module"></script>

Foo.js

import { name, age } from "./foo.js"

console.log(name)

console.log(age)

第二种使用:js和js(improt、exprot)

最常用:

// 1.第一种方式: export 声明语句

// export const name = "why"

// export const age = 18

// export function foo() {

//   console.log("foo function")

// }

// export class Person {

// }

// 2.第二种方式: export 导出 声明分开

const name = "why"

const age = 18

function foo() {

  console.log("foo function")

}

export {

  name,

  age,

  foo

}

// 1.导入方式一: 普通的导入

import { name, age, foo } from "./foo.js"

console.log(foo.name)

console.log(foo.age)

foo.foo()

const name = "main"

console.log(name)

console.log(age)

常见工具函数的导入导出方式:

思路:utils工具:其他具体工具à导入index。Jsà导出àmain。Jsà html

uploading.4e448015.gif

正在上传…重新上传取消

常用导出方式2

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

html

 <script src="./main.js" type="module"></script>

Npm包管理工具:npmàvue2(了解即可-其他会使用即可)

前言:webpack等都需要npm(但一般在vuecli使用

uploading.4e448015.gif

正在上传…重新上传取消

使用: npm-init

       npm-init-y

      在vuecli中添加npm (vue create ..)

效果

uploading.4e448015.gif

正在上传…重新上传取消

属性:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

基本命令:(掌握)

全局与项目

uploading.4e448015.gif

正在上传…重新上传取消

开发时依赖和开发安装时依赖

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

小结:npm/yan/cnpm

Cookie-Bom-dom:

1Storage

认识

uploading.4e448015.gif

正在上传…重新上传取消

存储的位置

uploading.4e448015.gif

正在上传…重新上传取消

Storage属性:

本地存储和会话存储的区别:

uploading.4e448015.gif

正在上传…重新上传取消

Storage属性:

uploading.4e448015.gif

正在上传…重新上传取消

使用:

小结:Storage的封装(工具类的封装)

(了解)后端:数据库处理()增删减查

uploading.4e448015.gif

正在上传…重新上传取消

IndexDB:api使用

uploading.4e448015.gif

正在上传…重新上传取消

2cookie

Cookie的基本使用:(演示运行cookie-server服务器)node index.js

Cookie属性

uploading.4e448015.gif

正在上传…重新上传取消

domain是域名,path是路径,两者加起来就构成了 URLdomainpath一起来限制 cookie 能被哪些 URL 访问。

3BOM:

具体js基础

认识:

uploading.4e448015.gif

正在上传…重新上传取消

Window的api(了解)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

具体api查官方文档: Window - Web API 接口参考 | MDN (mozilla.org)

具体看js基础:

其他属性:

location属性

uploading.4e448015.gif

正在上传…重新上传取消

Hisotry属性:

 // 跳转(不刷新网页)

  history.pushState

uploading.4e448015.gif

正在上传…重新上传取消

4dom(even):

具体看js基础

uploading.4e448015.gif

正在上传…重新上传取消

所有的架构都是一些小节点组成的à节点树(bignode.js)

官网:Node - Web API 接口参考 | MDN (mozilla.org)

evebTarget->Node

关于node的具体操作:(节点操作)

1常见属性:

nodeName

nodeType

nodeValue

uploading.4e448015.gif

正在上传…重新上传取消

2常见方法:

增删……

AppendChild()

cloneNode()

createElement()

。。。。。。

更多查官网

具体Dom(重点)Document:查文档

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

防抖函数和节流函数:

防抖:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

节流:

uploading.4e448015.gif

正在上传…重新上传取消

疑难点:

原型链

(了解一下)错法:

将父类的原型赋值给子类

问题:()当子类上传functionè 会上传到父类的原型上(x)

当多个子类时传递相同的方法不同的函数体时会冲突

uploading.4e448015.gif

正在上传…重新上传取消

拷贝:

浅拷贝:一人两号,本质上还是一个人

深拷贝:克隆,两人两号

扩展和补充:

Json

uploading.4e448015.gif

正在上传…重新上传取消

格式:

uploading.4e448015.gif

正在上传…重新上传取消

深拷贝和浅拷贝—事件总线:

Js高级(一周哦)

目录——————

V8:略

闭包和this:(345)

Js函数编程:略(678)

面向对象:(9,10,11)

Es6语法(12.13.15.16)

响应式原理:(18)略

响应式异步Promise(19.20.21)

导出导入详情:(25.26)快速过一下啦

Npm包工具使用(27,28)快速过一下

Cookie-bom-dom(30,31)

防抖函数和节流函数:使用

3,4,5,9,10,11

12,13,15,16,

19,20,21

27,28,

30,31

函数 使用

Day1

打开终端快捷:(ctrl+`

uploading.4e448015.gif

正在上传…重新上传取消

在终端使用node运行js文件:  使用  node 文件名

快速打开vscode当前目录的终端:

uploading.4e448015.gif

正在上传…重新上传取消

闭包:

闭包定义:函数+访问变量

Javas中的函数+去访问外层变量==闭包

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

闭包作用:

存数据—>函数执行完不销毁

闭包函数的作用:访问外部的数据====JavaScript函数的优点(灵活)

This:

1全局作用域下:

// 在大多数情况下,this都在出现 在函数中

// 全局作用域下

// this指:windowglobalObject

// log(this)==log(window)

console.log(this);

console.log(window);

// Node环境下:[]  this指向空字符串(了解)

console.log(this)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2同个函数不同this指向

uploading.4e448015.gif

正在上传…重新上传取消

3四种this绑定规矩(重点)

规则一:独立函数绑定

uploading.4e448015.gif

正在上传…重新上传取消

规则二:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

书接上回

uploading.4e448015.gif

正在上传…重新上传取消

Apply—call—bind函数调用

规则三:

Call-apply 绑定:指定的this()

uploading.4e448015.gif

正在上传…重新上传取消

Bind绑定

uploading.4e448015.gif

正在上传…重新上传取消

规则四:new绑定

uploading.4e448015.gif

正在上传…重新上传取消

绑定规则优先级

uploading.4e448015.gif

正在上传…重新上传取消

箭头函数:

uploading.4e448015.gif

正在上传…重新上传取消

箭头函数this绑定:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

Day2对象 

作用域:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

With:语句:(了解一下)略

面向对象:

1创建对象:

uploading.4e448015.gif

正在上传…重新上传取消

2对对象属性的操作:

  1. 获取属性,赋值,删除,遍历
  2. definProperty方法精准对对象操作

uploading.4e448015.gif

正在上传…重新上传取消

扩展(了解):关于definproperty的参数二:属性

包括数据属性,存储属性

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

重点:创建对象:

法一:字面量

如上

法二:工厂模式(函数模式):缺点无法获取最真实的对象类型

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

法三:构造函数(重点)

// 规范:(约定熟成)function 函数名()  函数名为大写或驼峰命名法=======构造函数

function Person(name,age,height,address){

this.name=name……..

this.eationg=function(){}

}

//new Person

 var p1 = new Person("张三",18 ,1.99,"广州市")

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

案例分析:

1生成{}对象  2{}赋值给this   3执行代码体  4返回this

uploading.4e448015.gif

正在上传…重新上传取消

具体构造函数创建对象:

uploading.4e448015.gif

正在上传…重新上传取消

对象原型和函数原型(重点)

对象原型

uploading.4e448015.gif

正在上传…重新上传取消

函数原型(函数=<对象)

函数原型运行内存图

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

P1对象中-proto-==person函数原型对象

面向对象原型链和继承的实现:

Js中面向对象:

uploading.4e448015.gif

正在上传…重新上传取消

原型链:

uploading.4e448015.gif

正在上传…重新上传取消

顶部原型:来自()

补充:Object是是所有函数(包括person)的父类---

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

继承:原理(重点)

实现继承:Function .prototype===Object .__proto

uploading.4e448015.gif

正在上传…重新上传取消

(1)原型链实现继承:

详细解读:

uploading.4e448015.gif

正在上传…重新上传取消

实现继承

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

优化继承:借助构造函数继承(解决三个弊端)

(2)构造函数实现继承{调用call、apply函数}

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

具体实现

uploading.4e448015.gif

正在上传…重新上传取消

疑惑:(解决)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

-继承-对象之间的关系最简继承:

uploading.4e448015.gif

正在上传…重新上传取消

(3)原型式

uploading.4e448015.gif

正在上传…重新上传取消

1通过setPrototypeOf设置 一个对象为另一个对象的原型  (实现原型式继承函数)

uploading.4e448015.gif

正在上传…重新上传取消

2优化

(4)寄生式继承

(了解即可)-继承-对象(寄生式)继承:

寄生式原型是es6的新方法:create方法 可以将一个对象 指向 另一个对象的原型

uploading.4e448015.gif

正在上传…重新上传取消

寄生式继承

uploading.4e448015.gif

正在上传…重新上传取消

(5)寄生组合式继承

最终方案:

uploading.4e448015.gif

正在上传…重新上传取消

抽离:封装Object为函数

uploading.4e448015.gif

正在上传…重新上传取消

图解:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

小结:

1继承方法

* 1/js继承

<!-- 1 原型链继承:最原始的方式;缺点不可传参 -->

<!-- 2改进原型链继承 》》 构造函数继承  -->

原理都是:Stu.prototype =new Person()

<!-- 3原型式继承: -->

<!-- 4改进原型式继承:寄生式 -->

es6之前的方法:通过setPrototypeOf 方法:设置 o Object的原型

了解在没有setPrototypeOf 方法时怎么继承 (了解)

<!-- 5改进原型式继承:寄生组合式继承 -->

通过es6新方法create 可以将一个对象 作为(指向) 另一个对象的原型

2原型继承关系图解:

uploading.4e448015.gif

正在上传…重新上传取消

原型上的方法补充和总结:

(4条消息) JavaScript的原型方法_zyk_520的博客-优快云博客_javascript 原型方法

uploading.4e448015.gif

正在上传…重新上传取消

一、hasOwnProperty()

判断是否是对象的属性(非继承属性),无法判断原型链上的属性;返回boolean值,true-是对象的属性;false-不是对象的属性

二、isPrototypeOf() 和instanceof  判断

判断一个对象是否是另一个对象的原型;

常见的面试题instanceof typeOf的区别

三、Obeject.getPrototypeOf() / set PrototypeOf()

获取某个对象的原型对象。

es6之前的方法:通过setPrototypeOf 方法:设置 o Object的原型

四、in/ for in操作符

检测属性是存在于实例还是原型中。

注意:可以和hasOwnProperty()配合使用,判断属性是否是原型中的属性

Day3:es6

了解一下咯

前言:babeljs.io工具-将代码转化低级

uploading.4e448015.gif

正在上传…重新上传取消

例如es6转化-es5

在线官网:Babel · The compiler for next generation JavaScript (babeljs.io)

uploading.4e448015.gif

正在上传…重新上传取消

Es6语法(上):类

1类的定义:

uploading.4e448015.gif

正在上传…重新上传取消

2类的声明和理解:

uploading.4e448015.gif

正在上传…重新上传取消

3类的使用

(1)类中的构造方法:

uploading.4e448015.gif

正在上传…重新上传取消

// 1类的声明+类中构造函数的声明(创建)

class Person {

  // 类的构造方法

  // 注意: 一个类只能有一个构造函数

  // 0.在类的构造方法只能通过 constructor 方法(唯一)

  // 1.在内存中创建一个对象 moni = {}

  // 2.将类的原型prototype赋值给创建出来的对象 moni.__proto__ = Person.prototype

  // 3.将对象赋值给函数的this: new绑定 this = moni

  // 4.执行函数体中的代码

  // 5.自动返回创建出来的对象

  constructor(name, age) {

    this.name = name

    this.age = age

  }

}

// 2调用(同function

var p1 = new Person("why", 18)

var p2 = new Person("kobe", 30)

console.log(p1, p2)

// 小结和疑惑:为什么构造函数会使用 类的方法尼? 因为class这种模式在继承是很简单和方便的

(2)class中的方法使用:(实战)

1》在class中定义类

uploading.4e448015.gif

正在上传…重新上传取消

2》实战:(类的实例方法)

uploading.4e448015.gif

正在上传…重新上传取消

3》类的访问器方法:get、set

4》类的继承一(父类与子类):继承的关键:extends和super的使用

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

5》了解类的继承二(创建类继承自内置类)

6》了解类的继承三(类的混入:使用js技巧实现混入)

Es6语法(中): 字面量/let、、

1字面增强写法:

uploading.4e448015.gif

正在上传…重新上传取消

属性+方法(即可)

uploading.4e448015.gif

正在上传…重新上传取消

2解构(重点)

使开发效率更高

(最常用的)案例:解构传递的function()对象

uploading.4e448015.gif

正在上传…重新上传取消

解构:数组,对象(function)

具体解构看代码去:

1数组解构:(vue3中的map方法常用。。。)

uploading.4e448015.gif

正在上传…重新上传取消

2对象解构:

uploading.4e448015.gif

正在上传…重新上传取消

函数解构

uploading.4e448015.gif

正在上传…重新上传取消

3let/const基本使用:

Const:

uploading.4e448015.gif

正在上传…重新上传取消

//*const==(常量、衡量)   声明是常量:一、const声明后是不可修改的*/

const name="abc"

 name="cba"   //报错

//注意事项一: 具体const本质上传递的值是不可修改

// 二、当如果传递的是一个引用类型(内存地址),可以通过引用找到对应的对象,去修改对应的属性

// 什么是引用类型?==》函数、对象

const obj ={

    foo:"foo"

}

// obj={}     //报错

obj.foo="aaa" //foo:"aaa"

let:和const区别:变量和常量的区别,用法一致

uploading.4e448015.gif

正在上传…重新上传取消

4(了解)作用域提升-var/let/const的区别

Var就有作用域提升

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

因为let/const没有作用域提升:作用域:为当前的块级作用

Var 和let/const区别

uploading.4e448015.gif

正在上传…重新上传取消

小结:var和let/const区别:

1constlet不能重复定义变量,var可以重复定义变量。
2constlet有块级作用域var没有块级作用域。

let和const的区别:

(1)let设置变量,const设置常量(函数、对象、常量)

(const是设置常量,也就是不能改变。const定义的数值字符串的时候值不能改变。
const 定义的对象的时候,对象不能改变,但是对象的属性值可以改变。

(3)let的内存原理:栈内存

     const的内存原理:堆内存

5、ES5作用域和ES6块级作用域

Es5作用域:

uploading.4e448015.gif

正在上传…重新上传取消

Es6块级作用域:

Var无效

// ES6的代码块级作用域

// let/const/function/class声明的类型是有效

{

    let foo = "why"

    function demo() {

      console.log("demo function")

    }

    class Person {}

}

  console.log(foo) // foo is not defined

   demo()          

  var p = new Person() // Person is not defined

全打印不了

块级作用域使用场景:

If/switch/for块级代码 –自带块级作用域

定时器函数setTimout…………

6块级作用域补充:暂时性死区

var/let/const区别和块级作用域图解

uploading.4e448015.gif

正在上传…重新上传取消

Es6新增遍历方法:

For(….of…)

uploading.4e448015.gif

正在上传…重新上传取消

暂时性死区:在声明前变量是无法访问的(为什么const有变量-因为const可以声明对象(包含变量))

uploading.4e448015.gif

正在上传…重新上传取消

Es6语法(下): 字符串模板+es6函数(箭头函数)

1模板字符串的基本使用:

Tab上面的键:``+${拼接对象}

uploading.4e448015.gif

正在上传…重新上传取消

2标签字符串的使用(了解一下)rectify框架使用

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

3Es6函数补充:

Es5之前的默认值:

// Es5之前给函数默认值

// 缺点:

// 1写起来麻烦,还要使用||代码阅读性差

// 2bug:如果传入(0"",log->打印不出来  log(aaa,bbb)

// function  foo(m,n){

//     m=m||"aaa"           //m等于m,“aaa” m没有值即等于 aaa(m默认值==aaa)

//     n=n||"bbb"

//     console.log(m,n);

// }

// // foo()

// foo(0,"")  //aaa,bbb

Es6函数默认值:

// 1.Es6可以给函数参数直接提供默认值

function foo(m="aaa",n="bbb"){

    console.log(m,n);

}

foo(0,"")//0,""

// 2对象参数和默认值以及解构

function printInfo({name,age}={name:"why",age:18}){

    console.log(name,age)

}

printInfo({name:"kobe",age:40})

// 另一种写法

function printInfo1({name="why",age=18}={}){

    console.log(name,age)

}

printInfo1()

作业:给一个对象解构+默认值:

uploading.4e448015.gif

正在上传…重新上传取消

(了解)Es6函数剩余参数:

Es6args替代argument

uploading.4e448015.gif

正在上传…重新上传取消

Es6箭头函数补充:

uploading.4e448015.gif

正在上传…重新上传取消

4Es6中的展开运算符和浅拷贝

1)什么是浅拷贝什么是深拷贝:

(4条消息) 面试题:深拷贝和浅拷贝(超级详细,有内存图)_田江的博客-优快云博客_深拷贝和浅拷贝面试题

2)例子es6展开运算符实现浅拷贝:

浅拷贝:将:info对象的内存地址拷贝一份到obj中(指向同一个地址),

uploading.4e448015.gif

正在上传…重新上传取消

5Es6对象symbol属性(了解一下)

前因:es6之前的对象属性名,添加相同对象属性名会覆盖掉原来的属性和值。

uploading.4e448015.gif

正在上传…重新上传取消

// 3.1在定义对象字面量时使用

// 3.2新增属性

console.log(obj[s1], obj[s2], obj[s3], obj[s4])//注意不能通过。语法获取:console.log(obj.s1)

其他了解一下

6新增数据结构Set使用和weakSet

0)别人的理解:(4条消息) 彻底弄懂ES6中的Map和Set_asteriaV的博客-优快云博客_es6 map set

1)介绍set和map是什么

uploading.4e448015.gif

正在上传…重新上传取消

Set去重:

Set结构转化为数组结构:两种方式

Set常见的方法:size/add/detete/clear/forEach         (数组中的方法==)

2)set的基本使用:

(4条消息) ES6:Set数据结构的使用方法及使用set数组去重_奄奄一息的一条咸鱼的博客-优快云博客_set数据结构去重

uploading.4e448015.gif

正在上传…重新上传取消

set自带的方法:add/delte/has/clear

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

set的具体使用(去重+遍历)

uploading.4e448015.gif

正在上传…重新上传取消

set方法数组去重:推荐使用写法二—》(为啥因为写法一Array.from方法看不太懂)

(掌握)写法二:{set去重的方法(自带、这个结构输出的元素不能重复)}

const num = new Set([1,1,2,3,2,1]);

console.log(num); // 输出:{1, 2, 3} 重复的内容不会被输出

console.log(num.size); // 输出3,重复的内容不记为量         为什么输出3?因为size方法是个数(不包含重复的)

// 利用扩展运算符,将set数据结果转换成数组形式

const newNum = [...num];

console.log(newNum); // 输出: [1, 2, 3]

遍历:

uploading.4e448015.gif

正在上传…重新上传取消

3)了解weakSet的基本使用:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

7新增数据结构Map的使用 和weakMap (使用为0%)

Map:

map和set的区别:map可以使用key来映射对象,set不能

uploading.4e448015.gif

正在上传…重新上传取消

Map的使用:

Map的常用方法:size/detete/clear/set/get/    

// set :设置“why"”eee“--->   key:value

// get(key)   //通过key获取value

console.log(map2.get("why"))   //"eee"

开发中唯一使用的map:将对象作为key

uploading.4e448015.gif

正在上传…重新上传取消

了解weakMap:

8(了解)es6响应式原理-vue3响应式的关系

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

ES6-ES12小结:

基础:类、let/const、模板字符串、解构+默认值、symbol属性

函数方法:类、

          箭头函数

          数组方法: (4条消息) js数组常用方法_on my-own的博客-优快云博客_js数组方法

          es6新增的数据结构set方法和map方法

其他补充:浅拷贝……

Day4(复习)

前言:es7-es12略了

Promise、迭代器、async这些其实也是es6的知识

Proxy-Refect:

前言:proxy-Refect是什么呢?在那使用呢?

uploading.4e448015.gif

正在上传…重新上传取消

  1. 监听对象一:object.defineProperty(api)

     面向对象(原型、原型链的一个api)同时也是vue2的响应式原理

uploading.4e448015.gif

正在上传…重新上传取消

复习一些obj.definProperty使用:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2监听对象二:Proxy

Proxy是Object.defineProperty的进阶( es6中新增的类)。 同时也是vue3的响应式原理

uploading.4e448015.gif

正在上传…重新上传取消

1)proxy的具体使用:

uploading.4e448015.gif

正在上传…重新上传取消

1基本使用:类比obj.dp

uploading.4e448015.gif

正在上传…重新上传取消

2其他捕获器使用:

uploading.4e448015.gif

正在上传…重新上传取消

补充:obj.definePropertyproxy作用和区别

// 3小结:obj.definePropertyproxy作用和区别

//1 obj-为了修改属性:可通过obj.definePropertyproxy方法 {增删改查}

//2 区别:

// 通过Object.defineProperty会将数据属性描述符变成一个访问属性描述符 (然后再进行操作修改)

// name: "why", // 数据属性描述符

// Object.defineProperty(obj, "name", {

// })

// 通过proxy代理就不会 将一个对象中属性数据属性描述符变成一个访问属性描述符(直接通过捕获器实现)

2)proxy所有捕获器(了解)

uploading.4e448015.gif

正在上传…重新上传取消

3)proxy在函数中的调用方式:

uploading.4e448015.gif

正在上传…重新上传取消

3Refect (其实是java的知识-了解)

refect是什么?有什么用?---

比较object上的方法和reflect上的方法:

uploading.4e448015.gif

正在上传…重新上传取消

4vue2和vue3的响应式原理:

0)vue2和vue3原理

(4条消息) 三、【Vue3】——Vue2与Vue3响应式原理区别_YIFEI132的博客-优快云博客_vue2和vue3响应式的区别

(4条消息) 【前端面试题之Vue篇】Object.defineProperty()和Proxy来进行数据劫持有什么不同?_其实我叫二喵同学�的博客-优快云博客_前端面试proxy

1)响应式的实现:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2)优化响应式的实现-响应式依赖的收集

uploading.4e448015.gif

正在上传…重新上传取消

3)优化自动收集响应式对象:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

4)最终优化重构类:

uploading.4e448015.gif

正在上传…重新上传取消

1(优化)数组-》类:

太长了p代码

2(优化)类-》自动监听对象类:

3(最终优化)自动监听对象类:-》重构

太长了p代码

5)vue2和vue3的响应式原理:

vue3

uploading.4e448015.gif

正在上传…重新上传取消

5小结:这章节掌握什么是proxy和object.defineProperty的区别,以及set/get,了解vue2-vue3的响应式原理即可(面试能回答即可)

Promise:(简写看vue2---手写promise

0总结(面试题)

promsie理解:(5条消息) 前端Promise_yin_ping1101的博客-优快云博客_前端promise

promsie实战开发你说你会Promise?那你解决一下项目中的这五个难题? - 掘金 (juejin.cn)

1>理解什么是promise和基本使用

uploading.4e448015.gif

正在上传…重新上传取消

什么是异步

uploading.4e448015.gif

正在上传…重新上传取消

Es6之前异步操作处理:(了解)弊端大

uploading.4e448015.gif

正在上传…重新上传取消

1)什么是promise:

uploading.4e448015.gif

正在上传…重新上传取消

promise的作用:异步编程的使用----常见与网络请求、vue项目的异步编程(api+vuex+组件具体逻辑的编程)

2)Promise的基本使用:

Promise:原理如上同样是传递一个回调函数,但这个回调函数会立即执行,(上面的优化)

格式:

function requestData(url, ) {

return new Promise((resolve,reject)=>{

     setTimeout(() => {

             if (url === "coderwhy") {

          // 成功

          let names = ["abc", "cba", "nba"]

          resolve(names)                                  //1调用这个成功回调时

        } else { // 否则请求失败

          // 失败

          let errMessage = "请求失败, url错误"

          reject(errMessage)                              //2调用rejext失败回调时

        }

}, 3000);

    })

  }

//   main.js  (简写。then

  const promise = requestData("coderwhy")

  promise.then((res) => {                                //1.1当上面调用resolve-返回

    console.log("请求成功:", res)                        //promise.then(res)方法

  }, (err) => {

     console.log("请求失败:", err)

  })

 

//   // main.js  (不简写)

//   const promise = requestData("coderwhy")

//   promise.then(() => {

//     console.log("请求成功:", res)

//   }

//  promise .catch() => {                                   //2.1调用rejext失败回调时-返回

//      console.log("请求失败:", err)                       //promise.catch()方法 

//   })

图解:

uploading.4e448015.gif

正在上传…重新上传取消

promise具体实现原理:

1成功回调:then()方法

uploading.4e448015.gif

正在上传…重新上传取消

2失败回调:cath()方法

uploading.4e448015.gif

正在上传…重新上传取消

2>promise的回调和参数理解

关于promise回调的理解:(包括res/err)

res/err:形参

reject和resolve:也能传递参数—>通过res/err传递到异步

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

3>关于promise的其他补充

一:promise三个状态(了解)

uploading.4e448015.gif

正在上传…重新上传取消

二:promise的resolve参数

参数一:普通的值或者对象

resolve(参数)

 *  1> 普通的值或者对象  状态:pending -> fulfilled

uploading.4e448015.gif

正在上传…重新上传取消

参数二: 传入一个Promise

*  2> 传入一个Promise

 *    那么当前的Promise的状态会由传入的(new)Promise来决定

 *    相当于状态进行了移交

uploading.4e448015.gif

正在上传…重新上传取消

即:

uploading.4e448015.gif

正在上传…重新上传取消

参数三:传入一个对象

 *  3> 传入一个对象, 并且这个对象有实现then方法

 *    那么也会执行该then方法, 并且又该then方法决定后续状态

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

4>promise的类方法:

(0)promise的对象所有方法:

uploading.4e448015.gif

正在上传…重新上传取消

①:promise的对象方法.then

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

②:promise的对象方法.catch :

uploading.4e448015.gif

正在上传…重新上传取消

③:promise的对象方法.finally:

uploading.4e448015.gif

正在上传…重新上传取消

④:promise类方法:resolve和reject:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

小结:promise中的方法重要resolve/reject和 then/cath(其他了解)

5>手写promise和promise实战

简单总结手写Promise

. Promise规范

Promises/A+

. Promise类设计

class HYPromise {}
function HYPromise() {}

. 构造函数的规划

class HYPromise {

   constructor(executor) {
// 定义状态

   // 定义resolvereject回调

   // resolve执行微任务队列:改变状态、获取valuethen传入执行成功回调

   // reject执行微任务队列:改变状态、获取reasonthen传入执行失败回调

   

   // try catch

   executor(resolve, reject)

  }

}

. then方法的实现

class HYPromise {
then(onFulfilled, onRejected) {
 // this.onFulfilled = onFulfilled// this.onRejected = onRejected 
// 1.判断onFulfilledonRejected,会给默认值

   

   // 2.返回Promise resolve/reject

   

   // 3.判断之前的promise状态是否确定

   // onFulfilled/onRejected直接执行(捕获异常) // 4.添加到数组中push(() => { 执行 onFulfilled/onRejected 直接执行代码})

    }

}

. catch方法

class HYPromise {

   catch(onRejected) {

   return this.then(undefined, onRejected)

  }

}

. finally

class HYPromise {

 finally(onFinally) {

   return this.then(() => {onFinally()}, () => {onFinally()})

}
}

. resolve/reject

. all/allSettled

核心:要知道new Promiseresolvereject在什么情况下执行

all

  • 情况一:所有的都有结果
  • 情况二:有一个reject

allSettled

  • 情况:所有都有结果,并且一定执行resolve

.race/any

race:

  • 情况:只要有结果

any:

  • 情况一:必须等到一个resolve结果
  • 情况二:都没有resolve,所有的都是reject

实战:略待补充

迭代器:(了解)

遍历容器

Es6语法遍历For(。。。。。of。。。。)

  var arr = ['nick','freddy','mike','james'];

     for(var item of arr){  

      console.log(item);

//nick ,freddy,mike,james

uploading.4e448015.gif

正在上传…重新上传取消

(了解)生成器

uploading.4e448015.gif

正在上传…重新上传取消

普通函数执行:

生成器控制函数执行:

uploading.4e448015.gif

正在上传…重新上传取消

生成器格式:

Function * ()

异常处理:略p代码:

一)异常处理

常见的方案:法1----3(了解) 法四(掌握)

法123===法四的理解(法四的演变)

法一:

uploading.4e448015.gif

正在上传…重新上传取消

法二:

uploading.4e448015.gif

正在上传…重新上传取消

法三:(重点了解)

uploading.4e448015.gif

正在上传…重新上传取消

(了解即可)优化法三:(封装一个递归函数:实现自动调用)

uploading.4e448015.gif

正在上传…重新上传取消

优化三(使用npm包来实现函数调用):npm install co

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

最终方案:法四(掌握)

// request.js

function requestData(url,) {

  // 异步请求的代码会被放入到executor

  return new Promise((resolve, reject) => {

    // 模拟网络请求

    setTimeout(() => {

      // 拿到请求的结果

     resolve(url)

    }, 3000);

  })

}

// 第四钟方案:最终方案:async/await

async function getData() {

  const res1 = await requestData("why")

  const res2 = await requestData(res1 + "aaa")

  const res3 = await requestData(res2 + "bbb")

  const res4 = await requestData(res3 + "ccc")

  console.log(res4);

}

getData()

二)错误处理:

01throw: “提示词“抛出异常

02最常用方式:

uploading.4e448015.gif

正在上传…重新上传取消

优化:

uploading.4e448015.gif

正在上传…重新上传取消

// 强调: 如果函数中已经抛出了异常, 那么后续的代码都不会继续执行了

03对抛出异常的处理

第一种:不处理抛出的异常

uploading.4e448015.gif

正在上传…重新上传取消

第二种:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

真实开发:弹出异常

uploading.4e448015.gif

正在上传…重新上传取消

Async:

0async实战:

uploading.4e448015.gif

正在上传…重新上传取消

重点(res与返回值关系res====return

1.Async 函数的执行:》》》》》调用一个promise函数(固定

uploading.4e448015.gif

正在上传…重新上传取消

  1. async函数和普通函数的区别一:返回值

2.1返回一个值(或没返回值默认)

uploading.4e448015.gif

正在上传…重新上传取消

2.2返回一个对象:return{ then:function(resolve,reject)}

uploading.4e448015.gif

正在上传…重新上传取消

2.3返回Promise

uploading.4e448015.gif

正在上传…重新上传取消

retrun===res

3.async函数和普通函数区别二:异常

普通函数异常:直接中断报错

Async函数异常:会作为异步函数promise的reject值(err)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

4小结:

uploading.4e448015.gif

正在上传…重新上传取消

5async-await关键字使用:(复习

uploading.4e448015.gif

正在上传…重新上传取消

表达式:跟generator异曲同工(原理一样)

1.表达式运行流程:(then的复习)

.Then(=>)这就是个格式问题:执行后面的代码

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

2跟上其他值

逻辑如res==return 

Res==await

2.1常数:123

uploading.4e448015.gif

正在上传…重新上传取消

2.2对象{}è 

uploading.4e448015.gif

正在上传…重新上传取消

2.3Promiseè

uploading.4e448015.gif

正在上传…重新上传取消

面试题:

promise和async

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

Day5:

进程和线程:

uploading.4e448015.gif

正在上传…重新上传取消

例如操作系统:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

Mainsrcipt、微任务和宏任任务:(事件队列)

在了解什么是微任务和宏任务之前我们需要了解js是怎么执行函数,以及有异步操作怎么执行。

例如:

uploading.4e448015.gif

正在上传…重新上传取消

(一)事件队列:

mainSript

宏任务:

1. ajax  2. setTimeout/setInterval3. UI rendering/UI事件4. postMessageMessageChannel5. setImmediateI/ONode.js

微任务:  

1. Promise (aysnc)   2process.nextTickNode.js 3. Object.observe(已废弃;Proxy 对象替代)4. MutaionObserver

(二)宏任务、微任务是怎么执行的?

先执行mainSirpte—异步代码放队列中--

在执行任何宏任务之前,都必须保证微任务清空

执行顺序:先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

uploading.4e448015.gif

正在上传…重新上传取消

面试题:(原理:宏任务之前微任务必须清空,宏任务包多个微任务

uploading.4e448015.gif

正在上传…重新上传取消

模块化:

uploading.4e448015.gif

正在上传…重新上传取消

CommonJS:导出与导入

uploading.4e448015.gif

正在上传…重新上传取消

// 使用另外一个模块导出的对象, 那么就要进行导入 require

// const { aaa, bbb } = require("./why.js")

const { name, age, sum } = require("./why.js")

// console.log(aaa)

// console.log(bbb)

                                                   导入

console.log(name)

console.log(age)

console.log(sum(20, 30))

EsModule:import导出导入:

第一种使用:html和js

Html文件:引用加上type属性

  <script src="./main.js" type="module"></script>

Foo.js

import { name, age } from "./foo.js"

console.log(name)

console.log(age)

第二种使用:js和js(improt、exprot)

最常用:

// 1.第一种方式: export 声明语句

// export const name = "why"

// export const age = 18

// export function foo() {

//   console.log("foo function")

// }

// export class Person {

// }

// 2.第二种方式: export 导出 声明分开

const name = "why"

const age = 18

function foo() {

  console.log("foo function")

}

export {

  name,

  age,

  foo

}

// 1.导入方式一: 普通的导入

import { name, age, foo } from "./foo.js"

console.log(foo.name)

console.log(foo.age)

foo.foo()

const name = "main"

console.log(name)

console.log(age)

常见工具函数的导入导出方式:

思路:utils工具:其他具体工具à导入index。Jsà导出àmain。Jsà html

uploading.4e448015.gif

正在上传…重新上传取消

常用导出方式2

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

html

 <script src="./main.js" type="module"></script>

Npm包管理工具:npmàvue2(了解即可-其他会使用即可)

前言:webpack等都需要npm(但一般在vuecli使用

uploading.4e448015.gif

正在上传…重新上传取消

使用: npm-init

       npm-init-y

      在vuecli中添加npm (vue create ..)

效果

uploading.4e448015.gif

正在上传…重新上传取消

属性:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

基本命令:(掌握)

全局与项目

uploading.4e448015.gif

正在上传…重新上传取消

开发时依赖和开发安装时依赖

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

小结:npm/yan/cnpm

Cookie-Bom-dom:

1Storage

认识

uploading.4e448015.gif

正在上传…重新上传取消

存储的位置

uploading.4e448015.gif

正在上传…重新上传取消

Storage属性:

本地存储和会话存储的区别:

uploading.4e448015.gif

正在上传…重新上传取消

Storage属性:

uploading.4e448015.gif

正在上传…重新上传取消

使用:

小结:Storage的封装(工具类的封装)

(了解)后端:数据库处理()增删减查

uploading.4e448015.gif

正在上传…重新上传取消

IndexDB:api使用

uploading.4e448015.gif

正在上传…重新上传取消

2cookie

Cookie的基本使用:(演示运行cookie-server服务器)node index.js

Cookie属性

uploading.4e448015.gif

正在上传…重新上传取消

domain是域名,path是路径,两者加起来就构成了 URLdomainpath一起来限制 cookie 能被哪些 URL 访问。

3BOM:

具体js基础

认识:

uploading.4e448015.gif

正在上传…重新上传取消

Window的api(了解)

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

具体api查官方文档: Window - Web API 接口参考 | MDN (mozilla.org)

具体看js基础:

其他属性:

location属性

uploading.4e448015.gif

正在上传…重新上传取消

Hisotry属性:

 // 跳转(不刷新网页)

  history.pushState

uploading.4e448015.gif

正在上传…重新上传取消

4dom(even):

具体看js基础

uploading.4e448015.gif

正在上传…重新上传取消

所有的架构都是一些小节点组成的à节点树(bignode.js)

官网:Node - Web API 接口参考 | MDN (mozilla.org)

evebTarget->Node

关于node的具体操作:(节点操作)

1常见属性:

nodeName

nodeType

nodeValue

uploading.4e448015.gif

正在上传…重新上传取消

2常见方法:

增删……

AppendChild()

cloneNode()

createElement()

。。。。。。

更多查官网

具体Dom(重点)Document:查文档

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

防抖函数和节流函数:

防抖:

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

uploading.4e448015.gif

正在上传…重新上传取消

节流:

uploading.4e448015.gif

正在上传…重新上传取消

疑难点:

原型链

(了解一下)错法:

将父类的原型赋值给子类

问题:()当子类上传functionè 会上传到父类的原型上(x)

当多个子类时传递相同的方法不同的函数体时会冲突

uploading.4e448015.gif

正在上传…重新上传取消

拷贝:

浅拷贝:一人两号,本质上还是一个人

深拷贝:克隆,两人两号

扩展和补充:

Json

uploading.4e448015.gif

正在上传…重新上传取消

格式:

uploading.4e448015.gif

正在上传…重新上传取消

深拷贝和浅拷贝—事件总线:

未完待续。。。。。。。。。。。。。。。。。。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder-coco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值