ES6 基礎 -- 變量

ES6 基礎


1. ECMAScript 簡介

(1). ECMAScript 和 JavaScript 的關係

ECMAScript 是 JavaScript 的規範,JavaScript 是 ECMAScript 的一種實現。

(2). ES6 與 ECMAScript 2015 的關係

ES6 是一個泛指,含義是 ES5.1 版本以後的 JavaScript 的下一代標準,涵蓋了 ES2015、ES2016、ES2017等等。而 ES2015 則是正式名稱,特指2015年發佈的正式版本的語言標準。

(3)Babel轉碼器

安裝 babel

npm install --save-dev @babel/core
// -S \ -D 區分產品安裝依賴還是開發安裝依賴

TIPS

-S, --save: Package will appear in your dependencies.
-D | -P, --save-dev: Package will appear in your devDependencies.
-O, --save-optional: Package will appear in your optionalDependencies.

配置文件 .babelrc(用於設置轉碼規則和插件)
基本格式如下:

{
	"presets": [],
	"plugins": []
}

presets 字段設定轉碼規則,官方提供以下的規則集,你可以根據需要安裝。

// 最新轉碼規則
npm install --save-dev @babel/preset-env

// react 轉碼規則
npm install --save-dev @babel/preset-react

然後將這些規則加入 .babelrc

{
	"presets": [
		"@babel/env",
		"@babel/preset-react"
	],
	"plugins": []
}

命令行轉碼
Babel 提供命令行轉碼工具 @babel/cli,用於命令行轉碼。
安裝@babel/cli

npm install --save-dev @babel/cli

基本用法:

# 轉碼結果輸出到標準輸出
$ npx babel example.js

# 轉碼結果寫入一個文件
# --out-file 或 -o 參數指定輸出文件
$ npx babel example.js --out-file compiled.js
# 或者
$ npx babel example.js -o compiled.js

# 整個目錄轉碼
# --out-dir 或 -d 參數指定輸出目錄
$ npx babel src --out-dir lib
# 或者
$ npx babel src -d lib

# -s 參數生成source map文件
$ npx babel src -d lib -s

2. let 和 const 命令

(1)let 和 const 的共同點:

1)不會存在變量提升
2)會造成暫時性死區
3)不允許重複聲明

(2)let 的其它特點

let 爲 JavaScript 新增了塊級作用域

(3)const 的其它特點

const 聲明的是一個只讀的變量(const 一旦聲明變量,就必須立即初始化)。
const 實質上保證的是:變量所指向的那個內存地址的數據不得更改。(對於簡單數據類型而言,const 聲明的變量就是一個常量;當時對於複合數據類型而言,只是說指向對象的內存地址不變,卻不能保證具體的數據不發生改變)

(4)ES6 聲明變量的六種方法

var
function
let
const
class
import
後四種是 ES6 中新增的。

3. 變量的解構賦值

基本用法: 按照一定的模式,從數組和對象中提取值,對變量進行賦值。

(1)數組的解構賦值

let [a, b, c] = [1, 2, 3]; // a = 1, b = 2, c = 3

let [foo, [bar], baz] = [1, [2], 3];
// bar = 2, baz = 3

let [ , , third] = [1, 2, 3];
// third = 3;

let [x, , y] = [1, 2, 3];
// y = 3

let [head, ...tail] = [1, 2,  3, 4];
// tail = [2, 3, 4]

let [x, y, ...z] = ['a'];
// x = 'a', y = undefined, z = []
// 如果解構不成功,那麼變量的值就等於 undefined

對數組可進行對象解構賦值

let arr = [1, 2, 3];
let { 0: first, [arr.length - 1]: last } = arr;
// first = 1, last = 3

(2)對象的解構賦值

對象的解構賦值的規則與數組的類似,其中比較重要的一個不同點就是:數組的解構賦值與數組數據的次序關係密切;而對象的解構賦值則不是這樣的,變量的取值與對象的屬性名關係密切。如果變量名與對象某個屬性名相同,則被賦值對應的屬性值。

let { log, sin, cos } = Math;
// 對象的解構賦值,可以很方便地將對象的方法賦值給某個變量。

如果變量名與屬性名不一致,則要採取如下的語法:

let { foo: baz } = { bar: 1, foo: 2 };
// baz = 2
// foo: error: foo is not defined

(3)字符串的解構賦值

const [ a, b, c, d, e ] = 'hello';
// a = 'h', e = 'o'

let { length: len } = 'hello';
// len = 5

(4)數值和布爾值的解構賦值

解構賦值時,如果等號右邊是數值和布爾值,則會先轉爲對象。

let { toString: s } = 123;
s === Number.prototype.toString // true

let {toString: s} = true;
s === Boolean.prototype.toString // true

(5) 函數參數的解構賦值

function add([x, y]){
  return x + y;
}

add([1, 2]); // 3

(6)解構賦值中的默認值

無論是數組還是對象的解構賦值,只有當變量取值嚴格等於 undefined 時,默認值纔會被賦給變量

let [x = 1] = [];
// x = 1

let [x = 1] = [undefined];
// x = 1

let [x = 1] = [null];
// x = null

let [x = 1, y = x] = [];     // x=1; y=1
let [x = 1, y = x] = [2];    // x=2; y=2
let [x = 1, y = x] = [1, 2]; // x=1; y=2
let [x = y, y = 1] = [];     // ReferenceError: y is not defined

var {x = 3} = {};
// x = 3

var {x, y = 5} = {x: 1};
// x = 1
// y = 5

var {x: y = 3} = {};
// y = 3

var {x: y = 3} = {x: 5};
// y = 5

var { message: msg = 'Something went wrong' } = {};
// msg = "Something went wrong"

默認值生效的條件是,對象的屬性值嚴格等於undefined。
var {x = 3} = {x: undefined};
// x = 3

var {x = 3} = {x: null};
// x = null

(7)用途

1)交換變量的值
2)從函數返回多個值,可以很方便解構賦值給變量
3)提取 JSON 數據
4)函數參數的默認值
5)輸入模塊的指定方法

(8)其它說明

1)如果解構失敗,則變量的值爲 undefined
2)解構賦值的規則是,只要等號右邊的值不是對象或數組,就先將其轉爲對象。由於undefined和null無法轉爲對象,所以對它們進行解構賦值,都會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章