es6新增的特性:1、用const和let宣告變量,兩個變數都為區塊級作用域;2、模板字串,語法“`字串`”,可使字串拼接更簡潔;3、箭頭函數,可很好解決this指向問題;4、延展操作符,將可迭代物件展開到其單獨的元素中;5、模組化等。
本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。
ECMAScript 6(ES6) 目前基本上成為業界標準,它的普及速度比ES5 要快很多,主要原因是現代瀏覽器對ES6 的支援相當迅速,尤其是Chrome 和Firefox 瀏覽器,已經支援ES6 中絕大多數的特性。
下面逐一為大家詳解常用的ES6新特性:
1.不一樣的變數宣告:const和let
在之前JS是沒有區塊級作用域的,const與let填補了這方便的空白,const與let都是區塊級作用域。
ES6建議使用let宣告局部變量,相較於先前的var(無論宣告在何處,都會被視為宣告在函數的最頂端) let和var聲明的區別:
var x = '全局变量'; { let x = '局部变量'; console.log(x); // 局部变量 } console.log(x); // 全局变量
let表示聲明變量,而const表示聲明常數,兩者都為塊級作用域;const 聲明的變量都會被認為是常數,意思是它的值被設定完成後就不能再修改了:
const a = 1 a = 0 //报错
如果const的是一個對象,對象所包含的值是可以被修改的。抽像一點兒說,就是物件所指向的位址沒有變就行:
const student = { name: 'cc' } student.name = 'yy';// 不报错 student = { name: 'yy' };// 报错
有幾個點要注意:
- let 關鍵字宣告的變數不具備變數提升(hoisting)特性
- let 和const 宣告只在最靠近的一個區塊中(花括號內)有效
- 當使用常數const 宣告時,請使用大寫變量,如:CAPITAL_CASING
- const 在宣告時必須被賦值
#2.模板字串
在ES6之前,我們往往這麼處理模板字串: 透過「\」和「」來建構模板
$("body").html("This demonstrates the output of HTML \ content to the page, including student's\ " + name + ", " + seatNumber + ", " + sex + " and so on.");
而對ES6來說
基本的字串格式化。將表達式嵌入字串中進行拼接。用${}來界定;
ES6反引號(``)直接搞定;
ES6支援模板字串,使得字串的拼接更加的簡潔、直覺。
$("body").html(`This demonstrates the output of HTML content to the page, including student's ${name}, ${seatNumber}, ${sex} and so on.`);
3.箭頭函數(Arrow Functions)
#這是ES6中最令人興奮的特性之一。 =>
不只是關鍵字function的簡寫,它也帶來了其它好處。箭頭函數與包圍它的程式碼共用同一個this,能幫你很好的解決this的指向問題。有經驗的JavaScript開發者都熟悉諸如var self = this;
或var that = this
這種引用外圍this的模式。但藉助=>,就不需要這種模式了。
箭頭函數最直觀的三個特點。
- 不需要function 關鍵字來建立函數
- 省略return 關鍵字
- 繼承目前上下文的this 關鍵字
// ES5 var add = function (a, b) { return a + b; }; // 使用箭头函数 var add = (a, b) => a + b; // ES5 [1,2,3].map((function(x){ return x + 1; }).bind(this)); // 使用箭头函数 [1,2,3].map(x => x + 1);
細節:當你的函數有且僅有一個參數的時候,是可以省略掉括號的。當你函數回傳有且僅有一個表達式的時候可以省略{} 和return;
4. 函數的參數預設值
在ES6之前,我們往往這樣定義參數的預設值:
// ES6之前,当未传入参数时,text = 'default'; function printText(text) { text = text || 'default'; console.log(text); } // ES6; function printText(text = 'default') { console.log(text); } printText('hello'); // hello printText();// default
#5.延展運算子(Spread operator)
延展操作符 …
是ES6中引入的,將可迭代對象展開到其單獨的元素中,所謂的可迭代對象就是任何能用for of循環進行遍歷的對象,例如:陣列、字串、Map 、Set 、DOM節點等。
延展運算子...
可以在函數呼叫/陣列建構時, 將陣列表達式或string在語法層級展開;還可以在建構物件時, 將物件運算式按key-value的方式展開。
當被用於迭代器中時,它是一個Spread 運算子:
function foo(x,y,z) { console.log(x,y,z); } let arr = [1,2,3]; foo(...arr); // 1 2 3
當被用於函數傳參時,是一個Rest 運算子:當被用於函數傳參時,是一個Rest 操作符:
function foo(...args) { console.log(args); } foo( 1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]
6.二進位和八進位字面量
ES6 支援二進位和八進制的字面量,通過在數字前面添加0o 或者0O 即可將其轉換為八進制值:
let oValue = 0o10; console.log(oValue); // 8 let bValue = 0b10; // 二进制使用 `0b` 或者 `0B` console.log(bValue); // 2
7.對象和數組解構
// 对象
const student = {
name: 'Sam',
age: 22,
sex: '男'
}
// 数组
// const student = ['Sam', 22, '男'];
// ES5;
const name = student.name;
const age = student.age;
const sex = student.sex;
console.log(name + ' --- ' + age + ' --- ' + sex);
// ES6
const { name, age, sex } = student;
console.log(name + ' --- ' + age + ' --- ' + sex);
ES6 允許在物件中使用super 方法:var parent = {
foo() {
console.log("Hello from the Parent");
}
}
var child = {
foo() {
super.foo();
console.log("Hello from the Child");
}
}
Object.setPrototypeOf(child, parent);
child.foo(); // Hello from the Parent
// Hello from the Child
let letter = ['a', 'b', 'c']; letter.size = 3; for (let letter of letters) { console.log(letter); } // 结果: a, b, c
for...in 用来遍历对象中的属性:
let stu = ['Sam', '22', '男']; stu.size = 3; for (let stu in stus) { console.log(stu); } // 结果: Sam, 22, 男
10.ES6中的类
ES6 中支持 class 语法,不过,ES6的class不是新的对象继承模型,它只是原型链的语法糖表现形式。
函数中使用 static 关键词定义构造函数的的方法和属性:
class Student { constructor() { console.log("I'm a student."); } study() { console.log('study!'); } static read() { console.log("Reading Now."); } } console.log(typeof Student); // function let stu = new Student(); // "I'm a student." stu.study(); // "study!" stu.read(); // "Reading Now."
类中的继承和超集:
class Phone { constructor() { console.log("I'm a phone."); } } class MI extends Phone { constructor() { super(); console.log("I'm a phone designed by xiaomi"); } } let mi8 = new MI();
extends 允许一个子类继承父类,需要注意的是,子类的constructor 函数中需要执行 super() 函数。 当然,你也可以在子类方法中调用父类的方法,如super.parentMethodName()。 在 这里 阅读更多关于类的介绍。
有几点值得注意的是:
- 类的声明不会提升(hoisting),如果你要使用某个 Class,那你必须在使用之前定义它,否则会抛出一个 ReferenceError 的错误
- 在类中定义函数不需要使用 function 关键词
11、模块化(Module)
ES5不支持原生的模块化,在ES6中模块作为重要的组成部分被添加进来。模块的功能主要由 export 和 import 组成。每一个模块都有自己单独的作用域,模块之间的相互调用关系是通过 export 来规定模块对外暴露的接口,通过import来引用其它模块提供的接口。同时还为模块创造了命名空间,防止函数的命名冲突。
导出(export)
ES6允许在一个模块中使用export来导出多个变量或函数。
导出变量
//test.js export var name = 'Rainbow'
心得:ES6不仅支持变量的导出,也支持常量的导出。
export const sqrt = Math.sqrt;//导出常量
ES6将一个文件视为一个模块,上面的模块通过 export 向外输出了一个变量。一个模块也可以同时往外面输出多个变量。
//test.js var name = 'Rainbow'; var age = '24'; export {name, age};
导出函数
// myModule.js export function myModule(someArg) { return someArg; }
导入(import)
定义好模块的输出以后就可以在另外一个模块通过import引用。
import {myModule} from 'myModule';// main.js import {name,age} from 'test';// test.js
心得:一条import 语句可以同时导入默认函数和其它变量。
import defaultMethod, { otherMethod } from 'xxx.js';
【相关推荐:javascript视频教程、web前端】
以上是es6有什麼新加的東西的詳細內容。更多資訊請關注PHP中文網其他相關文章!