ES6 是 ECMAScript 6.0 的簡寫,即 JavaScript 語言的下一代標準,已經在 2015年6月正式發佈了,它的目標是讓JS可以方便的開發企業級大型應用程序,所以,ES6的一些規範正在逐漸向Java、C# 等後端語言標準靠近。在 ES6 規範中,比較重大的變化有如下幾個方面:css
新增 let、const 命令 來聲明變量,和var 相比,let 聲明的變量不存在變量提高問題,不容許在相同的做用域內重複聲明同一個變量,但沒有改變JS弱類型的特色,依然能夠接受任意類型變量的聲明;const 聲明的變量不容許在後續邏輯中改變,提升了JS語法的嚴謹性。html
新增解構賦值、rest 語法、箭頭函數等,這些都是爲了讓代碼看起來更簡潔,而包裝的語法糖。前端
新增模塊化機制,這是 JavaScript 走向規範比較重要的一步,讓前端更方便的實現工程化。vue
新增類和繼承的概念,配合模塊化,JavaScript 也能夠實現高複用、高擴展的系統架構。後端
新增模板字符串功能,高效簡潔,結束拼接字符串的時代。數組
新增 Promise 機制,解決異步回調多層嵌套的問題。架構
ES5中只有全局做用域和函數做用域,並無塊級做用域,而ES6中使用let設置塊級做用域,外層代碼塊就再也不受內層代碼塊的影響框架
const用來聲明常量。const聲明常量必須當即初始化,而且其值不能再改變。const聲明常量的做用域與let相同,只在聲明所在的塊級做用域內有效。 異步
const PI = 3.14;
ES6規定:var命令和function命令聲明的全局變量依舊是全局對象的屬性;let命令、const命令和class命令聲明的全局變量不屬於全局對象的屬性ide
var x = 10; let y = 20; window.x // 10 window.y // undefined
ES6容許按照必定的模式,從數組或對象中提取值,對變量進行賦值,這種方式被稱爲變量的解構賦值。
數組的解構賦值: var [x, y, z] = [10, 20, 30] x // 10 y // 20 z // 30 對象的解構賦值: var {x, y} = {x: 10, y: 20} x // 10 y // 20
在此以前,JavaScript中只有indexOf方法(存在返回0,不存在返回-1)可用來肯定一個字符串是否包含在另外一個字符串中。ES6中又提供了3種新方法:
includes():返回布爾值,表示是否找到了參數字符串。 stratsWith():返回布爾值,表示參數字符串是否在源字符串的開始位置。 endsWith():返回布爾值,表示參數字符串是否在源字符串的結尾位置 var s = "Hello world!"; s.includes("o") // true s.startsWith("Hello") // true s.endsWith("!") // true 這三個方法都支持第2個參數,表示開始匹配的位置。 s.includes("o", 8) // false s.startsWith("world", 6) // true s.endsWith("Hello", 5) // true
模板字符串(template string)是加強版的字符串,用反引號(`)標識。它能夠當作普通字符串使用,也能夠用來定義多行字符串,或者在字符串中嵌入變量。在模板字符串中嵌入變量,須要將變量名寫入${}中。
var name = 'Q1mi', age = 18; `My name is ${name}, I’m ${age} years old.`
箭頭函數有個特色:若是參數只有一個,能夠省略小括號、若是不寫return,能夠不寫大括號、沒有arguments變量、不改變this指向(其中箭頭函數中this指向被固定化,不是由於箭頭函數內部有綁定this的機制。實際緣由是箭頭函數根本沒有本身的this,致使內部的this就是外層代碼塊的this)
Object.assign方法用來將源對象(source)的全部可枚舉屬性複製到目標對象(target)。它至少須要兩個對象做爲參數,第一個參數是目標對象,第二個參數是源對象。參數必須都是對象,不然拋出TypeError錯誤。
Object.assjgn只複製自身屬性,不可枚舉屬性(enumerable爲false)和繼承的屬性不會被複制。
var x = {name: "Q1mi", age: 18}; var y = x; var z = Object.assign({}, x); x.age = 20; x.age // 20 y.age // 20 z.age // 18
ES5的構造對象的方式 使用構造函數來創造。構造函數惟一的不一樣是函數名首字母要大寫。
function Point(x, y){ this.x = x; this.y = y; } // 給父級綁定方法 Point.prototype.toSting = function(){ return '(' + this.x + ',' + this.y + ')'; } var p = new Point(10, 20); console.log(p.x) p.toSting(); // 繼承 function ColorPoint(x, y, color){ Point.call(this, x, y); this.color = color; } // 繼承父類的方法 ColorPoint.prototype = Object.create(Point.prototype); // 修復 constructor ColorPoint.prototype.constructor = Point; // 擴展方法 ColorPoint.prototype.showColor = function(){ console.log('My color is ' + this.color); } var cp = new ColorPoint(10, 20, "red"); console.log(cp.x); console.log(cp.toSting()); cp.showColor()
ES6 使用Class構造對象的方式:
class Point{ constructor(x, y){ this.x = x; this.y = y; } // 不要加逗號 toSting(){ return `(${this.x}, ${this.y})`;} } var p = new Point(10, 20); console.log(p.x) p.toSting(); class ColorPoint extends Point{ constructor(x, y, color){ super(x, y); // 調用父類的constructor(x, y) this.color = color; } // 不要加逗號 showColor(){ console.log('My color is ' + this.color); } } var cp = new ColorPoint(10, 20, "red"); console.log(cp.x); cp.toSting(); cp.showColor()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Vue示例</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id="d1"> {{ message }} // Hello Vue! <h1 v-html="name"></h1> //顯示p標籤渲染的Hello Vue! <p v-if="ok">哈哈哈</p> //若是data中OK:(true),則p標籤顯示,不存在或者(false),則標籤消失 <p v-show="ok">哈哈哈</p> //若是data中OK:(true),則p標籤顯示,不存在或者(false),display:none //注意,v-show 不支持 <template> 元素,也不支持 v-else <a v-bind:href="url">點我</a> //給a標籤綁定href='https://www.sogo.com' <div v-on:click="foo">點我彈出123</div> //v-on監聽,給div標籤綁定事件 <form action=""> <input type="text" name="username"> <input v-on:click.prevent='foo' type="submit" value="點我"> //終止submit提交特性,執行foo </form> <form v-on:submit.prevent="foo">...</form> //終止submit提交特性,執行foo </div> <script src="./vue.js"></script> <!--<script src="https://cdn.bootcss.com/vue/2.5.16/vue.js"></script>--> <script> var data = { message: 'Hello Vue!' name: "<p>Hello Vue!</p>", age: 16, ok: true, url: 'https://www.sogo.com' }; var vm = new Vue({ el: "#d1", data: data, methods:{ /* foo:function(){ alert(123) } */ foo() { alert(123) }, remove(index){ this.todoList.splice(index,1) }, add(){ if (!this.current.title){ return } // 把當前的這個待辦事項 追加到todoList var obj = Object.assign({}, this.current) this.todoList.push(obj) // 清空輸入框 this.current.title = '' } } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id="d1"> <p>lastName: {{lastName}}</p> <p>firstName: {{firstName}}</p> <p>全名: {{ fullName }}</p> </div> <script src="./vue.js"></script> <script> var vm = new Vue({ el: "#d1", data: { firstName: "三", lastName: "張", }, // 計算屬性 computed: { // fullName:function () { // return this.lastName + this.firstName // } fullName: { // getter get: function () { console.log("你要和我要全名了。。。"); return this.firstName + ' ' + this.lastName }, // setter set: function (newValue) { console.log("你要給我設置新的全名...") var names = newValue.split(' '); this.firstName = names[0]; this.lastName = names[names.length - 1] } } } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> .c { height: 100px; width: 100px; border-radius: 50%; background-color: green; } .c1 { color: red; background-color: red; } </style> </head> <body> <div id="d1"> <div v-on:click="changeRed" //div標籤被點擊時執行method中的changeRed函數 class="c" v-bind:class="{ c1: isActive }" //在isActive返回true時,class="c1" > </div> <div v-bind:class="[a, b]"></div> //給div標籤綁定class="c1 c2" //根據條件切換列表中的 class,能夠用三元表達式: <div v-bind:class="[isActive ? activeClass : '', errorClass]"></div> //當有多個條件 class 時這樣寫有些繁瑣。因此在數組語法中也可使用對象語法: <div v-bind:class="[{ active: isActive }, errorClass]"></div> <!--直接綁定CSS樣式--> <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }">還有人在聽</div> //直接綁定到一個樣式對象一般更好,這會讓模板更清晰: <div v-bind:style="styleObject">還有人在聽</div> //數組語法能夠將多個樣式對象應用到同一個元素上: <div v-bind:style="[baseStyles, overridingStyles]"></div> </div> <script src="./vue.js"></script> <script> var vm = new Vue({ el: "#d1", data: { isActive:false, a: "c1", b: "c2", activeColor: "yellow", fontSize: 24 styleObject: { color: 'red', fontSize: '13px' } }, methods:{ changeRed(){ this.isActive = true } } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <div id="d1"> <template v-if="show"> //添加成模板,爲全部div設置條件 <div>還有人在聽</div> <div>哈哈哈</div> <div>嘿嘿嘿</div> </template> <div v-if="show">還有人在聽嗎?</div> //data中show:true 時內容顯示 <div v-else>根本沒人在聽</div> //data中show:false 時內容顯示 <template v-if="loginType === 'username'"> <label>Username</label> <input placeholder="Enter your username" key="username-input"> //添加key表示不復用標籤 </template> <template v-else> <label>Email</label> <input placeholder="Enter your email address" key="email-input"> </template> //注意:<label> 元素仍然會被高效地複用,由於它們沒有添加 key 屬性 </div> <script src="./vue.js"></script> <script> var vm = new Vue({ el: "#d1", data: { show: true, loginType: 'username' } }) </script> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> </style> </head> <body> <div id="d1"> <ul> <li v-for="food in foods">{{food}}</li> </ul> <ol> <li v-for="(v, k, index) in obj">{{index}}:{{k}}:{{v}}</li> </ol> //相似於 v-if,也能夠利用帶有 v-for 的 <template> 來循環渲染一段包含多個元素的內容: <ul> <template v-for="item in items"> <li>{{ item.msg }}</li> <li class="divider" role="presentation"></li> </template> </ul> </div> <script src="./vue.js"></script> <script> var vm = new Vue({ el: "#d1", data: { foods: [ "紅燒牛肉", "腰子湯", "小龍蝦", "豇豆炒蛋", "宮保雞丁" ], obj: { name: "張三", age: 16, gender: "哈哈哈" } } }) </script> </body> </html>
<body> <div id="d1"> <input type="text" v-model="name.title"> //v-model負責監聽用戶的輸入事件以更新數據 <p>{{name.title}}</p> <hr> //單個複選框,綁定到布爾值:<!-- `checked` 爲 true 或 false --> <input type="checkbox" id="checkbox" v-model="checked"> <label for="checkbox">{{ checked }}</label> //多個複選框,綁定到同一個數組:往列表里加對應的value值 <hr> <input type="checkbox" id="jack" value="basketball" v-model="checkedNames"> <label for="jack">籃球</label> <input type="checkbox" id="john" value="football" v-model="checkedNames"> <label for="john">足球</label> <input type="checkbox" id="mike" value="doublecolorball" v-model="checkedNames"> <label for="mike">雙色球</label> <br> <span>Checked names: {{ checkedNames }}</span> <hr> //單選按鈕(value) <div id="example-4"> <input type="radio" id="one" value="One" v-model="picked"> <label for="one">One</label> <br> <input type="radio" id="two" value="Two" v-model="picked"> <label for="two">Two</label> <br> <span>Picked: {{ picked }}</span> </div> //單選時(顯示option標籤內的值) <div id="example-5"> <select v-model="selected"> <option disabled value="">請選擇</option> <option>A</option> <option>B</option> <option>C</option> </select> <span>Selected: {{ selected }}</span> </div> //多選時 (綁定到一個數組):往數組裏添加option標籤內的值 <div id="example-6"> <select v-model="selected" multiple style="width: 50px;"> <option>A</option> <option>B</option> <option>C</option> </select> <br> <span>Selected: {{ selected }}</span> </div> //用 v-for 渲染的動態選項: <select v-model="selected"> <option v-for="option in options" v-bind:value="option.value"> {{ option.text }} </option> </select> <span>Selected: {{ selected }}</span> //默認顯示A,根據option.value的值變化 //下拉選擇框 <select v-model="selected"> <!-- 內聯對象字面量 --> <option v-bind:value="123">123</option> <option v-bind:value="{ number: 123 }">123</option> </select> <p>{{ selected }}</p> <hr> //複選框,選中顯示"吳大",未選中顯示"梁二" <input type="checkbox" v-model="zhangzhao" true-value="吳大" false-value="梁二" > <p>{{zz}}</p> <hr> //修飾符,若是要自動過濾用戶輸入的首尾空白字符,能夠給 v-model 添加 trim 修飾符: <input v-model.trim="msg"> <p>{{msg}}</p> </div> <script src="./vue.js"></script> <script> var vm = new Vue({ el: "#d1", data: { name: { //對象 title: '' }, checked:false, checkedNames: [], zhangzhao: null, selected: null, msg: '' picked: '' selected: '' //selected: [] selected: 'A', options: [ { text: 'One', value: 'A' }, { text: 'Two', value: 'B' }, { text: 'Three', value: 'C' } ] } }) </script> </body>
注意:v-model會忽略全部表單元素的
value、
checked、
selected特性的初始值而老是將Vue 例的數據做爲數據來源。應該經過 JavaScript 在組件的
data` 選項中聲明初始值。
v-model
在內部爲不一樣的輸入元素使用不一樣的屬性並拋出不一樣的事件:
text 和 textarea 元素使用 value
屬性和 input
事件;
checkbox 和 radio 使用 checked
屬性和 change
事件;
select 字段將 value
做爲 prop 並將 change
做爲事件