ES6 开发常用新特性以及简述ES7
一、关于变量
ES6新增:块级作用域变量
1、let定义块级作用域变量
- 没有变量的提升,必须先声明后使用
- let声明的变量,不能与前面的let,var,conset声明的变量重名
{
{
console.log(a) // 报错 必须先声明再使用
let a = ; // 只在当前大括号可以使用
var b = "abc"; // 全局作用域变量
console.log(a); // 10
// let a = 10 // 报错 Uncaught SyntaxError: Identifier 'a' has already been declared
console.log(b); // bac
}
console.log(b); // abc var 存在变量提升所以不会报错
console.log(a); // 报错 let 不存在变量提升 有作用域问题 只能在大括号中使用
}
2、const 定义只读变量
- const声明变量的同时必须初始化赋值,一旦初始化完毕就不允许修改
- const声明变量也是一个块级作用域变量
- const声明的变量没有“变量的提升”,必须先声明后使用
- const声明的变量不能与前面的let, var , const声明的变量重名
{
const CONSTANT = 100
console.log(CONSTANT) // 100 只能在括号里使用
}
console.log(CONSTANT) // CONSTANT is not defined 报错 也是作用域问题
二、关于函数
1、ES6可以给形参函数设置默认值
就是说,当我们调用函数时,如果设置了默认形参,即使没给函数传入实参,那么函数的实参就是默认形参。
function fun2(a = , b= ){
console.log(a,b) // 1,2
}
fun2(,); // 10 20
fun2(); // 100 2 没有传参 则取初始默认值
在构造函数中也可是使用的
function Person(name, age, sex = "男"){
this.name = name;
this.age = age;
this.sex = sex;
}
var p1 = new Person("张三", );
console.log(p1) // Person {name: "张三", age: 20, sex: "男"}
var p2 = new Person("李四", );
console.log(p2) // Person {name: "李四", age: 30, sex: "男"}
var p3 = new Person("王五", , "女");
console.log(p3) // Person {name: "王五", age: 20, sex: "女"
2、箭头函数
// 正常函数
var fun3 = function(a){
console.log(a);
}
// 箭头函数 区别在于 this 的指向 开发中建议都有箭头函数 能省去很多代码
var fun3 = (a)=>{console.log(a);}
fun3();
复习一下this的认识
1.在函数体外,this指的就是window对象
2.在函数替内,谁调用函数this就指向谁
3.在构造函数中,this指的是新创建的对象
4.在html标签中,this指的是当前的这个标签元素
5.在ES6中,对于箭头函数,它本身没有this,要看它在哪里创建的,和当前函数的作用域, 通俗说由执行上下文确定。
三、... 扩展运算符 可以将对象或者数组里面的值展开
1、对象用法
const a = [1, 2, 3]
console.log(a) // 1 2 3
const b = {a: 1, b: 2}
console.log({c: 3, ...b}) // {a: 1, b: 2, c: 3}
2、在数组之前加上三个点(...)
var arr = [,,,,];
console.log(arr); // [1, 2, 3, 4, 5]
console.log(...arr) // 1 2 3 4 5
3、可以根据数组的展开运算用数组给函数批量的传参 (用的比较多)
function fun5(a,b,c,d,e,f){
console.log(a,b,c,d,e,f)
}
fun5([1,2,3,4,5]) //[1, 2, 3, 4, 5] undefined undefined undefined undefined undefine
fun5(...[,,,,,]) // 11 22 33 44 55 66
四、关于apply和call
apply和call,都是对象本身没有某个属性或者方法,去引用其他对象的属性或方法,也就是说两者都可以改变this的属性
不同之处
apply(this的指向,数组/arguments)
call(this的指向,参数1,参数2,参数3)
var name ="window的name";
var obj = {
name:"obj的name",
showName:function(v1,v2,v3){ console.log(v1,v2,v3)
}
}
obj.showName();
obj.showName.apply(window,[,,]); // 10 20 30
// apply括号里的是谁,调用的前面的函数里面的this就是谁
obj.showName.call(window,,,) // 10 20 30
var color = "yellow";
function showColor(){
console.log(this.color)
}
var obj = {
color:"red",
}
showColor(); // yellow
showColor.apply(obj); // red
showColor.call(obj); // red
showColor.apply(this); // yellow
showColor.call(window); // yellow
五、关于解构赋值
1、数组的解构赋值
var [a,b,c] = [,,]
console.log(a,b,c) // 11 22 33
var [e,[f,g],k] = [,[,],]
console.log(e,f,g,k) // 1 2 3 5
2、对象的解构赋值
var{name,age}={name:"张三", age:""}
console.log(name, age) // 张三 20
// 以前我们互换两个变量的值,需要借助第三个变量,利用解构赋值,就方便很多了
var f1 = ;
var f2 = ;
[f1,f2] = [f2 ,f1];
console.log(f1, f2) // 99 88
3、解构json
var jike = {"name":"tom","age":"23","sex":"男"};
var {name,age,sex}=jike;
console.log(name,age,sex)//tom 23 男 function cal(a,b){
var ret1 = a+b;
var ret2 = a-b;
var ret3 = a*b;
var ret4 = a/b;
return [ret1,ret2,ret3,ret4]
}
var [r1,r2,r3,r4] = cal(10,5);
console.log(r1,r2,r3,r4) // 15 5 50 2
六、创建对象
ES6中创建对象 class
class className{
// 肯定存在一个构造函数 constructor 如果不写构造函数,有一个默认的构造函数,内容为空
constructor(){} // 注意:这里不需要逗号
// 下面是函数属性 比如属性有run dark 函数和对象都可以
run(){}
dark(){}
}
举个例子
class Person{
// 肯定存在一个构造函数 construtor
constructor(name,age,sex,nativePlace){
this.name=name; // 注意:这里是分号
this.age=age;
this.sex=sex;
this.nativePlace=nativePlace;
}
// 下面是函数属性
eat(){console.log("红烧排骨")}
study(){console.log("英文")}
play(){console.log("敲代码")}
} var sunShine = new Person("fanfan","","女","黑龙江");
console.log(sunShine) // Person {name: "fanfan", age: "22", sex: "女", nativePlace: "黑龙江"}
七、Promise
对象是一个构造函数,用来生成Promise
实例。
const promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
// 成功
promise.then(data => {
console.log(data );
});
// 错误 异常
promise.catch(error => {
console.log(error );
});
八、Set()和Map()
set()有序列表集合(没有重复) 数组去重利器
Set()是指有序列表集合 (set中的元素是没有重复的) set包含的方法
add()、has()、delete()、clear()等 add() 添加 var s = new Set();
s.add();
s.add(window);
s.add(true);
s.add();
console.log(s);//一共三个元素
console.log(s.size)//数组的长度是3
delete(value) 删除指定元素 //结合上栗
s.delete(window);
console.log(s) //1 true
console.log(s.size) //
has( value )用来判断指定的值是否在set集合中
存在返回true 不存在返回false //结合上栗
console.log( s.has() )//true
clear() 同来清空set集合的 //结合上栗
s.clear()
console.log(s)//此时为空
举个例子:生成10个1-20的随机数,要求不可以重复
var arr3 = new Set();
while(arr3.size<){
var yuan = parseInt(Math.random() * ( - + ) + );
arr3.add(yuan);
}
console.log(arr3)
Map() 用来存放键值对的集合
var map = new Map();
map.set("name","张三");
map.set("age",);
console.log(map) // Map {"name" => "张三", "age" => 20}
get(key)根据key值取得value console.log( map.get("name")) // 张三
has() 判断是否存在某个键值对
存在返回true 不存在返回fasle console.log( map.has("age") ) // true
console.log( map.has("age1") ) // false
clear() 清空集合 map.clear();
console.log(map);//Map {}
九、模板字符串
const user = {
name: '张三',
age:
}
console.log(`My name is ${user.name} and age is ${user.age}`) // My name is 张三 and age is 18
十、for of 值遍历
var someArray = [ "a", "b", "c" ];
for (v of someArray) {
console.log(v); // 输出 a,b,c
}
十一、Proxies Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。一下子让我们对一个对象有了很强的追踪能力,同时在数据绑定方面也很有用处
// 定义被侦听的目标对象
var engineer = { name: 'Joe Sixpack', salary: };
// 定义处理程序
var interceptor = {
set: function (receiver, property, value) {
console.log(property, 'is changed to', value);
receiver[property] = value;
}
};
// 创建代理以进行侦听
engineer = Proxy(engineer, interceptor);
// 做一些改动来触发代理
engineer.salary = ; // 控制台输出:salary is changed to 60
十二、 简述Es7
一、异步函数(async/await) 常用利器
var fs = require('fs');
var readFile = function (fileName){
// 需要被await的话 就用promise包装
return new Promise(function (resolve, reject){
fs.readFile(fileName, function(error, data){
if (error) reject(error);
resolve(data);
});
});
};
// await 等待的是一个promise对象
var asyncReadFile = async function (){
// 当 f1 执行完毕后 f2 才会执行
var f1 = await readFile('/etc/fstab');
var f2 = await readFile('/etc/shells');
console.log(f1.toString());
console.log(f2.toString());
}
二 、string中加入include方法
includes("字符"); 用于判断字符串中是否包含某个字符
存在返回true 不存在返回false
includes("字符",startIndex); 用于判断字符串中下标startIndex是否是某个字符
是返回true 不是返回false
var str = "hello";
console.log( str.includes("e") ) // true
console.log( str.includes("e",) ); // false
三、求幂运算
console.log(**) //
四、Object.values/Object.entries
Object.values和 Object.entries是在ES2017规格中,它和Object.keys类似,返回数组类型,其序号和Object.keys序号对应。
Object.values,Object.entries和Object.keys各自项返回是数组,相对应包括key,value或者可枚举特定对象property/attribute
五、字符填充函数padStart 和 padEnd
console.log('0.00'.padStart()) // 0.00
console.log('10,000.00'.padStart()) // 10,000.00
console.log('250,000.00'.padStart()) // 250,000.00
以上只是些个人认为比较常用的欢迎指正不对不足之处, 详细的可以看看阮一峰大神的特篇 http://es6.ruanyifeng.com/
ES6 开发常用新特性以及简述ES7的更多相关文章
- ES6中常用新特性讲解
1.不一样的变量声明:const和let ES6推荐使用let声明局部变量,相比之前的var(无论声明在何处,都会被视为声明在函数的最顶部) let和var声明的区别: var x = '全局变量'; ...
- es6/es7/es8常用新特性总结(超实用)
本文标题有误导性,因为我其实想写node8的新特性,说实话一下子从node v1.x跳跃到node 8.x+ 真有点受宠若惊的感觉.一直觉得node 数组. 对象.序列等的处理没有python方便,因 ...
- ES6常用新特性
https://segmentfault.com/a/1190000011976770?share_user=1030000010776722 该文章为转载文章!仅个人喜好收藏文章! 1.前言 前几天 ...
- ES6、7、8常用新特性总结(超实用)
ES6常用新特性 1. let && const let 命令也用于变量声明,但是作用域为局部 { let a = 10; var b = 1; } 在函数外部可以获取到b,获取不到a ...
- Java8常用新特性实践
前言: 时下Oracle开速迭代的Java社区以即将推出Java10,但尴尬的是不少小中企业仍使用JDK7甚至JDK6开发. 从上面列出的JDK8特性中我们可以发现Java8的部分特性很明显的是从Sc ...
- 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性
原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...
- HTML5的常用新特性你必须知道
HTML5的常用新特性你必须知道 1 新的 声明 HTML 有多个不同的版本,只有完全明白页面中使用的确切 HTML 版本,浏览器才能完全正确地显示出 HTML 页面.这就是 的用处. 不是 HTML ...
- Atitit.业务系统的新特性 开发平台 新特性的来源总结
Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby go dart1 1.2. ...
- ES6语法的新特性
ES6 就是ECMAScript 6是新版本JavaScript语言的标准.虽然目前已经更新到ES7,但是很多浏览器还不知处ES7语法,该标准仍在更新中,但目前部门网站都指出ES6的语法.目前ES6也 ...
随机推荐
- Python: find the smallest and largest value
题目要求: Write a program that repeatedly prompts a user for integer numbers until the user enters 'done ...
- NOIP2018退役祭
退役感受 在写下这个标题的时候,我的心情是复杂的,无非就是感觉像对一位将要赶往战场的士兵说:"你的战争已经输掉了." 退役了,没有什么好说的.无论再怎么抱怨这题出的真烂也无法改变了 ...
- HTTP Status 404 - No result defined for action com.ouyang.action.GreetingAction and result success 错误解决办法
1.原来设置的包声明: <package name="myPackage" extends="struts-default"> <!-- 定义 ...
- EditPlus查找替换
换行符\n,记得选择正则表达式 1]正则表达式应用——替换指定内容到行尾解决:① 在替换对话框,查找内容里输入“abc.*”② 同时勾选“正则表达式”复选框,然后点击“全部替换”按钮其中,符号的含义如 ...
- MySQL LIMIT的使用
SELECT语句返回所有匹配的行,它们可能是指定表中的每个行.为 了返回第一行或前几行,可使用LIMIT子句. 比如我原始的student表如下: 我现在想输出前4行,就使用 SELECT * FRO ...
- 记录Python类与继承的一个错误
今天在学python的类与继承的时候遇到一个错误,原来是自己在ctrl+c ctrl+v的时候漏了一个括号 class Car(): def __init__(self,make,year,mode ...
- JAVA实操项目:转账接口设计
在一个项目中,一般都会支付相关的业务,而涉及到支付必定会有转账的操作,转账这一步想起来算是比较关键的部分,这个接口的设计能力,也大致体现出一个人的水平. 昨天碰到了一个题目: 尝试用java编写一个转 ...
- WebSocket前后台交互
其实对于前后台交互有很多种方法(只列举我知道的,嘻嘻): 1:from 表单: 使用场景——小信息量提交给后台 2:ajax(跨域的话用jsonp): 可以进行多量的前后台信心传递: 但实时性不高,不 ...
- Eclipse安装lombok
下载lombok 下载地址:https://projectlombok.org/downloads/lombok.jar 或者访问官网下载 https://projectlombok.org/ 安装 ...
- 7内存管理-MRC
@0简介 内存管理,即内存里各个对象的管理,即内存里各个对象的生命周期的管理,(从面向对象的角度看) @1引用计数器 默认为1,即有一滴的生命血液,若为0就会死去 @2单个对象的管理 自己管理自己,自 ...