【前端开发】ES6知识点系统化梳理笔记

>ES6扩展:
#Map和Set是es6标准新增的数据类型

##Map是key-value(关键字-值),Map允许修改value,不允许修改key,Map支持下标操作
var m = new Map([['zhangsan',20],['lisi',25],['wangwu',19]]);
m.get('lisi') //25

##Set是key(关键字),Set的迭代器是const,不允许修改元素值,Set不支持下标操作
var m = new Set([1,2,3,4,3,2]);
m // Set{1,2,3,4}

#Symbol  
typeof Symbol  代表独一无二的值;
避免键名重复被覆盖;
无法进行字符串拼接和数字的计算;
可以转布尔型;

#find
发现数组中满足条件的第一个
var m = [10,20,30,60,26,50];
var n = m.find(function(item){
    return item > 50
})
console.log(n) // 60  取数组中第一个满足条件的

#findIndex
发现数组中满足条件的第一个数的下标序号
var m = [10,20,30,60,26,50];
var n = m.findIndex(function(item){
    return item > 50
})
console.log(n) // 3  取数组中第一个满足条件的位置下标

!! 转换为布尔值

#判断是否数组:
Array.isArray([])

#1、数组新增:
var arr = new Array(10,20,30) 可以多项也不可以一项,一项数据时返回代表的是长度10;
var arr = Array.of(20,10,30)  可以多项也可以一项;
#2、字符串新增;
2.1字符串中是否存在
ES5:
var str=“abcdefg”;
console.log( str.indexOf('c') !== -1)    //true   若该indexOf检索的下标值不等于-1则证明存在;
ES6:
str.includes('c')  //true 若存在为true否则false
str.startsWith('ab')  //true  若是ab开头则true  否则false
str.endsWith('fg')  //true  若是fg结尾则true  否则false
2.2字符串重复拷贝
console.log(str.repeat(3))  //abcdefgabcdefgabcdefg  重复拷贝
2.3超级字符串:
反引号包起来(换行生效和空格会生效)
反引号中间拼接变量${name}
var n = 2;
var m  = 3;
console.log('n+m=${n+m}') 这里是反引号包裹
var isRaining = true 
console.log('今天天气是${isRaining ? "雨天" : "晴天"}')   这里是反引号包裹

function fn (){
  return "miaov"
}
console.log('fn执行结果是:${ fn() }')  //函数也可以放反引号里执行
#3、对象新增:
3.1对象键名和键值相同可缩写:
var a=1;
var obj = {a};
console.log(obj) //a:1
3.2函数调用:
var obj = {
    a,
    fn(){
        console.log("执行了")
    },
    b:100
};
obj.fn();
3.3键名动态改变:
var attrname = "width";
var obj={
    [attrname]:100
}
 console.log(obj)  //键名随着attrname变化而变化
3.4函数名动态改变:
var attrFn = "fn";
var obj = {
    [attrFn](){
        console.log("attrFn执行了")
    }
}
obj.fn();
3.5判断值是否完全相等
console.log(1 == "1") //true 隐式类型转换
console.log(NaN === NaN) //false  es5的不足
console.log(Object.is(1,1)) //true   es6 相当于 ===  
console.log(Object.is(1,"1")) //false   即判断类型又判断值是否相等
console.log(Object.is(NaN,NaN)) //true   解决es5的不足之处
console.log(Object.is({},{})) //false  {}为两个值
var obj={};
console.log(Object.is(obj,obj)) //true  obj为一个对象
3.6 Object.assign()对象参数合并
function move(obj){
    var defaultObj = {
        ease : "linear",
        duration:1000
    }
<!--     var para = {
        ease:obj.ease || defaultObj.ease,
        duration:obj.duration || defaultObj.duratio
    } -->
    var para = {};
    Object.assign(para,defaultObj,obj)  //es6新属性  合并对象参数,后面依次合并到第一个参数,重复参数后面会覆盖前面的
    console.log(para)
}
move({
    ease:"easeIn",
    duration:2000
})
3.7for of 对象遍历(Object.keys(obj))
var obj={
    a:1,
    b:2
}
console.log(Object.keys(obj)) // [a,b]
console.log(Object.values(obj)) //[1,2]
for(var attr of Object.values(obj)){
    console.log(attr) //1 2
}

console.log(Object.entries(obj)) //解构成二维数组
for(var [key,val] of Object.entries(obj)){
     console.log(key,val) //分别取值 a 1 b 2
}
3.8 ES6扩展运算符
var a = {
  a:1,
  b:2
}

var c = {
...a,
f:9999,
g:8888
}
console.log(c) //{a: 1, b: 2, f: 9999, g: 8888}
...obj 打散成参数的形式
var arr = [1,2,3,4];
console.log(arr) //[1,2,3,4]
console.log(...arr) //1 2 3 4
使用场景----数组取最大值
var arr = [1,23,4,5];
console.log(Math.max(1,23,4,5)) //23  参数形式是可以取到
console.log(Math.max(...arr)) //23 先用...扩展用算符转成参数形式即可
使用场景---数组去重
var aa = [1,2,3,2,4,5,2,3,1];
var bb = [...new Set(aa)] //先Set去重然后...运算符打散最后数组[]
console.log(bb) //[1,2,3,4,5]
#4、函数的扩展
##4.1 函数传递参数默认值设置
ES5写法:
function add(a,b){
var _b = b === undefined ? 100 : b ;
return a+_b 
}
console.log(add(10,0))

ES6写法:
function add(a,b=100){
    return a+b
}
console.log(add(10,0))
##4.2函数剩余参数
function fn(a,...r){
console.log(a,r) // 1 [2,3,4,5] ...r扩展运算符合并剩余参数为一个数组
console.log(r) // [2,3,4,5] 

}
fn(1,2,3,4,5)
##4.3箭头函数
var add = (a,b) => {
    return a+b
}
add();
省略写法
var add = (a,b) => a+b //语句只有一句时省略{}和return
var add = (a,b) => ({miaov:3}) //{miaov:3} 想要返回对象需用()包起来
其他变体写法
var add = ()=>{
    miaov:for(var i = 0; i<10;i++){
        console.log(i)
        if(i == 3){
            break miaov;
        }
    }
}
add()

参数只有一个时,可省略()
var add = a => a*100
console.log(add(2)) //200

筛选需要的数
var arr = [10,21,32,44,77];
var res = arr.filter(item=> item >21)
console.log(res)

箭头函数注意事项:
(1).内部this指向window,对于箭头函数修改this指向是没有用的(普通函数随着点击有可能是document,所以非箭头函数要注意this指向问题);
(2).箭头函数内部没有arguments,可用(...r)模拟使用;
(3).箭头函数不能通过new调用,无构造器;
#5、模块化开发
模块开发加type="module",且本地服务访问才生效
<script src="./data.js" type="module"> </script> 
import {n} from "./data.js";
##模块化开发语法
第一种 导出变量和函数
var n = 100;
var m = 20;
function(x,y){
    return x+y
}
export { n as newN,m,add}
html中使用
import {newN,m,add} from "./a.js";

第二种 直接导出变量
exprot var n = 200;
import {n} from "./a.js";

第三种 直接导出函数
exprot function fn(){
    console.log(1)
};
import {fn} from "./a.js";

第四种 默认导出
var n = 100;
var m = 20;
function(x,y){
    return x+y
}
export default 1000;

import d from "./a.js";

//全部导出
import * as tool from "./a.js"
用法
consoe.log(tool.m,tool.newN,tool.default)

只导入模块
console.log("a.js被加载")
import "./a.js"

模块化注意:
1、引入计算多次,模块只执行加载一次;
2、导出来的值是模块里的值的引用;

#6、promise
##promise基础
1、异步编程解决方案;
##promise的基本使用
宏任务先执行,后微任务,最后定时器
 var都是宏任务   .then(微任务)
    var p = new Promise((resolve,reject)=>{
                console.log("实例化...")
                return resolve("成功!");    
                // reject("失败了")
               console.log("shibai")
            })
            p.then((data)=>{
                console.log("then",data)
            }).catch((data)=>{
                console.log(data)
            })
使用方法:
Promise.all  全部执行完才返回
Promise.race  返回最先执行完的

#7、其他扩展总结:

之前嵌套的代码可用fn(a,b,c).then(()=>fn(a,b,c)).then(()=>fn(a,b,c))的形式比价简洁易维护了

选择器选取元素
document.getElementById  动态获取元素  会随着元素变化而变化
document.querySelector  静态获取元素 不会随着元素变化而变化

数字加undefined  结果为 NaN

字符串+undefined  结果是拼接起来ssundefined

var fn = function(a,b,c){
    console.log(arguments)  //参数集合
}
fn(1,2,3)

document.onclick = fn; //点击html页面即可触发
原文地址:https://www.cnblogs.com/xiaohuizhang/p/11721496.html