let character = { firstName: 'Snow', lastName: 'Jon', age: '20' };
let message = `The character '${character.firstName}${character.lastName}' is ${character.age} years old.`; console.log(message); //The character 'Snow Jon' is 20 years old.
3. 变量声明:let 和 const
let:
建议将 var 替换为 let,let 不可以重新声明;var 声明的变量作用域为包围它的函数,而 let 声明的变量作用域仅在它所在的块中。除此之外,let 的操作与 var 完全相同:
1 2 3 4 5
var msg = 'Howdy'; var msg = 'Hello there'; //acceptable, just reassigns
let message = `This is your message.`; let message = `This is another message.`; //ERROR!
const:
使用 const 声明的变量绝对不能修改:
1 2
const message = `This is your message.`; message = `This is your second message.`; //ERROR
/* 函数调用中的展开运算符 */ functionprintPerson(first, last, age) { console.log(first, last, age); } let args = ['Jon', 'Snow', 20]; printPerson(...args); //Jon Snow 20
注意:不同于剩余参数,展开运算符是在调用点上使用,而不是在函数定义中使用。
2. 函数语法和语义
箭头函数:
箭头函数不能直接取代函数关键字。一般而言,应该继续使用 function 定义方法(即与一个对象实例关联的函数)。为与对象无关的场景保留箭头函数,比如 Array.forEach 或 Array.map 调用的主体。因为箭头函数对待 this 的方式与普通函数不同,所以在方法定义中使用它们可能导致意料之外的结果。
从 ES6 开始,可以使用所谓的粗箭头(与细箭头相对)创建函数字面量,就像这样:
1 2 3 4 5 6 7 8
/* Before */ let names = ['Jon', 'Arya', 'Brandon']; names.forEach(n =>console.log(n)); /* * Jon * Arya * Brandon * */
let displayThis = function() { for (let m inthis) { console.log(m); } }; displayThis(); // this == global object let bob = { firstName: 'Bob', lastName: 'Robertson', displayMe: displayThis }; bob.displayMe(); // this == bob
箭头函数在定义函数时使用 this 值,而不是在执行它时。
采用规则: 完全理解新 this 规则可能需要一段时间。新箭头函数规则并不总是这么直观。作为开发人员,可以对 “内联” 函数使用箭头函数,对方法使用传统函数。这么做,各个方面都会按预期工作。
writeArticle() { console.log(this.firstName, 'just wrote an article on', this.subject); } } let mark = new Author('Mark', 'Richards', 55, 'Architecture'); mark.writeArticle(); //Mark just wrote an article on Architecture
使用 Symbol 函数创建 Symbol 的实例。然后,每个实例可在关注的对象上用作名称。如果有人尝试 使用正常的基于 String 的名称(比如 firstName)访问该字段,将会获得 undefined, 因为数据不再位于该名称下。根据新规范,JavaScript 在标准对象迭代期间甚至不会显示基于 Symbol 的名称。任何尝试使用跨该对象的传统反射的行为都将失败。 如果调用者拥有 firstName 的 Symbol 实例,依然可以访问到该字段的数据。
Symbol 的主要功能是帮助程序员避免库之间的名称冲突:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
let fibonacci = { [Symbol.iterator]: function*() { let pre = 0, cur = 1; for (;;) { let temp = pre; pre = cur; cur += temp; yield cur; } } };
for (let n of fibonacci) { // truncate the sequence at 1000 if (n > 1000) break; console.log(n); }