ES6新增特性

目录

第一篇、开发环境搭建

 第二篇、三种声明方式

2.1 var(全局声明)

2.2 let(局部声明)

2.3 const(常量声明)

第三篇、解构赋值

3.1 数组的解构赋值

3.2 对象的解构赋值

3.3 字符串的解构赋值

第四篇、对象扩展运算符和rest运算符

4.1 对象扩展运算符

4.2 rest运算符

第五篇、新增字符串

5.1 字符串模板

5.2 字符串查找

5.3 字符串的复制

第六篇、数字的操作

6.1 数字判断

第七篇、数组方法

7.1 Array.from()

7.2 Array.of()

7.3 find()实例方法

7.4  fill()实例方法

7.5 entries()实例方法

7.6 数组循环

7.6.1 for...of

第八篇、函数扩展和箭头函数

 第八篇、函数和数组的查缺补漏

 8.1 对象的函数解构

 8.2 数组解构

 8.3 in的用法

 8.4 数组遍历

8.5 数组转为字符串

第九篇、ES6中的对象

9.1 对象的赋值

9.2 key值的构建

9.3 自定义对象

9.3.1 is()

9.3.2 assign()

第十篇、Symbol在对象中的作用

10.1 认识Symbol

10.2 Symbol在对象中的应用

第十一篇、Set和WeakSet数据结构

11.1 Set的增删查

 11.2 Set的输出

11.3 WeakSet的声明

11.4  WeakSet重复值的问题

 第十二篇、map的数据结构

12.1 初始map

12.2 map的增删查

第十三篇、proxy

第十四篇、promise

第十五篇、class

 15.1 类方法的传参

 15.2 类的传参

15.3 类的继承

第十六篇、模块化操作

 16.1 多变量输出

16.2 函数化输出

16.3 语义化输出


第一篇、开发环境搭建

ES6跟我们的ES5不一样,因为很多浏览器可能不支持ES6的语法,所以需要通过转码将ES6的语法转为ES5的语法,来使得大部分浏览器可以识别

//根目录下初始化npm生成package.json
npm init -y

{
  "name": "ES6",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

//全局安装babel-cli
npm install -g babel-cli

//安装babel-preset-es2015和babel-cli
npm install --save-dev babel-preset-es2015 babel-cli

//安装完成之后在package.json下会多出来如下代码
"devDependencies": {
    "babel-cli": "^6.26.0",
    "babel-preset-es2015": "^6.24.1"
  }

//在根目录下需要建一个.babelrc文件,文件中写入如下代码
{
    "presets":[
        "es2015"
    ],
    "plugins":[]
}

//最后执行如下命令
//将src/index.js文件转为ES5的语法,转完之后的文件在dist/index.js
babel src/index.js -o dist/index.js

 目录结构如下:

html文件中引入的js需要引入的是dist下的index.js

----------------------------转码前---------------------

>src/index.js

let a=1;
console.log(a)

----------------------------转码后---------------------

>dist/index.js

"use strict";

var a = 1;
console.log(a);
//每次都要手动输入很长的命令才可以转码,我们要简化一下

> 修改package.json的script里的内容如下

"scripts": {
    "build": "babel src/index.js -o dist/index.js"
  },

//这样我们每次执行npm run build就可以打包执行代码

 第二篇、三种声明方式

2.1 var(全局声明)

//var是全局声明变量
var a = "Hamy";
console.log(a)    //Hamy
window.onload = function(){
    console.log(a)    //哈米
}
{
    var a = "哈米";
}
console.log(a)    //哈米
//在块中再次声明该变量,会覆盖全局声明的变量

2.2 let(局部声明)

//let 局部声明
{
    let a="哈米"
}
console.log(a);    //报错,因为a是在{}中局部声明,在全局中获取不到

for(var i=0;i<10;i++){
    console.log("循环体中:"+i)    //1 2 3 4 5 6 7 8 9 
}
console.log("循环体外:"+i)    //10


for(let i=0;i<10;i++){
    console.log("循环体中:"+i)    //1 2 3 4 5 6 7 8 9 
}
console.log("循环体外:"+i)    //报错,因为i是局部变量,全局中找不到i

2.3 const(常量声明)

const a = "Hami";
var a = "哈米";
console.log(a);    //报错,常量声明完成之后不能被修改,否则报错

第三篇、解构赋值

3.1 数组的解构赋值

//数组的解构赋值要一一对应,否则报错

let [a,b,c] = [0,1,2]
console.log(a,b,c)    //0 1 2

let [a,[b,c],d] = [0,1,2]
console.log(a,b,c)    //报错

let [a,[b,c],d] = [0,[1,2],3]
console.log(a,b,c,d)    //0 1 2 3

let [foo='true'] = []
console.log(foo)    //true  可以使用默认值

let [a,b='哈米'] = ['hamy']
console.log(a+b)    //hamy哈米

let [a,b='哈米'] = ['hamy',undefined]
console.log(a+b)    //hamy哈米    undefined是空

let [a,b='哈米'] = ['hamy',null]
console.log(a+b)    //hamynull    null是有值,值为null  

3.2 对象的解构赋值

//对象的解构赋值是通过key值来取的

let {foo,bar} = {foo:'Hamy',bar:'哈米'}
console.log(foo+bar)    //Hamy哈米

let {foo,boo} = {foo:'Hamy',bar:'哈米'}
console.log(foo+boo)    //Hamyundefined    对象中找不到为boo的key值

//如果先定义,再解构,解构的时候需要加上()
let foo;
({foo}) = {foo:'Hamy'}
console.log(foo+bar)

3.3 字符串的解构赋值

//字符串解构

const [a,b,c,d]='Hamy';
console.log(a,b,c,d)    //H a m y

第四篇、对象扩展运算符和rest运算符

4.1 对象扩展运算符

//不确定参数有多少个,可以使用对象扩展运算符...
//当取不到之的时候取到的就是undefined
function hamy(...arg){
    console.log(arg[0]);    //1
    console.log(arg[1]);    //2
    console.log(arg[2]);    //3
    console.log(arg[3]);    //undefined
}
hamy(1,2,3)

//改变arr2的值会影响arr1的值
let arr1 = ['www','xueshuai','top'];
let arr2 = arr1;
console.log(arr2);     //['www','xueshuai','top']
arr2.push('xueshuai');
console.log(arr1);    //["www", "xueshuai", "top", "xueshuai"]

//使用扩展运算符将arr1里的值赋给arr2,修改arr2不会影响arr1
let arr1 = ['www','xueshuai','top'];
let arr2=[...arr1];
console.log(arr2);//['www','xueshuai','top']
arr2.push('xueshuai');
console.log(arr2);//["www", "xueshuai", "top", "xueshuai"]
console.log(arr1);//['www','xueshuai','top']

4.2 rest运算符

使用 for...of 代替 for

//rest 剩余参数
function hamy(first,...arg){
    console.log(arg.length)    //7 因为first是0,arg是0后面的数,长度为7
    for(let val of arg){
        console.log(val)    //1 2 3 4 5 6 7
    }
}
hamy(0,1,2,3,4,5,6,7)

第五篇、新增字符串

5.1 字符串模板

//使用反引号,反引号中使用${}添加变量
//支持空格
//支持html标签
//支持运算
let hamy = '哈米';
let txt = `锄禾日当午,<br>汗滴禾下土,<br>谁之盘中餐,<br>粒粒皆辛苦。${hamy}`
document.write(txt)   //写在页面


let a=1;
let b=2;
let result=`${a+b}`;
document.write(result);

5.2 字符串查找

//字符串查找
document.write(txt.includes(hamy))    //查看字符串中有没有hamy
document.write(txt.startsWith(hamy))    //查看字符串中开头有没有hamy
document.write(txt.endsWith(hamy))    //查看字符串中结尾有没有hamy

5.3 字符串的复制

//字符串的复制,repeat中传入要显示的数量
document.write('hamy |'.repeat(20))

第六篇、数字的操作

//二进制声明 Binary
let binary = 0B010101;
console.log(binary); //21

//八进制声明 Octal
let octal = 0o666;
console.log(octal); //438

6.1 数字判断

let a=11;
console.log(Number.isFinite(a));    //true
console.log(Number.isFinite('hamy'));   //false
console.log(Number.isFinite(NaN));  //false
console.log(Number.isFinite(undefined));    //false

//判断是不是数字
Number.isFinite(a)

//判断NaN
console.log(Number.isNaN(NaN)); //true
console.log(Number.isNaN(4));   //false

//判断是不是整数
let a = 918.1;
console.log(Number.isInteger(a));   //false

//转换为整数
console.log(Number.parseInt(a));   //918

//转换为浮点数
console.log(Number.parseFloat(a));   //918.1

//最大安全整数和最小安全整数
let hamy = Math.pow(2,53)-1
console.log(Number.MAX_SAFE_INTEGER)    //9007199254740991
console.log(Number.MIN_SAFE_INTEGER)    //-9007199254740991
console.log(Number.isSafeInteger(hamy))    //true 判断是不是安全整数

第七篇、数组方法

7.1 Array.from()

json的数组格式转为数组格式

//什么是json的数组格式
let json = {
    "0":"JSPang",
    "1":"技术胖",
    "2":"大胖逼逼叨",
    length:3
}

//json数组格式转为数组
let arr = Array.from(json);
console.log(arr);  //['JSPang','技术胖','大胖逼逼叨']

7.2 Array.of()

字符串/数字转为数组格式

//Array.of()转为数组
let arr = Array.of(3,4,5,6)
console.log(arr)    //[3,4,5,6]

let arr1 = Array.of('jspang','技术胖')
console.log(arr1)    //['jspang','技术胖']

7.3 find()实例方法

实例方法指的是需要先有一个实例,然后该实例调用该实例方法

//find(fn) 实例方法
//fn(value,index,arr){}
//value 值        |    index  下标        |    arr 该数组
//按条件查找时,遇到满足条件的情况,停止查找
//按值查找时,查找到返回改值,否则返回undefined

let arr = [1,2,3,4,5,6,7,8,9];
console.log(arr.find(function(value,index,arr){
    return value > 5;
}))        //6


let arr1 = ['jspang','技术胖','大胖逼逼叨'];
console.log(arr.find(function(value,index,arr){
    return value == '小胖子';
}))        //undefined

7.4  fill()实例方法

//fill(str,start,end) 替换操作
//str要替换的字符串    |    start开始替换的下标(从0开始)    |    end终止的下标(不包含)

let arr = ['jspang','技术胖','大胖逼逼叨'];
arr.fill('web',1,3)
console.log(arr)    //['jspang','web','web']

7.5 entries()实例方法

let arr = ['jspang','技术胖','大胖逼逼叨'];

let list = arr.entries();

console.log(list.next().value);        //[0, "jspang"]
console.log('--------------------------------');    
console.log(list.next().value);        //[1, "技术胖"]
console.log('********************************');
console.log(list.next().value);        //[2, "大胖逼逼叨"]
console.log('================================');

7.6 数组循环

7.6.1 for...of

let arr = ['jspang','技术胖','大胖逼逼叨'];

//输出数组项
for(let item of arr){
    console.log(item);    //'jspang'    '技术胖'    '大胖逼逼叨'
}

//输出数组下标
for(let item of arr.keys()){
    console.log(item);    //0    1    2
}

//输出数组项和下标
for(let [index,val] of arr.entries()){
    console.log(index+':'+val);    //    0:jspang    1:技术胖     2:大胖逼逼叨
}

第八篇、函数扩展和箭头函数

在ES5中严格模式只能写在js最前面,在ES6中严格模式可以写在函数体内,但是该函数参数不能有默认值,否则报错

 严格模式

function add(a,b) {
    'use strict'

    if(a == 0){
        throw new Error('A is Error')    //主动抛错
    }
    return a+b;
}

console.log(add(1,2))    //3

 获得传递参数的个数

//获得传递参数的个数

function add(a,b) {
    return a+b;
}
console.log(add.length) //只能获取必传参数,参数有了默认值不算在内

 箭头函数

箭头函数中不能使用构造函数

/*function add(a,b) {
    return a+b;
}*/

var add = (a,b) => a+b;    //(内为函数的形参)    如果函数体内只有一行代码的话,可以不加{}
var add = (a,b) => {return a+b};    //如果必须要写return的话,是需要加{}

console.log(add.length)    //2

 第八篇、函数和数组的查缺补漏

 8.1 对象的函数解构

//对象的函数解构

let json = {
    a:'jspang',
    b:'技术胖'
}

function fun({a,b}){
    console.log(a,b)
}

fun(json);    //'jspang'    '技术胖'

 8.2 数组解构

//数组解构
let arr = ['jspang','技术胖','前端教程'];

function fun(a,b,c){
    console.log(a,b,c)
}

fun(...arr);    //jspang 技术胖 前端教程

 8.3 in的用法

//in的用法
let obj = {
    a:'技术胖',
    b:'jspang'
}
console.log('a' in obj);    //true

let arr = [,,,]
console.log(arr.length);    //3    其实为空,容易引起业务逻辑错误
console.log(0 in arr);        //false

 8.4 数组遍历

let arr = ['jspang','技术胖','前端视频'];

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

arr.filter(x => console.log(x));    //过滤

arr.some(x => console.log(x));    //一些

console.log(arr.map(x=> 'web'))    //替换

8.5 数组转为字符串

let arr = ['jspang','技术胖','前端视频'];

console.log(arr.toString());    //jspang,技术胖,前端视频

console.log(arr.join('|'));     //jspang|技术胖|前端视频

第九篇、ES6中的对象

9.1 对象的赋值

let name = 'jspang';
let skill = 'web';

//ES5
let obj = {
    name:name,
    skill:skill
}

//ES6
let obj = {
    name,
    skill
}

console.log(obj)

9.2 key值的构建

//不确定key是什么的时候,使用'[变量]'代替key值
let key = "skill";

let obj = {
    [key]:'web'
}
console.log(obj);    //{skill:'web'}

9.3 自定义对象

9.3.1 is()

//is()    判断对象是否相等
//===同值相等    is严格相等

let obj1 = {name:'jspang'};
let obj2 = {name:'jspang'};

console.log(obj1.name === obj2.name);     //true
console.log(Object.is(obj1.name,obj2.name));     //true

console.log(+0 === -0);     //true
console.log(NaN === NaN);   //false

console.log(Object.is(+0,-0));    //false
console.log(Object.is(NaN,NaN));   //true

9.3.2 assign()

//assign()    合并对象
let a={a:'jspang'}
let b={b:'技术胖'}
let c={c:'web'}
let d=Object.assign(a,b,c);
console.log(d)    //{a: "jspang", b: "技术胖", c: "web"}

第十篇、Symbol在对象中的作用

10.1 认识Symbol

//Symbol

//声明
let f = Symbol();
console.log(typeof f);    //symbol

//输出
let jspang = Symbol('技术胖');
console.log(jspang);    //Symbol(技术胖)    Symbol类型
console.log(jspang.toString());     //Symbol(技术胖)    转为字符串

10.2 Symbol在对象中的应用

let jspang = Symbol();

let obj = {
    [jspang]:'技术胖'
} 

//对象中取Symbol值时用[]
console.log(obj[jspang])

//修改对象中不确定key的值
obj[jspang]='web'
console.log(obj[jspang])
let obj = {name:'jspang',skill:'web'};
let age=Symbol();
obj[age]=18;
//对对象起到了一个保护作用,对不需要展示的key值用symbol类型
for(let item in obj){
    console.log(obj[item]); //jspang    web
}
console.log(obj[age])   //18

第十一篇、Set和WeakSet数据结构

 Set本身是个去重的过程,所以里面如果有重复的会被忽略

11.1 Set的增删查

//Set
let setArr = new Set(['jspang','技术胖','web','jspang']);

console.log(setArr)     //Set(3) {"jspang", "技术胖", "web"}    数据结构

//增加
setArr.add('前端职场')

//查找 返回true/false
console.log(setArr.has('jspang'));//true
console.log(setArr.has('xiaodi'));//false

//删除某一项
setArr.delete('web');
console.log(setArr);

//全部删除
setArr.clear();
console.log(setArr);

 11.2 Set的输出

//Set
let setArr = new Set(['jspang','技术胖','web','jspang']);

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

//forEach
setArr.forEach((value)=>console.log(value))

//size属性
console.log(setArr.size);    //3

11.3 WeakSet的声明

//WeakSet
//不允许直接将对象写在WeakSet()里面
//只能通过add添加

let weakobj = new WeakSet();

let obj={a:'jspang',b:'技术胖'};
weakobj.add(obj);
console.log(weakobj)

11.4  WeakSet重复值的问题

同Set一样,WeakSet不能存在重复的对象,但是WeakSet有个小技巧

//类似如下这种形式的WeakSet是可以存在重复值的,因为值虽然一样,但是指向的内存空间不同

let weakobj = new WeakSet();

let obj1={a:'jspang',b:'技术胖'};
let obj2={a:'jspang',b:'技术胖'};

weakobj.add(obj1);
weakobj.add(obj2);

console.log(weakobj)

//----------------------------------------------------------------
//但是如果将obj2的值赋给了obj1,再将obj1添加到weakobj中,就不会存在重复的值
let weakobj = new WeakSet();

let obj1={a:'jspang',b:'技术胖'};
let obj2={a:'jspang',b:'技术胖'};
obj1 = obj2;
weakobj.add(obj1);

console.log(weakobj)

 第十二篇、map的数据结构

12.1 初始map

//map
let json = {
    name:'jspang',
    skill:'web'
}
console.log(json.name)

let map = new Map();
//这里的json就是key值,iam是value值
map.set(json,'iam');
console.log(map)
//这里的json就是value值,iam是key值
map.set('jspang',json);
console.log(map);

12.2 map的增删查

//增
map.set(json,'iam');
//取值
console.log(map.get(json))//根据key值取值
//查找
console.log(map.has('jspang'))//返回true和false
//查看值的长度
console.log(map.size);
//删除特定值
map.delete(json);
console.log(map)
//删除全部
map.clear();

第十三篇、proxy

//传统的对象
let obj = {
    add:function (val) {
        return val+100;
    },
    name:'I am JSPang'
}
console.log(obj.add(100))
console.log(obj.name)

 Proxy的Set和Get

//proxy 代理 ES6 增强 对象和函数(方法)  生命周期  预处理
let pro = new Proxy({
    add:function (val) {
        return val+100;
    },
    name:'I am JSPang'
},{
    get:function (target,key,property) {
        console.log(target,key);//target对象体   key要取值的key
        return target[key];
    },
    set:function (target,key,value,receiver) {
        console.log(`setting ${key} = ${value}`);
        return target[key]=value;
    }
})
console.log(pro.name)
pro.name = '技术胖'
console.log(pro.name)

Proxy的apply

let target = function(){
    return 'I am JSPang';
}
let handler = {
    apply(target,ctx,args){
        console.log('do apply')
        return Reflect.apply(...arguments)
    }
}

let pro = new Proxy(target,handler);

console.log(pro());

第十四篇、promise

//promise 解决ES5中的回调地狱问题
//1.洗菜做饭
//2.坐下来吃饭
//3.收拾桌子洗碗

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);
})

第十五篇、class

clas类其实就是构造函数的另一种写法

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

let jspang = new Coder;
jspang.name('技术胖')

 15.1 类方法的传参

//类里面若是调用类的方法使用this,每个方法必须return一个值才可以使用
//类里面的各方法之间不用逗号或分号分开
class Coder {
    name(val){
        console.log(val);
        return val;
    }
    skill(val){
        console.log(this.name('技术胖')+':'+'Skill-'+val)
    }
}

let jspang = new Coder;
jspang.skill('web');

 15.2 类的传参

//类的传参需要有一个contructor方法,这个方法接收的就是类的参数
class Coder {
    name(val){
        console.log(val);
        return val;
    }
    skill(val){
        console.log(this.name('技术胖')+':'+'Skill-'+val)
    }
    constructor(a,b){
        this.a=a;
        this.b=b;
    }
    add(){
        return this.a+this.b
    }
}

let jspang = new Coder(1,2);
console.log(jspang.add())

15.3 类的继承

class Coder {
    name(val){
        console.log(val);
        return val;
    }
    skill(val){
        console.log(this.name('技术胖')+':'+'Skill-'+val)
    }
    constructor(a,b){
        this.a=a;
        this.b=b;
    }
    add(){
        return this.a+this.b
    }
}

class htmler extends Coder{
    //...子类自己的方法
}

let pang = new htmler;
pang.name('jspang')

第十六篇、模块化操作

首先新建另一个js文件用来充当模块

 在temp.js写下如下代码

export var name = 'jspang'

在index.js中引用

//export 输出
//import 引入

import {name} from './temp';

console.log(name)

终端执行babel-node '路径'命令查看

 16.1 多变量输出

//将temp.js里的内容改为如下

var name = 'jspang'
var b = '技术胖'
var skill = 'web'

export {name,b,skill};

16.2 函数化输出

//修改temp.js的内容如下
export function add(a,b){
    return a+b;
}

16.3 语义化输出

//修改temp.js内容如下
var a = 'jspang'
var b = '技术胖'
var c = 'web'

export {
    a as name,
    b as cname,
    c as skill
}

//修改index.js内容如下
import {name,cname,skill} from './temp';

export default在一个js文件中只能有一个

export可以有多个

export输出
用import {name,cname,skill} from './temp';形式引入
需要加上{}

export default输出
import shy from './temp'
不需要用{},变量名自定义
使用的时候可以
let {name,cname,skill} = shy


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端薛小帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值