ES6新特性
ES6新特性
每日更新前端基础,如果觉得不错,点个star吧 ? https://github.com/WindrunnerMax/EveryDay
ES6的常用新特性简介,全部特性可参阅 Ecma-International MDN ES6入门 ES6 教程
ES6
全称ECMAScript 6.0
,是JavaScript
的下一个版本标准,2015.06
发版。ECMAScript
和 JavaScript
的关系是,前者是后者的规格,后者是前者的一种实现。
let 与 const
ES2015(ES6)
新增加了两个重要的JavaScript
关键字: let
和const
。
ES6
明确规定,代码块内如果存在let
或者 const
,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量之前使用它会报错,称为暂时性死区。
ES6
的块级作用域必须有大括号,如果没有大括号,JavaScript
引擎就认为不存在块级作用域。
-
let
声明的变量只在let
命令所在的代码块内有效。 -
let
只能声明一次var
可以声明多次 -
for
循环计数器很适合用let
-
let
不存在变量提升,var
会变量声明提升 -
const
声明一个只读的常量,一旦声明,常量的值就不能改变。 -
const
其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。对于简单类型number
、string
、boolean
,值就保存在变量指向的那个内存地址,因此const
声明的简单类型变量等同于常量。而复杂类型object
,array
,function
,变量指向的内存地址其实是保存了一个指向实际数据的指针,所以const
只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了
解构赋值
ES6
允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
let [a, b, c] = [1, 2, 3]; // 基本
let [a, [[b], c]] = [1, [[2], 3]]; //嵌套
let [a, , b] = [1, 2, 3]; // 可忽略
let [a = 1, b] = []; // a = 1, b = undefined // 不完全解构
let [a, ...b] = [1, 2, 3]; // 剩余运算符
let [a, b, c, d, e] = 'hello'; // 字符串等
let { a, b } = { a: 'aaa', b: 'bbb' }; // 对象模型的解构 前后两个kay需对应
Symbol
ES6
引入了一种新的原始数据类型Symbol
,表示独一无二的值,最大的用法是用来定义对象的唯一属性名。
ES6
数据类型除了Number
、String
、Boolea
、 Object
、null
和undefined
,还新增了 Symbol
。
let s1 = Symbol("s");
let s2 = Symbol("s");
console.log(s1 === s2); //false
Spread / Rest 操作符
Spread
用于将数组作为参数直接传入函数
var s = ['1', '2', '3'];
function f(s1,s2,s3){
console.log(`Hello ${s1},${s2},${s3}`); //ES6新增字符串中加入变量和表达式
}
f(...s); //Hello 1,2,3
Rest
用于函数传参传递数组
function f(...args){
console.log(args);
}
f(1,2,3,4,5); //[1, 2, 3, 4, 5]
箭头函数
ES6
中,箭头函数就是函数的一种简写形式,使用括号包裹参数,跟随一个 =>
,紧接着是函数体;特别需要注意的是箭头函数是继承当前上下文的this
关键字
var add = (a, b) => a + b;
var show = a => console.log(a);
var test = (a,b,c) => {console.log(a,b,c);return a+b+c;}
add(1,1); //2
show(1); //1
test(1,1,1); //1 1 1
参数默认值
function f(a = 1){
console.log(a);
}
f(); //1
f(11); //11
字符串拓展
ES6
之前判断字符串是否包含子串,用indexOf
方法,ES6
新增了子串的识别方法。
-
includes()
返回布尔值,判断是否找到参数字符串。 -
startsWith()
返回布尔值,判断参数字符串是否在原字符串的头部。 -
endsWith()
返回布尔值,判断参数字符串是否在原字符串的尾部。 -
repeat()
返回新的字符串,表示将字符串重复指定次数返回。 -
padStart()
返回新的字符串,表示用参数字符串从头部补全原字符串。 -
padEnd()
返回新的字符串,表示用参数字符串从尾部(右侧)补全原字符串。
数值拓展
- 二进制表示法新写法 前缀
0b
或0B
,例如console.log(0B11 === 3); //true
- 八进制表示法新写法 前缀
0o
或0O
,例如console.log(0O11 === 9); //true
- 常量
Number.EPSILON
,表示1
与大于1
的最小浮点数之间的差,值接近于2.2204460492503130808472633361816E-16
-
Number.MAX_SAFE_INTEGER
表示在JavaScript
中能够精确表示的最大安全整数 -
Number.isFinite()
用于检查一个数值是否为有限的finite
,即不是Infinity
-
Number.parseInt()
逐步减少全局方法,用于全局变量的模块化,方法的行为没有发生改变
数组拓展
-
Array.of()
将参数中所有值作为元素形成数组。 -
Array.from()
将类数组对象或可迭代对象转化为数组。 -
find()
查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。 -
findIndex()
查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引。 -
fill()
将一定范围索引的数组元素内容填充为单个指定的值。 -
copyWithin()
将一定范围索引的数组元素修改为此数组另一指定范围索引的元素。 -
entries()
遍历键值对。 -
keys()
遍历键名。 -
values()
遍历键值。 -
includes()
数组是否包含指定值。 -
flat()
嵌套数组转一维数组。 -
flatMap()
先对数组中每个元素进行了处理,再对数组执行flat()
方法。
迭代器
-
Symbol.iterator
一个统一的接口,它的作用是使各种数据结构可被便捷的访问 -
for of
是 ES6 新引入的循环,用于替代for..in
和forEach()
类
ES6
提供了更接近传统语言的写法,引入了class
这个概念,作为对象的模板。通过class
关键字,可以定义类,与多数传统语言类似。不过,ES6
的class
不是新的对象继承模型,它只是原型链的语法糖表现形式。
class Me {
constructor() {
console.log("constructor");
}
study() {
console.log('study');
}
}
console.log(typeof Me); //function
let me = new Me(); //constructor
me.study(); //study
Promise 对象
Promise
是异步编程的一种解决方案
从语法上说,Promise 是一个对象,从它可以获取异步操作的消息
Promise
异步操作有三种状态:pending
、fulfilled
和rejected
。除了异步操作的结果,任何其他操作都无法改变这个状态。
then
方法接收两个函数作为参数,第一个参数是Promise
执行成功时的回调,第二个参数是 Promise
执行失败时的回调,两个函数只会有一个被调用。
const p1 = new Promise(function(resolve,reject){
resolve('resolve');
});
const p2 = new Promise(function(resolve,reject){
reject('reject');
});
p1.then(function(v){
console.log(v); //resolve
});
p2.then(function(v){
console.log(v);
},
function(v){
console.log(v); //reject
});
- cf(#div1 B. Dreamoon and Sets)(数论)
- hdu 1805Expressions(二叉树构造的后缀表达式)
- 清空messages没有权限的解决方法
- hdu1710(Binary Tree Traversals)(二叉树遍历)
- 基本线程同步(一) 同步方法
- uva514(trail)(模拟栈)
- zoj3822 Domination(概率dp)
- Veeam Backup & Replication(三):创建备份与还原备份
- 使用Go开发一个简单的服务器程序
- C++ 与设计模式学习(其一)
- xz文件压缩工具的用法
- Java 中正确使用 hashCode 和 equals 方法
- C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
- openwrt将LAN口改为WAN方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- selenium元素定位中css或者xpath不选择某一类元素
- TRTC横竖屏切换
- Swift 元祖
- Flutter - 解决混合开发iOS脚本打包遇到的问题
- Shader 特效 —— Film Burn (炫光光晕)效果【GLSL】
- java selenium chromedriver浏览器驱动放在哪里?【两种位置】
- 56. Vue原生js的组件拆分结构设计
- 一步一步教你把 Redux Saga 添加到 React&Redux 程序中
- Octave的基本语句及函数的使用入门—ML Note 31
- JAVA的Lock锁接口实现
- 抽象语法树为什么抽象
- burpsuite IP伪造插件
- 用阻塞队列,再系一次鞋带
- I2C总线架构 之 设备驱动
- kail 安装及卸载 docker【亲测可用】