一、基础知识
let const 声明后的变量不允许在同一作用域中重新声明 但在不同作用域可以重新声明
两者区别是const 声明的变量不允许改变值
二、运算符
JS里的 与 或 是 && || 且 &&的优先级高
switch:
for in 遍历对象的所有属性
for of 可以用来遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构。
三、基本类型
1.type of 用来返回以下原始类型
- 基本类型:number/string/boolean
- function
- object
- undefined
3.只有对象才有方法使用,但在JS中也可以使用值类型调用方法,因为它会在执行时将值类型转为对象。
4.String能使用的方法有:
获取长度 大小写转换 移除空白 获取单字符(可以通过索引或charAt)
截取字符串:使用 slice、substr、substring 函数都可以截取字符串。
- slice、substring 第二个参数为截取的结束位置
- substr 第二个参数指定获取字符数量
替换字符串
字符串重复:return '*'.repeat(num);
类型转换:split (字符串转为数组)//(对应的,有join 把数组连接成字符串) toString(转化为字符串)
5.Boolean
Boolean有隐式转换 也有显示转换 (通过 !! 显示转换布尔类型)
6.Number:用于表示整数和浮点数
基本函数有:
判断是否为整数isInteger
parseInt 提取字符串开始去除空白后的数字转为整数。
parseFloat 转换字符串为浮点数,忽略字符串前面空白字符。
toFixed 可对数值舍入操作,参数指定保存的小数位
NaN表示无效的数值,不能使用==比较,通过使用 Object.is 方法判断两个值是否完全相同
7.Math
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 从数组中复制一部分到同数组中的另外位置。
copyWithin 从数组中复制一部分到同数组中的另外位置。
indexOf 是严格查找 类似于 ===
使用includes等不能查找引用类型,因为它们的内存地址是不相等的 但find 可以方便的查找引用类型
数组排序:
sort 排序顺序由返回值决定
Array.sort((a,b)=>return num
- 返回负数 a 排在 b前面
- 返回正数 b 排在a 前面
- 返回 0 时不动
迭代器方法:
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/in、for/of 遍历操作
可以使用 Object.getOwnPropertySymbols 获取所有Symbol属性,也可以使用 Reflect.ownKeys(obj) 获取所有属性包括Symbol
六、Set
- 只能保存值没有键名
- 严格类型检测如字符串数字不等于数值型数字
- 值是唯一的
- 遍历顺序是添加的顺序,方便保存回调函数
可以通过 filter 来实现两个Set的交集 差集 并集
WeakSet
WeakSet结构同样不会存储重复的值,它的成员必须只能是对象类型的值。
- 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
- 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
- 也是因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
- 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 WeakMap
七、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提供的存取器特性即使用函数来管理属性。
- 用于避免错误的赋值
- 需要动态监测值的改变
- 属性只能在访问器和普通属性任选其一,不能共同存在
Proxy
代理(拦截器)是对象的访问控制,setter/getter 是对单个对象属性的控制,而代理是对整个对象的控制。
如果代理以函数方式执行,会执行代理中定义 apply 方法。
JSON
JSON要求用双引号
使用JSON.stringify(hd) 将 JSON 转换为 字符串
使用 JSON.parse 将字符串 json 解析成对象
十一、模块设计
- 模块就是一个独立的文件,里面是函数或者类库
- 虽然JS没有命名空间的概念,使用模块可以解决全局变量冲突
- 模块需要隐藏内部实现,只对外开发接口
- 模块可以避免滥用全局变量,造成代码不可控
- 模块可以被不同的应用使用,提高编码效率