ES6进一步整理
内容:
1.变量及赋值
2.函数
3.数组及json
4.字符串
5.面向对象
6.Promise
7.generator
8.模块
1.变量及赋值
(1)ES5变量定义
var: 可以重复定义、不能限制修改、没有块级作用域 --> 不再建议使用
(2)ES6新增变量定义
新时代的js建议使用以下来定义变量:
- let 不能重复定义、变量、块级作用域
- const 不能重复定义、常量、块级作用域
(3)赋值
解构赋值:
1.左右两边必须一样;右边得是个东西
2.必须定义和赋值同步完成
let [a, b, c] = [1, 2, 3];
// let {a, b, c} = {a: 1, b: 2, c: 3};
alert(a+b+c); // 输出6
let [n1, {a, b, c}, n2] = [12, {a: {n1: 5, n2:8}, b: 12, c: 88}, 55];
console.log(n1, a, b, c, n2);
// 输出: 12 {n1: 5, n2: 8} 12 88 55
2.函数
(1)箭头函数
箭头函数就是匿名函数定义的简化版, 宣称能使得代码更简洁,实际上就是纯粹的垃圾
箭头函数的 this 值是绑定了的,箭头函数没有 arguments 对象,如果要多参数, 必须用 ...
1 // (参数1, 参数2) => { 语句 }
2 // (参数1, 参数2) => 语句
3 // 上面两行相当于下面这函数
4 function(参数1, 参数2) {
5 return 语句
6 }
7
8 // 如果只有一个参数,圆括号可省略的
9 // (参数1) => { 语句 }
10 // 参数1 => { 语句 }
11
12 // 但是如果没有参数, 必须需要使用圆括号
13 // () => { 语句 }
14
15 // 例子
16 var a1 = [1, 2, 3]
17 // 下面两个等价
18 var a2 = a1.map(function(n){
19 return n * n
20 })
21 var a3 = a1.map( n => n * n )
22
23 n => n * n
24 // 上面 1 行等价于下面 3 行
25 function(n) {
26 return n * n
27 }
(2)默认参数
// 传统写法
var test = function(a, b, c){
b = b||5;
c = c||12;
console.log(a, b, c); // 1, 5, 12
}
test(1); // ES6写法:
var test = function(a, b=5, c=12){
console.log(a, b, c); // 1, 5, 12
}
test(1);
(3)参数展开(剩余参数)
接受剩余参数如下:
var test = function(a, b, ...args){
// 第一个和第二个参数传给a和b其他参数传给args
console.log(a, b, args);
} test(1, 3, 5, 7, 9); // 1, 3, [5, 7, 9]
注:...args必须在参数最后面
展开一个数组:
let arr = [111, 222, 333];
let arr2 = [1, 3, 5, ...arr, 7, 9];
console.log(arr2);
// 输出: [1, 3, 5, 111, 222, 333, 7, 9]
3.数组及json
(1)数组 - 5种方法
map 映射:一个 -> 一个
let arr=[62, 55, 82, 37, 26]; let arr2=arr.map(function (item){
if(item>=60){
return true;
}else{
return false;
}
}); alert(arr2); // true,false,true,false,false
filter 过滤:
let arr=[12,5,88,37,21,91,17,24]; let arr2=arr.filter(function(item){
if(item%2==0){
return item;
}
}); alert(arr2); // 12,88,24
forEach 遍历:
let arr=[12,5,88,37,21,91,17,24]; let sum=0;
arr.forEach(function(item){
sum+=item;
}); alert(sum); //
reduce 汇总:一堆 -> 一个
let arr=[12,5,88,37,21,91,17,24]; let sum=arr.reduce(function(tmp,item,index){
console.log(tmp, item, index); return tmp+item;
}); console.log(sum); // 结果: 295
array-like对象转换成Array:
在DOM操作中,有时候有一些array-like对象(无法使用forEach方法),可以这样将其转换成真正的Array:
Array.from([array-like]) -> [xxx, xxx, xxx],然后就可以使用forEach方法了
(2)json - 2变化
简写:名字和值一样的,可以省
let a=12;
let b=5; let json={a, b};
// 上面一句等价于:
// let json={a: a, b: b}; console.log(json); // {a: 12, b: 5}
function可以不写:
/*let json={
a: 12,
b: 5,
show: function (){
alert(this.a+this.b);
}
};*/ // 下面的和上面的同理
let json={
a: 12,
b: 5,
show(){
alert(this.a+this.b);
}
}; json.show();
4.字符串
字符串模板:
let json={name: 'wyb', age: 21}; //alert('我叫:'+json.name+',我今年'+json.age+'岁');
alert(`我叫:${json.name},我今年${json.age}岁`);
多行字符串:
let msg = `sf
sdf
dkj
`; alert(msg);
startsWith和endsWith:
if(sNum.startsWith('135')){
alert('移动');
}else{
alert('联通 or 电信');
} if(filename.endsWith('.txt')){
alert('文本文件');
}else{
alert('其他文件');
}
5.面向对象
(1)基础 构造函数和继承
- class/constructor
- extends/super
// 类的定义:
class Person{
constructor(name, age){
this.name = name;
this.age = age;
} showName(){
alert('我叫' + this.name);
}
showAge(){
alert('我' + this.age + '岁');
}
} let p = new Person('wyb', 21); p.showName();
p.showAge();
// 类的继承
class Person{
constructor(name, age){
this.name = name;
this.age = age;
} showName(){
alert('我叫' + this.name);
}
showAge(){
alert('我' + this.age + '岁');
}
} class Worker extends Person{
constructor(name, age, job){
//super-超类(父类)
super(name, age);
this.job = job;
} showJob(){
alert('我是做:' + this.job);
}
} let w = new Worker('wyb', 21, '打杂的'); w.showName();
w.showAge();
w.showJob();
(2)this
- 普通函数:根据调用我的人 this老变
- 箭头函数:根据所在的环境 this恒定
- bind——给函数定死一个this
6.Promise
Promise - 异步、同步化 -> 用同步的方式去写异步
- promise:解决异步操作
- 同步——串行 简单、方便
- 异步——并发 性能高、体验好
Promise用法:
let p=new Promise((resolve, reject)=>{
resolve(); reject();
5 }); 7 p.then(()=>{}, ()=>{}); // 第一个函数为resolve 第二个函数为reject
Promise使用实例:
- Promise.all(); 与:所有的都成功
- Promise.race(); 或:只要有一个完成
//Promise -> 用同步的方式实现异步
Promise.all([
$.ajax('/banner_data'),
$.ajax('/item_data'),
$.ajax('/user_data'),
$.ajax('/news_data'),
]).then(function(arr){
let [banners, items, user, news]=arr;
}, function(){});
// then方法第一个函数为resolve函数(成功) 第二个函数为reject函数(失败)
注意:
- Proimse有用——解除异步操作
- Promise有局限——带逻辑的异步操作麻烦
7.generator
generator - 生成器 --》 能暂停
简单实例 :
// 生成器函数
function *show(){
alert('aaa');
yield; // 暂停
alert('bbb');
} let gen = show(); gen.next(); // aaa setTimeout(function (){
gen.next(); // bbb
}, 5000);
yield实例:
// yield:
// 1.可以传参数 function (a, b, c)
// 2.可以返回 return // yield返回值
function *show(){
alert('aaa');
let a=yield;
alert('bbb'+a);
} let gen=show(); gen.next(); // aaa
gen.next(12); // bbb12 // yield传值:
function *show(){
alert('aaa');
yield 55; alert('bbb');
return 89;
} let gen=show(); let res1=gen.next();
console.log(res1); //{value: 55, done: false} let res2=gen.next();
console.log(res2); //{value: 89, done: true}
generator+promise配合(并不常用):
1.外来的runner辅助执行——不统一、不标准、性能低
2.generator函数不能写成箭头函数
补充 - async/await - 常用:
大致写法:
// async写法:
async function xxx(){
....
let res=await xx;
....
let res2=await xxx;
// let 结果=await 异步操作;(异步操作可以是promise、generator、另一个async函数其中的任意一个)
....
}
实例(async使用及错误处理):
async function show(){
try{
let data1=await $.ajax({url: '1.txt', dataType: 'json'});
let data2=await $.ajax({url: '33.txt', dataType: 'json'});
let data3=await $.ajax({url: '3.txt', dataType: 'json'}); console.log(data1, data2, data3);
}catch(e){
alert('有问题'); throw new Error('错了....');
}
} show();
8.模块化ES6
打包、编译:
- 编译:ES6 -> ES5 使用babel
- 打包: browserify
(1)babel
最初作为一个polyfill工具使用,只是用来扩充浏览器的功能,可以用来将ES6编译成ES5
babel官网:http://babeljs.io/,babel需要node.js,使用babel之前要先安装node,node官网:https://nodejs.org/en
node:语言、环境、平台 node的npm:包管理(类似python的pip)
安装使用babel:
- 替换源:
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 项目初始化:cnpm init
- 在项目中下载babel:cnpm install --save-dev babel-cli
- 安装之后,改写package.json包(配置文件)如下:
{
//...略去了其他的内容
"devDependencies": {
"babel-cli": "^6.0.0" //这里的版本号为安装的时候的版本号,一般安装的时候就会自动写入
},
"scripts": {
"build": "babel src -d lib"
//编译整个 src 目录并将其输出到 lib 目录。这里的src指的是需要转换的目录,lib指的是输出的内容的存放目录
},
}
然后在项目中新建.babelrc然后配置babelrc:
{
"presets": ["env"]
}
然后执行:cnpm i babel-preset-env -D
最后编译:npm run build
// 编译前的代码:
let a=12;
let [b,c]=[5,8]; const show=()=>{
alert(a+b+c);
}; show(); // 编译后的代码:
"use strict"; var a = 12;
var b = 5,
c = 8; var show = function show() {
alert(a + b + c);
}; show();
(2)browserify
browesrify -> 和模块化配合一起用
ES6进一步整理的更多相关文章
- ES6知识整理(4)--数组的扩展
最近工作比较忙,基本每天都会加班到很晚.处理一些客户端兼容问题以及提升用户体验的优化.也将近一周没更文了,现在继续es6的学习总结. 上篇回顾 ES6知识整理(三)--函数的扩展 扩展运算符 形式是3 ...
- ES6知识整理(1)--let和const命令
最近准备在业余空闲时间里一边学习ES6,一边整理相关知识.只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是正在的学到了... 那么现在开始 LINK START!(首先是第一讲,前 ...
- ES6知识整理(3)--函数的扩展
只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是真正的学到了... 最近上班有点忙的关系,于是文章更新会慢些.只有晚上加完班之后,空余时间才能学习整理.因此完成一篇也可能要几个晚上 ...
- ES6知识整理(2)--变量的解构赋值
最近准备在业余空闲时间里一边学习ES6,一边整理相关知识.只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是真正的学到了... 上一篇是一个试水,现在接上. 变量提升 看了下朋友回复 ...
- ES6知识整理(10)--class的继承
(这是es6的第10篇文章.说真的这样的总结之后虽然直观了许多,但是消耗的时间有点长,或许是知识比较复杂的原因吧) 类的继承 有个A类,B类继承A类,那B类实例就可以使用A类实例的所以属性和方法.不包 ...
- ES6知识整理(9)--class的基本语法
(总结完知识点,出去滑板刷街) promise的catch 上一节promise中漏了一个知识点: promise对象可以使用catch来避免每个then中都加error判断,让错误时都进到catch ...
- ES6知识整理(8)--Promise对象
(关于promise,以前并不知道是什么,没这个概念.现在来学习总结下) promise含义 es6的异步编程解决方案.需要new新对象操作api. promise对象特点 有3中状态:pending ...
- ES6知识整理(5)--对象的扩展
个人开这个公众号的初心是为了积累知识,因此并没有做什么推广,再说自己也不知道怎么推广,推广之后又能干些什么.已经将近10天没发文章了,虽然每天都加班,但也不会一点时间都没有,有时还是会懒癌发作不想学习 ...
- es6 + 笔记整理
1. ES6提供了默认参数值机制,允许你为参数设置默认值,防止在函数被调用时没有传入这些参数: const required = () => {throw new Error('Missing ...
随机推荐
- 51Nod 1002:数塔取数问题(DP)
1002 数塔取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值. 每 ...
- C# Dictionary源码剖析
参考:https://blog.csdn.net/exiaojiu/article/details/51252515 http://www.cnblogs.com/wangjun1234/p/3719 ...
- node启动时候报错 Error: Cannot find module 'express'
cmd命令 到目录下,然后运行 npm install -d 再 node hello.js
- 网络流--最小费用最大流MCMF模板
标准大白书式模板 #include<stdio.h> //大概这么多头文件昂 #include<string.h> #include<vector> #includ ...
- (1)集合 ---遍历map集合
Map接口 实现Map接口的类用来存储键(key)-值(value) 对.Map 接口的实现类有HashMap和TreeMap等.Map类中存储的键-值对通过键来标识,所以键值不能重复. Ha ...
- test20181004 排列
题意 分析 容斥公式的意义 选了原图中\(x(x \geq i)\)条边的方案,重复了\(\binom{x}{i}\)次. 有多加多减,所以就是那个式子. 具体而言,对选了x条原图中的边的方案,总共加 ...
- 使用Spring Boot操作Hive JDBC时,启动时报出错误:NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDef
使用Spring Boot操作Hive JDBC时,启动时报出错误:NoSuchMethodError: org.eclipse.jetty.servlet.ServletMapping.setDef ...
- TensorFlow笔记-05-反向传播,搭建神经网络的八股
TensorFlow笔记-05-反向传播,搭建神经网络的八股 反向传播 反向传播: 训练模型参数,在所有参数上用梯度下降,使用神经网络模型在训练数据上的损失函数最小 损失函数:(loss) 计算得到的 ...
- java 创建子类
当程序创建子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为他从父类继承得到的所有实例变量分配内存,即使子类中定义了与父类中同名的实例变量. 如: class Parent { privat ...
- 共享设置及ftp设置
第一部分 共享设置 一.添加编译选项 network---file transfer---aria2 ...