傳統上,JavaScript只有indexOf方法,能夠用來肯定一個字符串是否包含在另外一個字符串中。ES6又提供了三種新方法。html
includes():返回布爾值,表示是否找到了參數字符串。
startsWith():返回布爾值,表示參數字符串是否在源字符串的頭部。
endsWith():返回布爾值,表示參數字符串是否在源字符串的尾部。app
repeat方法返回一個新字符串,表示將原字符串重複n次。函數
ES7推出了字符串補全長度的功能。若是某個字符串不夠指定長度,會在頭部或尾部補全。padStart用於頭部補全,padEnd用於尾部補全。this
傳統的JavaScript語言,輸出模板一般是這樣寫的。code
$("#result").append( "There are <b>" + basket.count + "</b> " + "items in your basket, " + "<em>" + basket.onSale + "</em> are on sale!" );
上面這種寫法至關繁瑣不方便,ES6引入了模板字符串解決這個問題。htm
$("#result").append(` There are <b>${basket.count}</b> items in your basket, <em>${basket.onSale}</em> are on sale! `);
模板字符串(template string)是加強版的字符串,用反引號(`)標識。它能夠看成普通字符串使用,也能夠用來定義多行字符串,或者在字符串中嵌入變量。對象
// 普通字符串 `In JavaScript '\n' is a line-feed.` // 多行字符串 `In JavaScript this is not legal.` console.log(`string text line 1 string text line 2`); // 字符串中嵌入變量 var name = "Bob", time = "today"; `Hello ${name}, how are you ${time}?`
上面代碼中的字符串,都是用反引號表示。若是在模板字符串中須要使用反引號,則前面要用反斜槓轉義。ip
var greeting = `\`Yo\` World!`;
若是使用模板字符串表示多行字符串,全部的空格和縮進都會被保留在輸出之中。字符串
$("#warning").html(` <h1>Watch out!</h1> <p>Unauthorized hockeying can result in penalties of up to ${maxPenalty} minutes.</p> `);
模板字符串中嵌入變量,須要將變量名寫在${}之中。get
function authorize(user, action) { if (!user.hasPrivilege(action)) { throw new Error( // 傳統寫法爲 // 'User ' // + user.name // + ' is not authorized to do ' // + action // + '.' `User ${user.name} is not authorized to do ${action}.`); } }
大括號內部能夠放入任意的JavaScript表達式,能夠進行運算,以及引用對象屬性。
var x = 1; var y = 2; `${x} + ${y} = ${x + y}` // "1 + 2 = 3" `${x} + ${y * 2} = ${x + y * 2}` // "1 + 4 = 5" var obj = {x: 1, y: 2}; `${obj.x + obj.y}` // 3
模板字符串之中還能調用函數。
function fn() { return "Hello World"; } `foo ${fn()} bar` // foo Hello World bar
若是大括號中的值不是字符串,將按照通常的規則轉爲字符串。好比,大括號中是一個對象,將默認調用對象的toString方法。
若是模板字符串中的變量沒有聲明,將報錯。
// 變量place沒有聲明 var msg = `Hello, ${place}`; // 報錯
因爲模板字符串的大括號內部,就是執行JavaScript代碼,所以若是大括號內部是一個字符串,將會原樣輸出。
`Hello ${'World'}` // "Hello World"
若是須要引用模板字符串自己,能夠像下面這樣寫。
// 寫法一 let str = 'return ' + '`Hello ${name}!`'; let func = new Function('name', str); func('Jack') // "Hello Jack!" // 寫法二 let str = '(name) => `Hello ${name}!`'; let func = eval.call(null, str); func('Jack') // "Hello Jack!"
ES6容許爲函數的參數設置默認值,即直接寫在參數定義的後面。
function log(x, y = 'World') { console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello
指定了默認值之後,函數的length屬性,將返回沒有指定默認值的參數個數。也就是說,指定了默認值後,length屬性將失真。
(function(a){}).length // 1 (function(a = 5){}).length // 0 (function(a, b, c = 5){}).length // 2
箭頭函數
ES6容許使用「箭頭」(=>)定義函數。
var f = v => v; 上面的箭頭函數等同於: var f = function(v) { return v; };
若是箭頭函數不須要參數或須要多個參數,就使用一個圓括號表明參數部分。
var f = () => 5; // 等同於 var f = function (){ return 5 }; var sum = (num1, num2) => num1 + num2; // 等同於 var sum = function(num1, num2) { return num1 + num2; };
若是箭頭函數的代碼塊部分多於一條語句,就要使用大括號將它們括起來,而且使用return語句返回。
var sum = (num1, num2) => { return num1 + num2; }
因爲大括號被解釋爲代碼塊,因此若是箭頭函數直接返回一個對象,必須在對象外面加上括號。
var getTempItem = id => ({ id: id, name: "Temp" });
箭頭函數能夠與變量解構結合使用。
const full = ({ first, last }) => first + ' ' + last; // 等同於 function full( person ){ return person.first + ' ' + person.last; }
箭頭函數使得表達更加簡潔。