传统上,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; }
箭头函数使得表达更加简洁。