目录
第一篇、开发环境搭建
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