环境搭建
//初始化项目
npm init -y
//全局安装babel-cli
npm install -g babel-cli
//安装转换包
npm install --save-dev babel-preset-env babel-cli
新建.babelrc文件
{
"presets":[
"env"
],
"plugins":[]
}
使用babel转化ES5
babel src/index.js -o dist/index.js
let const
let 局部作用域
const 常量
解构赋值
数组解构赋值
数组解构是按照顺序进行解构
let [a,b,c] = [0,1,2];
console.log(a,b,c); //0,1,2
let [d,[e,f],g] = [1,[2,3],4];
console.log(d,e,f,g); //1,2,3,4
let [h,i='greentea'] = ['klaus'];
console.log(h,i); //klaus,greentea
对象解构赋值
对象解构是按照key进行解构
let {foo,bar} = {foo:'greentea',bar:'klaus'};
console.log(foo,bar); //greentea,klaus
先声明再解构要有括号
let a;
({a} = {a : 'greentea'});
console.log(a); //greentea
字符串解构赋值
const [a,b,c,d,e] = 'green';
console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(e);
JSON对象的解构赋值
let json = {
a:'greentea',
b:'qwer'
}
function fun({a,b='wang'}){
console.log(a,b);
}
fun(json);
扩展运算符和rest运算符
对象扩展运算符
对于不确定参数传递数量的时候,可以使用对象扩展运算符
function a(...arg){
console.log(arg[0]);
console.log(arg[1]);
console.log(arg[2]);
console.log(arg[3]);
}
a(1,2,3);
传入arr1里面的数组成员,而不是引用
let arr1 = ['www','green','com'];
let arr2 = [...arr1];
arr2.push('wang');
console.log(arr1);
console.log(arr2);
rest
rest是剩余的意思,也就是说,前面如果有确定的参数,那么rest会补上后面的参数
function b(first,...arg){
console.log(arg.length); //8
}
b(0,1,2,3,4,5,6,7,8); //传递参数数量9,arg.length是8
function b(first,...arg){
//循环
for(let val of arg){
console.log(val);
}
}
b(0,1,2,3,4,5,6,7,8);
字符串模板
可以识别标签及运算
let me = 'greentea';
let str = `my name is
${me}`; //支持识别标签
let a = 1;
let b = 5;
let result = `
${a+b}`; //可以进行运算
document.write(str,result);
字符串查找
let name = '王';
let str = 'my name is 王';
document.write(str.indexOf(name)>-1); //传统判断方式 true
document.write(str.includes(name)); //ES6写法 true
查看开头和结尾
document.write(str.startsWith(name)); //查看开头 false
document.write(str.endsWith(name)); //查看结尾 true
字符串的复制
document.write(str.repeat(5)); //字符串的复制
数字操作
二进制和八进制
//二进制声明 Binary
let binary = 0b010101;
console.log(binary);
//八进制声明 Octal
let octal = 0o666;
console.log(octal);
判断是否是数字
let a = 11/3;
console.log(Number.isFinite(a)); //true
console.log(Number.isFinite('sss')); //false
console.log(Number.isFinite(NaN)); //false
console.log(Number.isFinite(undefined)); //false
判断是否是NaN
console.log(Number.isNaN(NaN)); //true
判断是否是整型
let num = 111.1;
console.log(Number.isInteger(num));
转换为整型和浮点型
let num = 111.1;
console.log(Number.parseInt(num));
console.log(Number.parseFloat(num));
整数取值范围操作
let num = Math.pow(2,53)-1;
console.log(num);
console.log(Number.MAX_SAFE_INTEGER); //最大整数
console.log(Number.MIN_SAFE_INTEGER); //最小整数
console.log(Number.isSafeInteger(num)); //true 安全整数
数组
JSON转换为数组
let jsonStr = {
'0' : 'greentea',
'1' : '24',
'2' : 'man',
length:3
}
console.log(Array.from(jsonStr)); //["greentea", "24", "man"]
变量转换为数组
console.log(Array.of(1,2,3,4)); //[1,2,3,4]
数组的查找方法
let arr = [1,2,3,4,5,6,7];
console.log(arr.find(function(value,index,arr){
return value === 1; //1 没有则返回undefined
}))
数组的替换
let arr = [1,2,3,4,5,6];
//参数:需要替换的值,被替换的起始索引位置,替换到第几个结束
console.log(arr.fill('abc',1,4)); //[1,"abc","abc","abc",5,6]
数组的循环
let arr = [1,2,3,4,5,6];
for(let item of arr){
console.log(item); //1,2,3,4,5,6
}
for(let item of arr.keys()){
console.log(item); //0,1,2,3,4,5
}
for(let [index,val] of arr.entries()){
console.log(index,val); //
}
实例entries()方法
let arr = ['greentea','wang','klaus'];
let list = arr.entries();
console.log(list); //Array Iterator
console.log(list.next().value); [0, "greentea"]
console.log(list.next().value); [1, "wang"]
console.log(list.next().value); [2, "klaus"]
in的用法
对象判断
let obj={
a:'greentea',
b:'123'
}
console.log('a' in obj); //true
数组判断
let arr=[,,,,,];
console.log(0 in arr); //false
let arr1=['123','abc'];
console.log(0 in arr1); // true 这里的0指的是数组下标位置是否为空
箭头函数
let add = (a,b=1) => a+b;
console.log(add(1));
如果是两句话,则需要加上{}
var add =(a,b=1) => {
console.log('greentea');
return a+b;
};
console.log(add(1));
对象
对象赋值
let name = 'greentea';
let age = 24;
let obj = {name,age};
console.log(obj); //{name: "greentea", age: 24}
key值的构建
let key = 'skill';
var obj = {
[key] : 'web'
}
console.log(obj); //{skill: "web"}
Object.is()对象比较
let obj1 = {name : 'greentea'};
let obj2 = {name : 'greentea'};
console.log(obj1.name === obj2.name); //true
console.log(Object.is(obj11.name,obj22.name)); //true
is()严格相等
console.log(+0 === -0); //true
console.log(NaN === NaN ); //false
console.log(Object.is(+0,-0)); //false
console.log(Object.is(NaN,NaN)); //true
Object.assign()合并对象
var a={a:'aaa'};
var b={b:'bbb'};
var c={c:'ccc'};
let d=Object.assign(a,b,c)
console.log(d); //{a: "aaa", b: "bbb", c: "ccc"}
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 name = Symbol();
var obj={
[name]:'greentea'
}
console.log(obj[name]);
obj[name]='web';
console.log(obj[name]);
Symbol对象元素的保护作用
let obj = {name:'greentea',skill:'web'};
let age = Symbol();
obj[age] = 18;
for (let item in obj){
console.log(obj[item]); //
}
console.log(obj);
Set和WeakSet
Set
Set是一种数据结构,不是数据类型.Set的数据结构是以数组的形式构建的.Set和Array 的区别是Set不允许内部有重复的值,如果有只显示一个,相当于去重,虽然Set很像数组,但是他不是数组.
let setArr = new Set(['greentea',24,'klaus']);
//追加使用add而不是push
setArr.add('hello')
//has查找
console.log(setArr.has('greentea'));
//delete
console.log(setArr.delete('greentea'));
//clear全部删除
console.log(setArr.clear());
console.log(setArr);
//for... of
for(let item of setArr){
console.log(item)
}
//forEach
setArr.forEach((value)=>console.log(value));
//size
console.log(setArr.size);
WeakSet
用来存放对象,同样不可以重复(不可以是相同的引用)
let weakObj=new WeakSet();
let obj={a:'greentea',b:'klaus'}
weakObj.add(obj);
console.log(weakObj);
Map
key和value都可以是字符串或者对象
let json = {
name : 'greentea',
skill : 'web'
}
var map = new Map();
map.set(json,'iam');
console.log(map)
//取值get
console.log(map.get(json));
//删除delete
map.delete(json)
//size
map.size
//has是否存在
map.has('web')
//clear清除所有
map.clear()
Proxy
预处理
let pro = new Proxy({
add : (val) => val+100
,
name : 'i am greentea'
},{
get : (target,key,property) => {
console.log('get');
return target[key];
},
set : (target,key,value,receiver) => {
console.log(`setting ${key} = ${value}`);
return target[key]=value;
}
});
console.log(pro.name);
pro.name='jjjjj';
console.log(pro.name);
Promise
解决ES5中的回调地狱问题
centos.html:1 Slow network is detected. Fallback font will be used while loading: chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/bundle/selection-translator.woff
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 Coder{
name(val){
console.log(val);
}
}
let a = new Coder;
jspang.name('a');
传参
class Coder{
name(val){
console.log(val);
return val;
}
skill(val){
console.log(this.name('greentea')+':'+'Skill:'+val);
}
constructor(a,b){
this.a = a;
this.b = b;
}
add(){
return this.a+this.b;
}
}
let greentea = new Coder(1,2);
console.log(greentea.add());
继承
class htmler extends Coder{
}
let klaus = new htmler;
pang.name('greentea');
模块化操作
export var a = 'greentea';
import {a} from './temp.js';
console.log(a);
多变量输出
var a ='aaa';
var b ='bbb';
var c = 'web';
export {a,b,c}
函数的模块化输出
export function add(a,b){
return a+b;
}
as的用法
var a ='jspang';
var b ='技术胖';
var c = 'web';
export {
x as a,
y as b,
z as c
}
export default
1.export
//输出
export var a ='jspang';
export function add(a,b){
return a+b;
}
//引入
import {a,add} form './temp';//也可以分开写
2.export default
//输出
export default var a='jspang';
//引入
import str from './temp';