es6相关知识(创作中。。。) 1.let、var、constvar 存在变量提升只提升声明不提升赋值变量提升var 有变量提升let/const 同样提升但存在暂时性死区声明前无法访问作用域var 仅函数 / 全局作用域无块级作用域let/const 拥有块级作用域重复声明var 允许重复定义let、const 同一作用域不可重复声明全局挂载全局 var 会绑定 windowlet/const 不会赋值规则var/let 可声明不赋值const 声明必须初始化赋值修改权限var/let 可重新赋值const 禁止重新赋值引用类型内部属性可修改const 保存的是内存地址基本类型值不可变对象、数组这类引用类型地址不变内部属性、数组元素可以随意修改2.解构赋值q:解构默认值什么时候才会触发生效a:只有对应值严格等于 undefined 时默认值才生效null、空字符串、数字 0 都属于有值不会启用默认值。q:解构赋值能不能用于基本数据类型比如 const [a] 123 会报错吗为什么a:会报错。解构底层要求右侧可迭代数字、布尔、null、undefined 不可迭代数组解构只能接收数组、字符串、Set 等可迭代类型。undefined* 变量声明了但从未赋值* 对象访问不存在的属性* 函数无返回值默认返回 undefined* 函数少传参数形参为 undefined* 数组解构空位无匹配值null* 空值表示一个空对象指针* 只能手动赋值JS 不会自动生成 null* undefined null → true* undefined null → false3.扩展运算符 ... rest 剩余参数rest 和 arguments 区别*rest 是真正数组可以直接调用 reduce/map 等数组方法arguments 是类数组需转数组才能用数组 API*rest 仅收集剩余参数arguments 包含函数所有实参*rest 是 ES6 语法箭头函数不支持 arguments但可以用 rest*rest 语义清晰现代开发优先使用。扩展运算符 ... 只是浅拷贝只拷贝一层如果对象 / 数组存在多层嵌套内层引用类型和原数据共用同一个地址修改内层会影响原对象。Set的用法* Set 是集合元素唯一自动去重* 内部判断相等使用 SameValueZero认为 NaN NaN、0 -0* 只能存值没有键值对* 可遍历支持 for...of4.字符串的方法includes 与 indexOf 的区别* includes作用查找目标字符串首次出现的下标匹配到返回对应数字下标0、1、2…未匹配到固定返回-1判断存在需要额外写判断str.indexOf(xx) ! -1* indexOf作用单纯判断字符串是否包含目标片段匹配到true未匹配到false无需额外判断语义直观2.repeat 完整用法str.repeat(count) 1 count重复次数参数要求非负整数2返回重复拼接后的新字符串不修改原字符串特殊① count 0 返回空字符串② 小数参数 自动向下取整舍弃小数部分不会四舍五入③ 负数 / Infinity 直接抛出RangeError报错④ 参数会自动转数字5.函数的拓展箭头函数可以使用 arguments 获取全部实参吗箭头函数没有 arguments只能用 rest 参数接收所有参数6.数组的拓展Array.from的用法* 基础语法 Array.from(类数组/可迭代对象, 映射函数?, this指向?)* 返回全新数组不会修改原数据三大核心作用核心作用特征示列将类数组对象转为数组类数组特征包含数字下标 length 属性不能直接调用数组方法 常见类数组DOM 节点集合、arguments、自定义类数组{0: a, 1: b, length: 2}// 自定义类数组 const likeArr { 0: x, 1: y, length: 2 }; const arr Array.from(likeArr); console.log(arr); // [x,y]将可迭代对象转为数组实现了 Iterator 接口的数据字符串、Set、Map// 字符串转数组 Array.from(es6); // [e,s,6]// Set去重转数组const s new Set([1,2,2]); Array.from(s); // [1,2]// Map提取值const m new Map([[a,1],[b,2]]);Array.from(m); // [[a,1],[b,2]]快速生成指定长度数组普通new Array(n)生成空空位数组无法直接 mapArray.from生成填满内容的数组。// 生成5个0Array.from({ length: 5 }, () 0); // [0,0,0,0,0]/ / 生成 0,1,2,3,4 有序数组 Array.from({ length: 5 }, (item, index) index); // [0,1,2,3,4]2.第二个参数映射回调等同 map) ; 优势转换 遍历映射一步完成少一次循环。3.第三个参数修改回调内 this 指向7.对象的拓展1.Object.entries 完整用法 场景接收一个对象返回二维数组格式[[key1, value1], [key2, value2]]只提取对象自身可枚举属性原型上的属性不会获取。Map 支持二维数组初始化是对象快速转 Map 的标准写法const map new Map(Object.entries(obj));2.Object.freeze用法冻结一个对象让对象无法新增、删除、修改属性也不能修改属性描述符浅层次完全只读。Object.freeze仅冻结第一层如果属性是引用类型数组、对象内层依然可以修改。//实现深冻结 function deepFreeze(obj) { Object.keys(obj).forEach(key { const val obj[key]; if (typeof val object val ! null) { deepFreeze(val); } }); return Object.freeze(obj); }8.promise1. 四个静态方法标准定义Promise.all全部成功才 resolve任意一个 reject立刻 rejectPromise.race第一个落定成功 / 失败的为准Promise.allSettled全部完成才返回无论成功失败Promise.any第一个成功的为准全部失败才进入 catch