ES6语法总结

新的声明方式
全局声明:var
局部声明:let const
优点:减少环境污染
区别:
1. var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
2.let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问。
3.const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
变量的解构赋值

数组的解构赋值

letl  [a,b,c]=[1,2,3];
let [a, [b, c], d] = [1, [2, 3], 4]; //两边的结构必须一样
let [foo = true] =[];
console.log(foo); //控制台打印出true
let [a, b = "wgg"] = ["王", undefined]; // b还是取默认值 相当于没有赋值
let [a, b = "wgg"] = ["王", null]; // b是取null 相当于为空 ''

对象的解构赋值

数组解构是根据位置解构 对象是根据key值解构

let {foo,bar} = {foo:'Wgg',bar:'王果果'};
console.log(foo+bar); //控制台打印出了“Wgg王果果”

let ber;
({ ber } = { ber: "wang" }); // 必须加括号  否则报错
console.log(ber);

字符串解构

let [a, b, c, d, e] = ["wangg"];
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(e);
扩展运算符和rest运算符

对象扩展运算符(…)

当编写一个方法时,我们允许它传入的参数是不确定的。这时候可以使用对象扩展运算符来作参数

function wgg(...arg) {
  console.log(arg[0]); // 1
  console.log(arg[1]); // 2
  console.log(arg[2]); // 3
  console.log(arg[3]); // undefined
}
wgg(1, 2, 3);

扩展运算符的用处

let arr1 = ["www", "wgg", "com"];

let arr2 = arr1;
arr2.push("zhui");
console.log(arr1);  // 此时arr1被改变了["www", "wgg", "com", "zhui"]  因为我们这是对内存堆栈的引用,而不是真正的赋值

let arr2 = [...arr1]; // 只追加arr1里面的元素给arr2 不是把整个数组给arr2
arr2.push("zhui");
console.log(arr1); // ["www", "wgg", "com"]

rest运算符

function rest(a, ...arg) {
  console.log(a); // b
  console.log(arg.length); // 4  默认取剩余不确定的参数
  for (let val of arg) {
    console.log(val); //  1  12 3  4  不用原始的for in 循环
  }
}
rest("b", 1, 12, 3, 4);
字符串模版
let a = "我叫";
let b = `${a}王果果呀,<br><b>哈哈哈</b>`;
document.write(b);
document.write("王念念||".repeat(3));
// 支持运算符
let a=1;
let b=2;
let result=`${a+b}`;
document.write(result);

字符串查找

  • includes
let wgg='王果果';
let blog = '非常高兴你能看到这篇文章,我是王果果。';
document.write(blog.includes(wgg));

需要注意的是:starts和ends 后边都要加s

  • 判断开头是否存在
blog.startsWith(wgg);
  • 判断结尾是否存在
blog.endsWith(wgg);
  • 复制字符串
document.write('wgg|'.repeat(3));
ES6中新增的数组知识(1)

JSON数组格式转换

  • Array.from
  • Array.of()
  • find( )实例方法

所谓的实例方法就是并不是以Array对象开始的,而是必须有一个已经存在的数组,然后使用的方法,这就是实例方法,这里的find方法是从数组中查找。在find方法中我们需要传入一个匿名函数,函数需要传入三个参数:value:表示当前查找的值。
index:表示当前查找的数组索引。
arr:表示当前数组。

 let wgg = {
  "0": "王",
  "1": "年",
  "2": "念",
  length: 3 // 加上这个length属性  就可以转换成数组
};
console.log(Array.from(wgg)); // ["王", "年", "念"] 
---------
let arr = Array.of(3, 4, 5, 6);
console.log(arr); // [3, 4, 5, 6]
------------
let arr=[1,2,3,4,5,6,7,8,9];
console.log(arr.find(function(value,index,arr){
    return value > 5;
}))  // 控制台输出了6,说明找到了符合条件的值,并进行返回了,如果找不到会显示undefined。
ES6中新增的数组知识(2)
  • fill( )实例方法 【作用是把数组进行填充,它接收三个参数,第一个参数是填充的变量,第二个是开始填充的位置,第三个是填充到的位置】
let arr3 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
arr3.fill("wgg", 2, 5);
console.log(arr3); // [0, 1, "wgg", "wgg", "wgg", 5, 6, 7, 8, 9]  索引为2开始 索引为5结束 索引为5就没有了

数组的遍历

for…of的循环可以避免我们开拓内存空间,增加代码运行效率,所以建议大家在以后的工作中使用for…of循环。有的小伙伴会说了,反正最后要转换成ES5,没有什么差别,但是至少从代码量上我们少打了一些单词,这就是开发效率的提高。

let arr=['wgg','王果果','哈哈哈哈哈']

for (let item of arr){
    console.log(item);
}

同时输出数组的内容和索引:我们用entries()这个实例方法,配合我们的for…of循环就可以同时输出内容和索引了。

// 此方法可以输出索引加item值
let wggh = ["wang", "nian", "hhh"];
for (let [index, val] of wggh.entries()) {
  console.log(index + ":" + val);
}
--------
// 此方法可以输出index值
for (let index of arr.keys()) {
  console.log(index);
}
ES6中的函数和数组补漏

对象的函数解构

// 对象的解构赋值   免得打 json.a  json.b
let json = {
  a: "王",
  b: "念念"
};
//  fun 里面的形参 必须和json 里面的数据一样  否则报错
function fun({ a, b = 1 }) {
  console.log(a + b);
}
fun(json);

数组的函数解构

let a = [1, 2, 3];
function wgg(a, b, c) {
  console.log(a, b, c); // 1 2 3
}
wgg(...a);

in的用法

对象判断
// in 判断对象里面是否有这个值
let obj = {
  a: "王果果",
  b: "王哈哈哈"
};
console.log("a" in obj); // true
console.log("c" in obj); // false

数组判断
// 先来看一下ES5判断的弊端,以前会使用length属性进行判断,为0表示没有数组元素。但是这并不准确,或者说真实开发中有弊端
// 判断空位
let kong = [, , ,];
console.log(1 in kong); // false 表示数组下标为1的地方没有这个值 为空

数组的遍历方法

1.forEach

let arr=['wgg','王果果','前端教程'];

arr.forEach((val,index)=>console.log(index,val));

forEach循环的特点是会自动省略为空的数组元素,相当于直接给我们筛空了。当是有时候也会给我们帮倒忙

2.filter

let arr=['wgg','王果果','前端教程'];

arr.filter(x=>console.log(x));

3.some

let arr=['wgg','王果果','前端教程'];

arr.some(x=>console.log(x));

4.map

let arr=['wgg','王果果','前端教程'];

console.log(arr.map(x=>'web'));  // map在这里起到一个替换的作用

5.join()方法

let arr=['wgg','王果果','前端教程'];

console.log(arr.join('|'));

join()方法就是在数组元素中间,加了一些间隔,开发中很有用处。

6.toString()方法

let arr=['wgg','王果果','前端教程'];

console.log(arr.toString());  // 转换时只是是用逗号隔开了
ES6中对象

对象赋值

let skill = "王";
let name = "念念";
let poi = { name, skill };
console.log(poi); // {name: "念念", skill: "王"}

对象Key值构建

let wen = "zekun";
let objj = {
  [wen]: "wang"
};
console.log(objj); // {zekun: "wang"}

Object.is( ) 对象比较

// === 同值相等  is严格相等
console.log(+0 === -0); // true  都是0
console.log(NaN === NaN); // false  不知道具体是哪一个对象

console.log(Object.is(+0, -0)); // false  一个正  一个负
console.log(Object.is(NaN, NaN)); // true  都是NaN

Object.assign( )合并对象

let a = { name: "王" };
let b = { sex: "女" };
let c = { age: "22" };
let d = Object.assign(a, b, c);
console.log(d); // {name: "王", sex: "女", age: "22"}
Symbol在对象中的作用

声明Symbol

var a = new String;
var b = new Number;
var c = new Boolean;
var d = new Array;
var e = new Object; 
var f= Symbol();
console.log(typeof(d));

Symbol的打印

var g = Symbol('wgg');
console.log(g);
console.log(g.toString());  // 没有toString的是红字,toString的是黑字

Symbol在对象中的应用

var wgg= Symbol();
var obj={
    [wgg]:'王果果'
}
console.log(obj[wgg]);
obj[wgg]='web';
console.log(obj[wgg]);

Symbol对象元素的保护作用

在对象中有很多值,但是循环输出时,并不希望全部输出,那我们就可以使用Symbol进行保护

//没有进行保护的写法:

var obj={name:'wgg',skill:'web',age:18};

for (let item in obj){
    console.log(obj[item]);
}
//现在我不想别人知道我的年龄,这时候我就可以使用Symbol来进行循环保护。

let obj={name:'wgg',skill:'web'};
let age=Symbol();
obj[age]=18;
for (let item in obj){
    console.log(obj[item]);
} 
console.log(obj);
Set和WeakSet数据结构

Set的声明

set 不是数据类型,而是数据结构。它是ES6中新的东西,并且很有用处。Set的数据结构是以数组的形式构建的。类似后端转给前端的json结构

let setArry = new Set(["wang", "hha", "heihie"]); 
console.log(setArry); // Set(3) {"wang", "hha", "heihie"}

Set值的增删查

setArry.add("前端"); // 追加方法
console.log(setArry); // Set(4) {"wang", "hha", "heihie", "前端"}
setArry.delete("前端"); // 删除方法
console.log(setArry); // Set(4) {"wang", "hha", "heihie"}
console.log(setArry.has("前端")); // false  // 判断是否有这个字符
setArry.clear(); // 清除所有
console.log(setArry); // Set{}

// set的循环 for…of…循环
let arr = new Set(["1", "2", "34"]);
for (let item of arr) {
  console.log(item); // 1  2 34
}

size属性

let setArr = new Set(["wgg", "王果果", "web", "jspang"]);
for (let item of setArr) {
  console.log(item); // 最后一个wgg没有打印出来  因为重复了
}
console.log(setArr.size); // 3

WeakSet的声明

let weakObj = new WeakSet();  // 不能直接在里面面赋值对象  必须通过add的方法添加
let obj = { a: "wgg", b: "wnn" };
// ==
let obj1 = obj;  
weakObj.add(obj);
weakObj.add(obj1);
console.log(weakObj);  // WeakSet {a: "wgg", b: "wnn"}
// ====
let obj1 = { a: "wgg", b: "wnn" };  // 开辟了一个新的空间
weakObj.add(obj);
weakObj.add(obj1);
console.log(weakObj);  // WeakSet {a: "wgg", b: "wnn",a: "wgg", b: "wnn"}
map数据结构

Map的灵活性要更好,你可以把它看成一种特殊的键值对,但你的key可以设置成数组/对象,值也可以设置成字符串

Json和map格式的对比

// 普通的json结构
let json = {
  name: "wgg",
  skill: "web"
};
console.log(json.name);
// map 结构 
var map = new Map();
map.set(json, "wgg");
console.log(map); //  Map(1) {{name: "wgg", skill: "web"} => "wgg"}
map.set("wgg2", json);
console.log(map); // Map(2) {{name: "wgg", skill: "web"} => "wgg", "wgg2" => {name: "wgg", skill: "web"}}

map的增删查

get size clear() delete() has

// get取值
console.log(map.get(json)); // wgg
console.log(map.get("wgg2")); // {name: "wgg", skill: "web"}
// 删除
map.delete(json);
console.log(map); //  Map(1) {{"wgg2" => {name: "wgg", skill: "web"}}
console.log(map.size); // map里面还剩下的个数 1

map.clear(); // 清除所有
console.log(map.has("wgg2")); // true 查找方法  返回true or false
用Proxy进行预处理

声明Proxy

new Proxy({},{})// 两个花括号,第一个花括号就相当于我们方法的主体,后边的花括号就是Proxy代理处理区域,相当于我们写钩子函数的地方

get属性,set属性,apply的使用

get属性是在你得到某对象属性值时预处理的方法,他接受三个参数:target:得到的目标值;key:目标的key值,相当于对象的属性;property:这个不太常用,用法还在研究中,还请大神指教。

set属性是值你要改变Proxy属性值时,进行的预先处理。它接收四个参数。target:目标值;key:目标的Key值;value:要改变的值;receiver:改变前的原始值。

apply的作用是调用内部的方法,它使用在方法体是一个匿名函数时

let pro = new Proxy(
  {
    add: function(val) {
      return val + 1;
    },
    name: "my name is wgg"
  },
  {
    get: function(target, key, property) {
      console.log(target); // {name: "my name is wgg", add: ƒ}
      console.log(key); // name
      return target[key]; // my name is wgg
    },
    set: function(target, key, value, receiver) {
      console.log(`setting ${key} = ${value}`); // setting name = 王果果啊
      return (target[key] = value); // 必须得返回值
    }
  }
);
console.log(pro.name); // my name is wgg
pro.name = "王果果啊";
console.log(pro.name); // 王果果啊

// apply方法
let target = function() {
  return "我叫王果果";
};
let handel = {
  apply(target, ctx, args) {
    console.log("jinlail");
    return Reflect.apply(...arguments); // 需要死记硬背
  }
};
let pRo = new Proxy(target, handel);
console.log(pRo()); // 我叫王果果
promise对象的使用

这个过程是有一定的顺序的,你必须保证上一步完成,才能顺利进行下一步。

let state=1;
function step1(resolve,reject){
    console.log('1.开始-洗菜做饭');
    if(state==1){
        resolve('洗菜做饭--完成');
    }else{
        reject('洗菜做饭--出错');
    }
}


function step2(resolve,reject){
    console.log('2.开始-坐下来吃饭');
    if(state==1){
        resolve('坐下来吃饭--完成');
    }else{
        reject('坐下来吃饭--出错');
    }
}


function step3(resolve,reject){
    console.log('3.开始-收拾桌子洗完');
     if(state==1){
        resolve('收拾桌子洗完--完成');
    }else{
        reject('收拾桌子洗完--出错');
    }
}

new Promise(step1).then(function(val){
    console.log(val);
    return new Promise(step2);

}).then(function(val){
     console.log(val);
    return new Promise(step3);
}).then(function(val){
    console.log(val);
    return val;
});
class类的使用

类的声明

class Code{
    name(val){
        console.log(val);
    }
}

类的使用

我们已经声明了一个类,并在类里声明了name方法,现在要实例化类,并使用类中的方法

// 实例化类
let wgg = new Code;
wgg.name("王欢欢"); // 王欢欢

类的多方法声明


注意:1.多个函数的时候不用打分号;2.必须加return 否则下面函数引用的时候会报错undefined

class Code {
  name(val) {
    console.log(val);
    return val; // 必须加return 否则下面函数引用的时候会报错undefined
  }
  skill(val) {
    console.log(this.name("王哈哈哈哈") + val); // 引用类里面的函数 王哈哈哈哈skill
  }
}
let wgg = new Code;
wgg.name("王欢欢"); // 王欢欢
wgg.skill("skill");

类的传参constructor

class Code {
  //   类传参
  constructor(a, b) {
    this.a = a; //类设置
    this.b = b;
  }

  add() {
    return this.a + this.b;
  }
}
// 实例化类
let wgg = new Code(1, 2);
console.log(wgg.add()); // 3 通过类传参

class的继承

声明一个Jichen的新类并继承Code类,Jichen新类里边为空,这时候我们实例化新类,并调用里边的name方法。结果也是可以调用到的。

class Code {
  name(val) {
    // console.log(val);
    return val; // 必须加return 否则下面函数引用的时候会报错undefined
  } //多个函数的时候不用打分号
  skill(val) {
    console.log(this.name("王哈哈哈哈") + val); // 引用类里面的函数 王哈哈哈哈skill
  }
}
// 用 extends 方法继承Code里面的函数
class Jichen extends Code {}
let gt = new Jichen();
gt.name("继承"); //  继承
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值