JS及ES6语法拾遗

经典!!!!!! 阮一峰版本的ES6参考书

ES6 入门教程

推荐一个ES6转ES5的插件

cnpm install babel-cli -g
cnpm install --save-dev babel-preset-es2015 babel-cli
cnpm install babel-plugin-transform-regenerator --save-dev
cnpm install regenerator-transform --save-dev

用法:
根目录建立文件: .babelrc
写入内容:

{
    "presets":[
        "es2015"
    ],
    "plugins":[]
}
babel src/index.js  -o  dist/index.js

我们可以简写这条命令
在package.json中在scripts中添加一条

"bulid":"babel src/index.js  -o  dist/index.js"

此时运行可以

npm run bulid

此时,我们写的ES6会转化为ES5

小贴士:

  • 弃用var,用let 和 const
  • 判断是否是数字: Number.isFinite(变量),返回布尔
  • 判断是否是NaN: Number.isNaN(变量),返回布尔
  • 判断是否是整数: Number.isInteger(变量),返回布尔
  • 最大安全整数 Number.MAX_SAFE_INTEGER
  • 最小安全整数 Number.MIN_SAFE_INTEGER

第一部分 总体

一.废弃var,用let和const代替

为什么弃用var,因为var是全局声明, 没有块级作用域,看看下面的问题 i完全乱了

image

以前,解决这个问题,只能用闭包

image

在ES6以后,我们弃用var 改为let 就解决了作用域问题

定义变量 let

定义常量 const

  • 定义时必须赋值,赋值后不可修改

  • 如果定义的是对象,对象不能修改指向,但可以改变内部的属性

  • 在let和const 可以选择时, 尽量选const


第二部分 字符串相关

一. includes startsWith endsWith字符串中包含某关键字

  • includes 字符串中包含某关键字
  • startsWith 字符串以xxx开头否?
  • endsWith 字符串以xxx结尾否?
str.includes(keywords)   //返回true或者false
str.startsWith  (keywords)   //返回true或者false
str.endsWith  (keywords)   //返回true或者false

二. replace替换文本

字符串的replace方法除了能传入字符串,也可以传入正则

str='我是世界上最纯洁的人!纯洁到你想哭'
str=str.replace(/纯洁/g,'邪恶')

三.padStart 填充字符串

a.padStart(最终长度,'填补用的字符')

我们想把 8 填充为 08

var a='8'
a=a.padStart(2,'0')

四. 保留N位小数

value.toFixed(2)   //返回字符串

五.支持换行的文本

用``包裹 (键盘上的~键)

`
      <li>这是个待办项</li>
      <li>这是个待办项</li>
`

六. 字符串模板

必须与 ``符号一起用,${}

str=`正常字符串${变量}正常字符串 ${a+b}`

七. 字符串重复

let str="anny|".repeat(3)   //anny|anny|anny|

八. 正则验证

手机号正则:

function checkPhone(){ 
    var phone = document.getElementById('phone').value;
    if(!(/^1[3456789]\d{9}$/.test(phone))){ 
        alert("手机号码有误,请重填");  
        return false; 
    } 
}

固话正则:

 function checkTel(){
 var tel = document.getElementById('tel').value;
if(!/^(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}$/.test(tel)){
alert('固定电话有误,请重填');
return false;
}
}

身份证正则

//身份证正则表达式(15位)
isIDCard1=/^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$/;
//身份证正则表达式(18位)
isIDCard2=/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$/;
身份证正则合并:(^\d{15}$)|(^\d{17}([0-9]|X)$)

邮箱正则

email.onchange = function(){
        var email = this.value;
        var reg = /^\w+((.\w+)|(-\w+))@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+).[A-Za-z0-9]+$/
        if(reg.test(email)){
            alert("邮箱格式正确");
        }else{
            alert("邮箱格式不正确");
        }
    }

第三部分 数组相关

一. find方法

find接收一个方法作为参数,方法内部返回一个条件

符合该条件的元素会作为find的返回值

如果遍历结束还没有符合的,返回undefined

var user = [
    { id: 1, name: '张三' },
    { id: 2, name: '李四' },
    { id: 3, name: '王五' },
    { id: 4, name: '赵六' }
]

var result = user.find((item) => {
    return item.id==4
})

console.log(result);
image

二. findindex

和find类似,只不过返回的是index

var user = [
    { id: 1, name: '张三' },
    { id: 2, name: '李四' },
    { id: 3, name: '王五' },
    { id: 4, name: '赵六' }
]

var result =user.findIndex((item)=>{
    return item.id==4
})

console.log(result);
image

三. 给数组指定位置删除元素

 const arr=['a','b','c','d','e']
          arr.splice(2,1)
          console.log(arr); //["a", "b", "d", "e"]

四. splice花式操作数组的元素

//splice 删除/插入/替换元素
arr.splice(2,1) //从2开始删除1个
arr.splice(2,0,'f') //从2之后插入元素
arr.splice(2,1,'f') //替换2之后的元素(从2删除1个元素,再添加一个元素)

五. filter过滤

filtter要求传入一个回调函数, 函数中必须返回一个布尔值,filtter会使用这个函数过滤数组

当返回true时,将数组添加到结果数组中, false时丢弃

let arr =  [1,  2,  3,  4,  5,  6] arr.filter(item =>  {  return item >  3  });

六. map 遍历处理

map 要求传入一个回调函数, map会使用这个函数遍历数组,并返回新的数组(如果有return)

let arr =  [1,  2,  3,  4,  5,  6] arr.map(item =>  {  return item *  3  });
image

七. reduce 对数组中所有内容进行汇总

reduce 要求传入一个回调函数, 和一个初始化index

回调函数必须有两个参数:

  • preValue 上次遍历返回的值

  • item 此次的值

reduce 会使用这个函数遍历数组,并返回处理结果,并将结果传给下一次遍历,直至最后一项处理完成,返回preValue

let arr =  [1,  2,  3,  4,  5,  6] arr.reduce(  (preValue, item)  =>  {  return preValue + item },  0  )

如上: preValue第一次遍历时为初始值0,第一次遍历中,它加了第一项的值,并把这个值传入了第二次遍历中,第二次遍历中的preValue=1,再加上本次的item值2,得到preValue=3,再传入下一次遍历.遍历完成后,把最终的preValue返回


八. json数组格式

let json1={
  "0":'aaa',
  "1":'bbb',
  "2":'ccc',
  length:3 //必须有这一句
}

let arr=Array.from(json1)//将json数组转为 数组

九. 数组of构造方法

let arr=Array.of(1,2,3,4,1,2,'hola') 

十 fill填充方法

arr.fill("abc",1,3)  //从第一个到第三个替换成abc

十一. 花式for循环

普通用法:

          for (let index = 0; index < array.length; index++) {
            const element = array[index];
          }

in式用法: in传入的是index

for (let index in this.movies) {
  console.log(movie);
}

of 式用法: of传入的是 数组中的对象

for (let movie of this.movies) {
  console.log(movie);
}

of 方法还可以

for (let [index,movie] of movies.entries()) {
  console.log(movie);
}

第四部分 类和对象相关

一. 对象字面量增强写法

对象字面量写法:

把 const obj=  new  Object(key:value) 写成 const obj={key:value}

如何增强??

把键名和值名相同的键值对写成  键
把值是个方法,而且方法是匿名的 键值对 写成 键(){}  { name:name, eat:function(){}  } 增强写法:  { name,  eat(){}  }

二 .类的继承 //extends

类的声明:
class Coder{
}
类的使用:
let me=new Coder;
如果类中有两个方法,中间不要加, 号
class Coder {
    eat(food) {
        console.log(`eating ${food}`);
    }
    run() {
        console.log('running');
    }
}
类的参数   //相当于用constructor来做构造方法
class Coder {
    constructor(a,b){
        this.a=a;
        this.b=b;
    }
    add(){
        console.log(this.a+this.b);
    }
}
let me=new Coder(1,2);
me.add()
类的继承   //extends
class  Person{}  class  Student  extends  Person{  }

三. key值构建

当我们不知道key时也可以构建对象键值对

let key='age'
let p1={
  [key]:18
}

第五部分 函数和方法

一.箭头函数

我们可以把

function (){}简写成

(参数)=>{语句}  //如果有1个参数,可以省略() item =>{语句}  //如果语句只有一句,可以省略{} ,同时自动return item=> item*item 

箭头函数this

箭头函数中的this引用的是最近作用域中的this

它会想外层作用域一层层的查找,直到在某一层找到this

image

二. 值为同名方法的属性的简写

func1:function (){} 可以简写成 func1(){}

三. 可变参数(收集参数)

如果我们不知道会传入多少个参数,那么,我们可以使用收集参数来将传入的参数收集到一个数组中

function func1(...args){}

比如;我们想传入一些数字,并求和,但不知道多少个,可以这样做:

function test(...nums) {
  let sum=0;
  nums.forEach(num => {
    sum +=num
  });
  console.log(sum);
}
test(1,2,3,4,5,6)   //21

这就是为什么我们写push时这样提示我们

四. 收集参数同时有固定参数

当参数不确定时

function test(first,...agrs) {}

五. 抛出异常

function test(a) {
  if(a===0) throw Error("a is 0!!!!")
  return a
}

六. 严谨模式

function test(a,b) {
  "use strict"
  //c=a+b;  //错!必须声明c
  let c=a+b;
  return c
}

严格模式主要有以下限制:

  • 变量必须声明后再使用
  • 函数的参数不能有同名属性,否则报错
  • 不能使用with语句
  • 不能对只读属性赋值,否则报错
  • 不能使用前缀0表示八进制数,否则报错
  • 不能删除不可删除的属性,否则报错
  • 不能删除变量delete prop,会报错,只能删除属性delete global[prop]
  • eval不会在它的外层作用域引入变量
  • eval和arguments不能被重新赋值
  • arguments不会自动反映函数参数的变化
  • 不能使用arguments.callee以及arguments.caller
  • 禁止this指向全局对象
  • 不能使用fn.caller和fn.arguments获取函数调用的堆栈
  • 增加了保留字(比如protected、static和interface

第六部分 模块化操作

一. commonJS的导入导出

导入:

const  {Menu,BrowserWindow}=require('electron')

等价于

const Menu=require('electron').Menu const BrowserWindow=require('electron').BrowserWindow

二. ES6的导入导出

导入:

导入:  import  {flag,sum,Person}  from  "./aaa.js" 全部导入 import  *  as bbb from  "./aaa.js"  //相当于取得了对象 bbb

如果在html中导入

  <script  src="aaa.js"  type="module"></script> type是module才行

导出: (暴露)

方式一:  export{flag, sum} 
方式二:  export  var num=1 导出方法:  export  function  func1(){} 
导出类:  export  class  Person{} 
匿名导出: 只能有一个 export  default  function  (){} 引用时自己给它起名字 import aad form "./aaa.js"  //不用大括号了

第七部分 解构赋值法

一. 数组的结构赋值

let [a,b,c]=[1,2,3]

相当于

let a=1
let b=2
let c=3

解构赋值法可以有默认值

 let [a,b='hola']=['haha']   //a='haha'   b='hola'

二. 对象的解构赋值法

let {name,age} = {
    name:"haha",
    age:18
}

注意:先赋值再解构必须在解构时加()

let name
let age
({name,age}={name:'lili',age:18})

第八部分 异步

一. promise处理异步

new Promise((resolved,rejected)=>{
  //里面写一个异步方法,并在里面写一个resolved()或者是rejected();
   resolved(); //或者是rejected();
}).then(data=>{
                //这里写resolved()的处理;
            },
        error=>{
                //这里写rejected()的处理;
})

//传入一个函数,这个函数有两个参数:resolved,rejected,
//resolved,rejected又是函数
//当异步代码执行到 resolved()或者是rejected();时,就会跳转到then执行对应的函数


当只有想处理resolved时,可以简写:

new Promise.resolved(默认就传入了data,你现在可以在这里处理data)
.then(data=>{
                //这里写resolved()的处理;
            })

promise可以使用链式调用,来摆脱回调地狱

promise的all方法使用
如果需要执行多个异步,都拿到结果时才执行,可以使用
promise.all([请求1,请求2])
.then(results=>{})

results是结果组成的数组

二. async

如果,一个函数用async修饰,它return出来的就会是一个promise
例如:

async function test1() {
    return "test"
}
console.log(test1());

三. await必须写在async中

async function test1() {         //因为里面返回的本身就是个promise,所以不用async修饰也可以
    return new Promise(resolve => {
        setTimeout(() => {
            resolve('hola')     //异步执行后,调用resolve()改变异步状态
        }, 3000);
    })
}
async function test2() {
    const v = await test1();   //等待异步方法test1执行完成把值传给v
    console.log(v);
}
test2();   //执行时,会延时3秒打印 ho'la

如果不用aysnc/await, 像这样:

//!!!!!!错误的示例!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
function fun1(a,b){
  return new Promise(
    function (resolve, reject) {
      setInterval(()=>{
        if(a-b>0){
          resolve(a-b)
        }else{
          reject(null)
        }
      },3000)
    }
  )
}

function  fun2(){
  let c = fun1(5,2)
  console.log(c);
}

fun2()

则 fun2会立即执行,结果返回一个正在<pending>的Promise

四. 如果只用Promise, 那异步过程只在Promise里, 如果想执行Promise后返回结果, 那就用 aysnc/await 调用Promise

function fun1(a,b){
  return new Promise(
    function (resolve, reject) {
      setInterval(()=>{
        if(a-b>0){
          resolve(a-b)
        }else{
          reject(null)
        }
      },3000)
    }
  )
}

async function  fun2(){
  let c = await fun1(5,2)
  console.log(c);
}

fun2()

第九部分 set

set是不可重复列表

添加元素
set1.add(值)

删除元素
set1.delete(值)

删除全部
set1.clear()

查找
set1.has(值)

set中的值的个数
set1.size     //注意是属性

可以放对象的set --WeakSet

let weakObj=new WeakSet() //必须用new
let obj1={a:"hola"}
weakObj.add(obj1)  //必须用add添加

第十部分 Map数据结构

Map是一种类似于json的数据类型,但是性能必json好,也更灵活.key值可以是任意值,value也可以是任意值

let obj1={a:"hola"}
let map1=new Map()
map1.set("age",18)
map1.set(obj1,"这也行???")
console.log(map1);
增
map1.set(键,值)

删
map1.delete(键)
全删
map1.clear()

取值
map1.get(键)   //返回值

查
map1.has(键)  //返回布尔

查map长度
map1.size   //注意是属性

第十一部分 proxy代理预处理函数

Proxy(被预处理的对象,预处理钩子对象)

let obj1 = {
  a: "hola",
  add: function (value) {
    return value + 100
  }
}

let pro1 = new Proxy(obj1, {
  get: function (target, key, property) {
    console.log("进入了get");
    return target[key];
  },
  set(target, key, value, receiver) {
    console.log("进入了set");
    return target[key]=value;
  }
})
pro1.a = 'aaa';
console.log(pro1.a);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343