2022年3月20日
2021年8月28日
1.var声明的变量运行被重复,导致数据被覆盖,声明提升闭包问题,全局变量挂载到全局对象:全局对象成员污染问题
2.let:let声明的变量不会挂载到全局对象,let声明的变量,不允许当前作用域范围内重复声明
3.块级作用域中用let定义的变量,在作用域外不能访问,代码执行时会遇到花括号,会创建一个块级作用域
4.底层实现上,let声明的变量实际上也会有提升,但是提升后会将其放入到“暂时性死区”
5.在循环中,用let声明的循环变量,会特殊处理,每次进去循环体,都会开启一个新的作用域,并且将循环变量绑定到该作用域(每次循环,使用的是一个全新的循环变量)
2021年8月29日
-
在循环中使用let声明的循环变量,在循环结束后会销毁
-
const和let完全相同,唯一的区别是在const声明的变量,必须在声明时赋值而且不可以更改,在实际开发中,应该尽量使用const来声明变量,以保证变量的值不会随意篡改。
-
常量不可变,是指声明的常量的内存空间不可变,并不保证内存空间中的地址指向的其他空间不可变。
-
常量的命名(1)特使的常量:该常量从字面意义上一定不可改变,比如圆周率、月地距离。通常常量全部用大写,多个单词之间用_分开。(2)普通常量:使用小驼峰命名法。
-
Unicode使用16位二进制老储存文字,我们将16位二进制编码叫做一个码元,由于技术的发展,Unicode对文字编码进行了扩展,将某些文字扩展到了32位(占用两个码元),并且,将默写文字对应的二进制数字叫做码点,ES6为了解决这个困扰,为字符串提供了方法:codePointAt,根据字符串元的位置得到其码点。同时ES6为正则表达式添加了一个flag:u,如果添加了该配置,则匹配时,使用码点匹配
2021年8月30日
-
用includes可以查找子字符串是否存在,用法const text = "这个字符串" ; const i = text.includes("这个"); 如果存在则返回ture , 不存在则返回flast;当传入第二个参数(数字),表示从下标为几的数字开始找
-
startsWith判断字符串是否以指定的字符串开始第二个参数(下标)以什么位置开始查找,endsWith判断字符串是否以指定的自字符串结尾第二个参数是以什么位置开始查找,repeat将字符串重复指定的次数然后返回一个新字符串
-
正则里面的粘连标记y,匹配时,完全按照正则对象中的 lastIndex位置开始匹配,并且匹配的位置必须在lastIndex位置,其中lastIndex初始值是下标为0的项,可以更改
-
在ES6中,提供了模板字符串的书写,可以非常方便的换行和拼接,要做的仅仅是将字符串的开始或者结尾改为`符号,如果要在字符串中拼接js表达式,只需要在模板字符串中使用```${js表达式}```
2021年9月1日
1.模板字符串的形式是函数形式,其中:const str = Togst`阳勇是${1+1}哈哈`就是function Togst(参数一就是正常字符,就是${})。arguments可以查看所有元素
2、如果想让模板字符创解析转义符可以在模板字符串前加入String.raw模板字符串不会解析出转义符内容
3.ES6中发函数形参赋默认值,直接可以在形参后面接=号加入数值即可:function sty(a,b=2,c=1){},就是给sty函数的形参b赋默认值2,c赋默认值1
2021年9月4日
-
arguments的缺陷
-
如果和形参配合使用,容易导致混乱;
-
从语义上,使用arguments获取参数,由于形参缺失,无法从函数定义上理解函数的真实意图
-
-
ES6的剩余参数专门用于收集末尾的所有参数,将其防止到一个形参数组中。语法是function 函数名(...形参名){};他会吧剩余的形参放到数组中传给三个点后的形参中,剩余参数必须是最后一个形参
-
获取随机的数组函数getRandomNumbers(数组的位数);
-
当...用在不是形参而是用在对象和数组身上的时候表示将数组或对象依次展开;
-
看到中括号[]表示一个新的数组诞生了,看到大括号表示一个新的对象诞生了
-
curry:柯里化,用户固定某个函数的前面的参数,得到一个新的函数,新函数的调用时,接受剩余的参数
-
new.target:ES6提供了一个特殊的API,可以使用该API在函数内部判断该函数是否使用了new来调用,该表达式得到的是:如果没有使用new来调用函数,则返回undefined;如果使用new调用函数,则得到的是new关键字后面的函数
-
箭头函数是一个函数表达式,理论上任何使用函数表达式的场景都可以使用箭头函数,完整语法:(参数1,参数2,...)=>{函数体}
-
箭头函数函数体中的this,取决于箭头函数定义的位置的this指向,而与如何调用无关
2021年9月5日
-
如果箭头函数只有一个,可以省略小括号
-
如果箭头函数是有返回值的,并且只有返回值一条语句则不需要写大括号和return,直接在箭头后面接返回值;
-
箭头函数中,不存在this、arguments、new.target,箭头函数中使用的this、argunmets、new.target是箭头函数外部函数的this,箭头函数没有原型
-
箭头函数的应用场景
-
临时性使用的函数,并不会可以调用它,比如:
-
时间处理函数
-
异步处理函数
-
其他临时性函数
-
-
为了绑定外层this的函数
-
在不影响其他代码的情况下,保持代码的简洁
-
-
如果对象字面量初始化时,成员的名称来自于一个自变量,并且和变量的名称相同,则可以进行简写
-
对象字面量初始化时,方法可以省略磨耗和function关键字
-
有时候,初始化对象时,某些属性名可能来自于某个表达式的值,在ES6,可以使用中括号来表示该属性名是通过急速那得到的;
-
Object.is用于判断两个数据是否相等,基本上跟严格模式相等(===)是一致的,除了以下两点:
-
NaN和NaN相等
-
+0和-0不相等
-
-
Objsct.assign用于混合对象,用后面的对象覆盖前面对象的属性
-
Object.getOwnPropertyNames方法之前就存在,官方没有明确要求,对属性的顺序如何排序,完全由游览器厂商决定-先数字--在拍其他-
-
Object.setPrototypeOf该函数用于设置某个对象的隐式原型
-
ES6中的构造函数,写法是关键字class 构造函数名称{constructor(参数1,参数2){属性}原型对象名称{方法}}
-
类的特点(ES6中的构造函数)
-
类声明不会被提升,与let和const一样,存在暂时性死区
-
类中的所有代码均在严格模式下执行
-
类的所有方法都是不可枚举的
-
类的所有方法都无法被当做构造函数使用
-
类的构造器必须使用new来调用
-
-
用ES6中的构造函数如果在外部定义一个变量赋值的原型对象,想要在构造函数中使用可以在[]中填上变量名,就能调用
2021年9月6日
-
Object.defineProperty可以定义某个对象成员属性的读取和设置,使用getter和setter控制在属性上,不在原型上
-
创建一个age属性,并给他加上getter,读取该属性时,会运行该函数;创建一个age属性,并给他加上setter,给该属性赋值时,会运行该函数,使用getter和setter属性不在原型上
-
静态成员,构造函数本省的成员,使用关键字static关键字定义的成员即静态成员
-
设置隐式原型的方法,用Object.setPrototypeOf(构造函数.prototype,需要继承的父类.prototype)
-
ES6中的新的关键字extends:继承,用于类的定义;super直接当做函数调用,表示父类的构造函数
2021年9月7日
-
suqer如果写在函数当中就是调用父类的方法,suqer.父类的方法()
2021年9月12日
-
解构就是ES6中的一种语法,将一个对象或数组的某个属性提取到某个变量中,如果属性名和变量名不一样,写法:{属性名:变量名};
-
解构不会对被解构的任何对象造成影响、
2021年9月14日
-
-
符号属性是ES6新增的一个数据类型,它通过使用函数···Symbol(符号名)···来创建符号设计的初衷,是为了给对象设置私有属性;私有属性:只能给对象内部使用,外面无法使用
-
符号属性具有的特点:
-
使用typeof得到的类型是symbol
-
每次调用Symbol函数得到的符号永远不相等,无论符号名是否相同
-
符号可以作为对象的属性存在,在这些属性称之为符号属性
-
开发者可以作为对象的属性名存在,这种属性无法通过常规方式被外界访问
-
符号属性是不能枚举的,因此在for-in循环中无法读取到符号属性,Object.keys方法也无法读取到符号属性
-
Object.getOwnProrertyNames尽管可以得到所有无法枚举的属性,但是仍然无法读取到符号属性
-
ES6新增Object.getOwnProoertySymbols方法,可以读取符号
-
符号无法被隐式转换,因此不能被用于数学运算、字符串拼接或者其他隐式转换的场景,但符号可以显示的转换为字符串,通过string构造函数进行转换即可,console.log之所以就可以输出符号属性,是它的内部进行了显示转换
-
-
2021年9月15日
-
根据某个符号名称(符号描述)能够得到同一个符号:Symbol.for("符号名/符号描述")只要符号/符号描述相同就能共享符号
2021年9月18日
-
异步函数:某些函数不会立即执行,需要等到某个时机到达后才会执行,这样的函数称之为异步函数。比如事件处理函数。异步函数的执行时机,会被宿主环境控制。
-
游览器宿环境中包含5个线程:
-
JS引擎:负责执行执行栈的最顶端代码
-
GUI线程:负责渲染页面
-
时间监听线程:负责监听各种事件
-
计时线程:负责计时
-
网络线程:负责网络通讯
-
当上面的线程发生了某些事情,如果该线程发现,这件事情有处理程序,它会将该处理程序加入一个叫做事件队列的内存。当JS引擎发现,执行栈中已经没有了任何内容后,会将事件队列中的第一个函数加入到执行栈中执行。
2021年9月19日
-
JS引擎对事件队列的取出执行方式,以及与宿主环境的配合,称之为时间循环。
-
事件队列的取出执行方式,以及与宿主环境的配合,称之为事假循环。
-
事件队列在不同的宿主环境中有所差异,大部分宿主环境会将事件队列进行细分。在游览器中,事件队列分为两种:
-
宏任务(队列):macroTask,计时器结束的回调、事件回调,http回调等等绝大部分异步函数进入宏队列,
-
微任务(队列):MutationObserver,Promise产生的回调进入微队列
-
-
当执行栈清空时,JS引擎首先会将微任务中的所有任务依次执行结束,如果没有微任务则执行宏任务。
2021年9月20日
-
Promise并没有消除回调,只是让回调变的可控
-
const Pro = new Promise((resole,reject)=>{
-
//未决阶段的处理
//通过调用resolve函数将Promise推向已决阶段的resolved状态
//通过调用rejech均可以传递最多一个参数,表示推向状态的数据
})
pro.then(data=>{
//这是thenable函数,如果当前的Promise已经是resolved状态,该函数会立即执行
//如果当前是未决阶段,则会加入到作业队列,等待到达resolved状态后执行
//data为状态数据
},err=>{
//这是catchable函数,如果当前的Promise已经是rejected状态,该函数会立即执行
//如果当前是未决阶段,则会加入到作业队列,等待到达rejected状态后执行
//err为状态数据
})
2.未决阶段的处理函数是同步的,会立即执行
3.thenable和catchable函数是异步的,就算是立即执行,也会加入到时间队列中等待执行,并且,加入的队列是微队列
4.pro.then可以只添加thenable函数,pro.catch可以单独添加catchable函数
5.在未决阶段的处理函数中,如果发生未捕获的错误,会将状态推向rejected,并会被catchable捕获
6.一旦状态推向了已决阶段,无法再对状态做任何更改
2021年9月28 日
-
Promise中的实例成员
-
then:注册一个后续处理函数,当Promise为resolved状态时运行函数
-
catch:注册一个后续处理函数,当Promise为rejected状态时运行函数
-
2.asyn表示异步的,在函数前面加上asyn就是表示将函数转化为Promise对象,函数的返回值就是Promise对象
2021年9月30日
-
async用于修饰(无论是函数字面量还是函数表达式),放置在函数最开始的位置,被修饰的函数的返回结果一定是Promise对象
-
await关键字必须出翔在async函数中,它用在一个表达式之前,如果表达式是一个Promise,则得到的是 thenable中的状态数据
2021年10月1日
-
Fetch Api的特点
-
并非取代AJAX而是对AJAX传统的API的改进
-
精细的功能分割:头部信息、请求信息、相应信息等均分布到不同的对象,更利于处理各种复杂的AJAX场景
-
使用Prpmise Api,更利于异步代码的书写
-
Fetch Api并非ES6的内容,属于HTML5新增的Web Api
-
需要掌握网络通讯的知识
-
-
Fetch(地址,配置),Request对象:除了使用基本的fetch方法,还可以通过创建一个Request对象来完成请求(实际上,fetch的内部会帮你创建一个Request对象)`new Request(url地址,配置)`
-
JS迭代器,JS规定如果有一个对象具有next方法,并且该方法返回一个对象,该方法的格式如下:``{ value:值,done:是否迭代完成}``则认为该对象是一个迭代器
-
next方法是用于得到下一个数据,返回对象
-
value:下一个数据的值
-
done:是一个布尔类型,是否迭代完成
-
2021年10月2日
-
for-of循环,专门用于遍历可迭代对象,格式``for(const item in iterable){ //iterable:可迭代对象 //item:每次迭代得到的数据}
2021年10月3日
-
生成器是一个通过构造函数Generator创建的对象,生成器的创建必须使用生成器函数(Generator Function),格式:``function* (){};``
2021年10月4日
-
ES6中新增了两种集合类型(set和map),用于在不同场景中发挥作用
-
-
set用于存放不重复的数据,创建set集合``new Set ;new Set(iterable)//创建一个具有初始内容的set集合,内容来自于可迭代对象每一次迭代的结果``
-
-add(数据):添加一个数据到集合末尾,如果数据以存在则不进行任何操作
-
-set使用的是Object.is的方式判断两个数据是否相等,但是,针对+0和-0,set认为是相等的
-
-has(数据):判断set中是否存在对应数据
-
-delete(数据):删除匹配数据
-
-clear():清空整个set集合
-
如何遍历
-
使用for-of循环
-
使用set中的实例方法forEach
-
-
-size:查看set集合中元素的个数
-
-
filter用于把Array的某个元素过滤掉,然后返回剩下的元素,根据返回值是true还是false决定
-
map集合专门用于存储多个键值对数据,创建一个map()对象,``new Map()``
-
-
2021年10月5日
-
创建一个具有初始值内容的map,初始内容来自于可迭代对象每一次迭代的结果,但是,它要求没每一个迭代结果必须是一个长度为2的数组,数组第一项表示键,数组的第二项表示值
-
-size:只读属性,获取当前键的数量
-
-set(键,值):设置一个键值对,键和值可以是任何类型
-
如果键不存在则添加一项
-
如果键已经存在则修改它的值
-
比较键的方式和set相同
-
-
-get(键):根据一个键得到对应的值
-
-has(键):判断一个键是否存在
-
-delete(键):删除一个指定的键
-
-clear():清空map
-
-
WeakSet使用该集合,可以实现和set一样的功能,不同的是:它内部储存的对象地址不会影响垃圾回收,但是只能添加对象
-
Propety Descriptor 属性描述符 用于描述一个属性的相关信息,通过```Object.getOwnPropertyDescriptor(对象,属性名)```可以得到一个对象的某个属性描述符
-
value:属性值
-
configurable:该属性是否可以被枚举
-
enumerable:该属性是否可以被重新赋值
-
-
```Object.getOwnPropertyDescriptors(对象)```某一个对象的所有属性描述符
-
如果需要为某个对象添加属性时或修改属性时,配置其属性描述符,可以使用下面代码```Object.defineProperty(对象,属性名,描述符)
2021年10月7日
-
Proxy代理:提供了修改底层实现的方式,```new Proxy(target,handler)//代理一个目标对象,target:目标对象,handler:是一个普通对象,其中可以重写底层实现,最终返回一个代理对象
-
新增数组的API,静态方法
-
Array.of(...args):使用指定的数组创建一个新数组
-
Array.from(age):通过给定的数组或可迭代对象创建一个新数组。
-
find(callback):用于查找满足条件是的第一个元素
-
findIndex(callback):用于查找满足条件的第一个元素的下标
-
fill:用来给指定的数组填充满数组所有的内容
-
copyWithin(target,start?,end?):在数组内部完成复制
-
includes(data):判断数组中是否包含某个值,使用Object.is
-
2021年10月8日
-
类型化数组Int8Array:8位的符号整数(-126~125),Uint8Array:8位的无符号整数(0~255)
-
ArrayBuffer:一个对象,用于存储一块固定内存大小的数据```new ArrayBuffer(字节数)```,可以通过属性```byteLengt```得到字节数,可以通过方法```slice```得到新的ArrayBuffer
2021年10月9日
-
获取当前的地理位置:window.navigator.geolocation.getCurrentPosition(function(position){//成功的回调函数},function(){失败的回调函数})
-
获取地理信息位置需要使用https协议或者file协议,http协议下是不能获取地理信息位置的
-
git是分布式版本控制系统