一、基础知识

let const 声明后的变量不允许在同一作用域中重新声明 但在不同作用域可以重新声明
两者区别是const 声明的变量不允许改变值

二、运算符

JS里的 与 或 是 && ||    且 &&的优先级高
switch:

for in 遍历对象的所有属性
for of 可以用来遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构。

三、基本类型

1.type of 用来返回以下原始类型
  • 基本类型:number/string/boolean
  • function
  • object
  • undefined
2.instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
3.只有对象才有方法使用,但在JS中也可以使用值类型调用方法,因为它会在执行时将值类型转为对象。
4.String能使用的方法有:
获取长度 大小写转换 移除空白 获取单字符(可以通过索引或charAt)
截取字符串:使用 slice、substr、substring 函数都可以截取字符串。
  • slice、substring 第二个参数为截取的结束位置
  • substr 第二个参数指定获取字符数量
查找字符串:indexOf lastIndexOf search(可用正则表达式) includes  startWith endWith
替换字符串 
字符串重复:return '*'.repeat(num);
类型转换:split (字符串转为数组)//(对应的,有join 把数组连接成字符串) toString(转化为字符串)
5.Boolean
Boolean有隐式转换 也有显示转换 (通过 !! 显示转换布尔类型)
6.Number:用于表示整数和浮点数
基本函数有:
判断是否为整数isInteger
parseInt 提取字符串开始去除空白后的数字转为整数。
parseFloat 转换字符串为浮点数,忽略字符串前面空白字符。
toFixed 可对数值舍入操作,参数指定保存的小数位
NaN表示无效的数值,不能使用==比较,通过使用 Object.is 方法判断两个值是否完全相同
7.Math
取极限值

舍入处理:

random:
取随机数公式:
下面取2~5的随机数(不包括5)公式为:min+Math.floor(Math.random()*(Max-min))
下面取2~5的随机数(包括5)公式为:min+Math.floor(Math.random()*(Max-min+1))
8.Date

四、数组类型

补充方法:
concat 方法用于连接两个或多个数组,元素是值类型的是复制操作,如果是引用类型还是指向同一对象
copyWithin 从数组中复制一部分到同数组中的另外位置。

indexOf 是严格查找 类似于 ===
使用includes等不能查找引用类型,因为它们的内存地址是不相等的 但find 可以方便的查找引用类型

数组排序:

sort 排序顺序由返回值决定
Array.sort((a,b)=>return num
  • 返回负数 a 排在 b前面
  • 返回正数 b 排在a 前面
  • 返回 0 时不动
因此,默认是升序排序 即Array.sort((a,b)=>a-b  降序排序为 Array.sort((a,b)=>b-a

迭代器方法:

keys:通过迭代对象获取索引
"use strict";
const arr = ["a", "b", "c", "后盾人"];

for (const key of arr.keys()) {
  console.log(key);
}
values:通过迭代对象获取值
"use strict";
const arr = ["a", "b", "c", "后盾人"];

for (const value of arr.values()) {
  console.log(value);
}
entries:返回数组所有键值对
const arr = ["a", "b", "c", "后盾人"];
for (const [key, value] of arr.entries()) {
  console.log(key, value);
}
扩展方法:
some:
用于检测数组中的元素是否满足指定条件(函数提供),如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
第一个参数为元素,第二个参数为索引,第三个参数为原数组。

reduce:
使用 reduce 与 reduceRight 函数可以迭代数组的所有元素,reduce 从前开始 reduceRight 从后面开始
第一个参数是执行函数,第二个参数为初始值
  • 传入第二个参数时将所有元素循环一遍
  • 不传第二个参数时从第二个元素开始循环


五、Symbol

Symbol用于防止属性名冲突而产生的,比如向第三方对象中添加属性时。Symbol 的值是唯一的,独一无二的不会重复的,即使传入相同的参数,也是不 == 的两个变量
使用description可以获取传入的描述参数

但使用Symbol.for 可以根据描述去寻找已有的Symbol 如果不存在才新建
  • 使用Symbol.for会在系统中将Symbol登记
  • 使用Symbol则不会登记

Symbol.keyFor 根据使用Symbol.for登记的Symbol返回描述,如果找不到返回undefined 

Symbol作用:

使用Symbol可以解决在保存数据时由于名称相同造成的耦合覆盖问题:
而且Symbol 不能使用 for/infor/of 遍历操作
可以使用 Object.getOwnPropertySymbols 获取所有Symbol属性,也可以使用 Reflect.ownKeys(obj) 获取所有属性包括Symbol

六、Set

  • 只能保存值没有键名
  • 严格类型检测如字符串数字不等于数值型数字
  • 值是唯一的
  • 遍历顺序是添加的顺序,方便保存回调函数
使用Set可以去除重复

可以通过 filter 来实现两个Set的交集 差集 并集

WeakSet

WeakSet结构同样不会存储重复的值,它的成员必须只能是对象类型的值。

  • 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
  • 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
  • 也是因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
  • 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 WeakMap

七、Map

Map是一组键值对的结构,用于解决以往不能用对象做为键的问题

  • 具有极快的查找速度
  • 函数、对象、基本类型都可以作为键或值
对于键是对象的Map, 键保存的是内存地址,值相同但内存地址不同的视为两个键

使用for/of遍历操作, 等同于使用entries() 函数


WeakMap

WeakMap 对象是一组键/值对的集

  • 键名必须是对象
  • WeaMap对键名是弱引用的,键值是正常引用
  • 垃圾回收不考虑WeaMap的键名,不会改变引用计数器,键在其他地方不被引用时即删除
  • 因为WeakMap 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
  • 也是因为弱引用,WeaMap 结构没有keys( ),values( ),entries( )等方法和 size 属性
  • 当键的外部引用删除时,希望自动删除数据时使用 WeakMap

八、函数

arguments 是函数获得到所有参数集合,

递归调用: 内部调用自身的方式

回调函数在某个时刻被其他函数调用的函数称为回调函数

apply/call/bind:
改变this指针,也可以理解为对象借用方法,就现像生活中向邻居借东西一样的事情

call与apply 用于显示的设置函数的上下文,两个方法作用一样都是将对象绑定到this,只是在传递参数上有所不同。

  • apply 用数组传参
  • call 需要分别传参
  • 与 bind 不同 call/apply 会立即执行函数

bind()是将函数绑定到某个对象,比如 a.bind(hd) 可以理解为将a函数绑定到hd对象上即 hd.a()。

  • 与 call/apply 不同bind不会立即执行
  • bind 是复制函数行为 会返回新函数

九、作用域和闭包



函数每次调用都会创建一个新作用域
如果子函数被使用时父级环境将被保留

闭包:

闭包指子函数可以访问外部作用域变量的函数特性,即使在子函数作用域外也可以访问。如果没有闭包那么在处理事件绑定,异步请求时都会变得困难

十、对象

  • 对象是属性和方法的集合即封装
  • 将复杂功能隐藏在内部,只开放给外部少量方法,更改对象内部的复杂逻辑不会对外部调用造成影响即抽象
  • 继承是通过代码复用减少冗余代码
  • 根据不同形态的对象产生不同结果即多态
  • 和函数、数组一样是引用类型,即复制只会复制引用地址。


检测属性:

hasOwnProperty检测对象自身是否包含指定的属性,不检测原型链上继承的属性。
但使用 in 可以再原型对象上监测

可以使用Object.assign 静态方法设置属性

遍历对象:


or/of用于遍历迭代对象,不能直接操作对象。但Object对象的keys/values/entries方法返回的是迭代对象。

属性特征:

使用 Object.getOwnPropertyDescriptor查看对象属性的描述
使用Object.defineProperty 方法修改属性的特性
使用 Object.defineProperties 可以一次设置多个属性(每个属性都有四个特性)


Object.preventExtensions 禁止向对象添加属性
Object.isExtensible 判断是否能向对象中添加属性
Object.seal()方法封闭一个对象,阻止添加新属性并将所有现有属性标记为 configurable: false
Object.freeze 冻结对象后不允许添加、删除、修改属性,writable、configurable都标记为false

属性访问器:

getter方法用于获得属性值,setter方法用于设置属性,这是JS提供的存取器特性即使用函数来管理属性。

  • 用于避免错误的赋值
  • 需要动态监测值的改变
  • 属性只能在访问器和普通属性任选其一,不能共同存在
可以通过get set 设置只读或只写

Proxy

代理(拦截器)是对象的访问控制,setter/getter 是对单个对象属性的控制,而代理是对整个对象的控制。
如果代理以函数方式执行,会执行代理中定义 apply 方法。

JSON

JSON要求用双引号

使用JSON.stringify(hd) 将 JSON 转换为 字符串
使用 JSON.parse 将字符串 json 解析成对象


十一、模块设计

  • 模块就是一个独立的文件,里面是函数或者类库
  • 虽然JS没有命名空间的概念,使用模块可以解决全局变量冲突
  • 模块需要隐藏内部实现,只对外开发接口
  • 模块可以避免滥用全局变量,造成代码不可控
  • 模块可以被不同的应用使用,提高编码效率