ES6
简介
- ES6 是 ECMA 为 JavaScript 制定的第 6 个标准版本
- ECMAscript 2015 是在 2015 年 6 月发布 ES6 的第一个版本。以此类推,ECMAscript 2016 是 ES6 的第二个版本, 也叫 ES7、ES2016。
- ES6 是一个泛指,含义是 5.1 版本以后的 JavaScript 下一代标准。
let 和 const
let
用来声明变量,只在let
命令所在的代码块内有效,即块级作用域。不存在变量提升,不允许重复声明
function varTest() {
var a = 1;
if (true) {
var a = 2;
console.log(a); // 2
}
console.log(a); // 2
}
function letTest() {
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 1;
// let b = 2; // SyntaxError: Identifier 'b' has already been declared
if (true) {
let b = 2;
console.log(b); // 2
}
console.log(b); // 1
}
在letTest()
的 if 语句中,可以再次声明变量 b,是因为变量 b 只在这个 if 语句中有效。如果在 if 语句中使用var
声明变量 b,会报错。
let 很适合在 for 循环时声明索引变量
暂时性死区:在使用 let 或 const 声明变量之前,该变量都不可用
{
console.log(a); // ReferenceError: Cannot access 'a' before initialization
let a = 1;
}
const
const
声明一个只读的常量,必须初始化赋值。一旦声明,常量的值就不能改变,只在声明所在的块级作用域内有效。
不 存在变量提升,不允许重复声明。复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改
const a = '123';
a = '234'; // TypeError: Assignment to constant letiable
const arr = [1, 2, 3];
arr.push(4);
console.log(arr); // [1,2,3,4]
arr = [];
console.log(arr); // 改变数组的指向会出错 Uncaught TypeError: Assignment to constant letiable
注意
let 和 const 声明的全局变量不属于顶层对象的属性,只存在于块级作用域中
let a = 1;
const b = 2;
console.log(window.a); // undefined
console.log(window.b); // undefined
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/133
var
var 声明的变量是全局变量,在函数中声明属于局部变量
var a = 1;
function fn() {
var a = 2;
}
fn();
console.log(a); // 1
在函数中不使用 var,该变量是全局的
var a = 1;
function fn() {
a = 2;
}
fn();
console.log(a); // 2
var 声明变量存在变量提升
console.log(a); // undefined
var a = 1;
// 在编辑阶段,变成如下形式:
var a;
console.log(a);
a = 1;
可以重复声明变量,后面的会覆盖前面的
var b = 1;
var b = 2;
console.log(b); // 2
模板字符串
模板字符串是增强版的字符串,用反引号\
标识,嵌入的变量名写在${}
之中。
基础使用
- 基本的字符串格式化
const name = 'world';
// ES5
console.log('hello' + name);
// ES6
console.log(`hello${name}`);
- 多行字符串拼接
let say = `<div>
<p>hello, world</p>
</div>`;
标记模版
标记模版(Tagged templates),使用函数解析模版文字。标签函数的第一个参数是一个字符串值数组,其余参数和表达式相关。
在 React 项目中,常用CSS in JS
方案管理样式,如Emotion、Styled-components。它们使用了标记模版,常见写法:
const Button = styled.button`
background: transparent;
border-radius: 3px;
border: 2px solid #bf4f74;
color: #bf4f74;
margin: 0 1em;
padding: 0.25em 1em;
`;
示例:
function myTag(strings, personExp, ageExp) {
console.log('strings', strings); // [ 'That ', ' is a ', '.' ]
const str0 = strings[0];
const str1 = strings[1];
const str2 = strings[2];
const ageStr = ageExp < 100 ? 'youngster' : 'centenarian';
return `${str0}${personExp}${str1}${ageStr}${str2}`;
}
const person = 'Tom';
const age = 28;
const output = myTag`That ${person} is a ${age}.`;
console.log(output); // That Tom is a youngster.