ES6一些新特性记录
ES6一些新特性记录
1.箭头操作符
箭头操作符左边是需要输入的参数,右边是返回值
比如运用到js回调函数中可以使书写更加方便
var array=[1,3,5]; //标准写法 array.foreach(function(v,i,a){ console.log(v); }); //es6写法 array.foreach(v => console.log(v));
又比如一块简单的代码:
function (i){ return i + 1} //es5写法 (i) => i + 1;
如果方程式比较复杂,则需要用{}把代码包起来。
//es5写法: function (x, y){ x++; y--; return x + y ; } //es6写法: (x, y) => {x++; y--; return x + y}
2.增强对象字面量
es6新特性中对象字面量被增强了,使用更为简洁灵活
a.可以直接在对象字面量里定义原型
b.定义方法可以不用function关键字
c.直接调用父类方法
var human = { breath(){ console.log('breathing') } }; var worker = { //直接使用对象字面两定义原型为human,相当于继承human __proto__:human, company:Earth; //定义方法不再需要function work(){ console.log("working") }; }; human.breath(); //breathing //调用继承来的human的breath方法 worker.breath(); //breathing
3.字符串模版
es6新特性中,可以使用反引号``来创建字符串,这种方法可以包含用$和花括号{}包裹的变量
//生成一个随机数 var num = Math.random(); //将这个数输出到控制台 console.log(`your num is ${num}`);
4.解构
自动解析数组或对象中的值,比如我们平时若要一个函数返回多个值,常规的做法是返回一个对象,将每个值作为对象中的属性返回。但中es6中,可以利用解构这一特性,直接返回一个数组,然后数组中的值回自动被解析到接收该值的变量中。
5.let
var name = 'zach' while (true) { var name = 'obama' console.log(name) //obama break } console.log(name) //obama
es5中只有全局作用域和函数作用域,这样带来了很多不合理的场景,比如上面demo中,内层变量覆盖外层变量,而let实际上为JS新增了块级作用域,用它所声明的变量,只在let命令所在的代码块内有效。
let name = "shark"; while(true){ let name = "Jan"; console.log(name); //Jan break; } console.log(name); //shark
var另一个不合理场景就是:用来计数的循环变量,泄露为全局变量,比如
var a = []; for( var i = 0; i <= 10; i++){ a[i] = function(){ console.log(i); } }; a[6](); //10
上面变量中,变量i是var声明的,在全局范围内有效,所以每一次循环,新的值都会覆盖旧的值,这就导致,最后循环结束时输出的是10.而使用let则不会出现这个问题。
var a = []; for( let i = 0; i <= 10; i++){ a[i] = function(){ console.log(i); } }; a[6](); //5
因为let只在自己所在的块级作用域有效,所以i不会泄露成全局变量,最后输出的仍然是数组a中下标为6的值。
6.const
const也可以用来声明变量,只不过它声明的是变量,一旦声明就不能够改变
const PI = Math.PI PI = 24; //ERROR
当我们想去改变const声明的常量时,浏览器就会报错。
const有一个很好的应用场景,当我们使用第三方库声明的变量时,可以避免不小心重命名而导致出现的bug.
7.默认参数值
es6可以直接在定义函数时指定参数的默认值,而不需要逻辑运算符了
// 常规做法 function sayHello(){ var name = name || "Jan"; console.log('hello '+name); } // es6写法 function sayHello(name = "Jan"){ console.log('hello ${name}'); } // 常规 result: sayHello():hello Jan ; sayHello('Jack'):hello Jack ; // es6 result sayHello(): hello Jan ; sayHello('Tony'): hello Tony ;
8.template语法
当我们要引入大段html到文档中时,传统的写法是:
$("#result").append( "There are <b>" + basket.count + "</b> " + "items in your basket, " + "<em>" + basket.onSale + "</em> are on sale!" );
我们需要引一大堆的+号用来连接文本与变量。而使用es6中模版字符串后,我们可以这样写
$('result').append('
There are <b>${basket.count}</b>
items in your basket<em>${basket.onSale}</em>
are on sale!
')
9.for of 值遍历
es5中我们都知道用for in 遍历数组,对象,es6中提供的for of与其功能相似,只不过它遍历的不是序号而是值。
var arr = [a, c, e, g]; for (v of arr){ console.log(v); //a , c , e ,g }