結構賦值的妙用

2021-10-23 13:31:26 字數 3563 閱讀 8395

解構賦值允許指定預設值。

let [foo = true] = ;

foo // true

let [x, y = 'b'] = ['a']; // x='a', y='b'

let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

注意,es6 內部使用嚴格相等運算子(===),判斷乙個位置是否有值。所以,只有當乙個陣列成員嚴格等於undefined,預設值才會生效。如:
let [x = 1] = [undefined];

x // 1

let [x = 1] = [null];

x // null

上面**中,如果乙個陣列成員是null,預設值就不會生效,因為null不嚴格等於undefined。

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

上面最後乙個表示式之所以會報錯,是因為x用y做預設值時,y還沒有宣告。

物件的解構與陣列有乙個重要的不同。陣列的元素是按次序排列的,變數的取值由它的位置決定;而物件的屬性沒有次序,變數必須與屬性同名,才能取到正確的值。

let  = ;

foo // "aaa"

bar // "bbb"

let = ;

baz // undefined

如果解構失敗,變數的值等於undefined。

物件的解構賦值,可以很方便地將現有物件的方法,賦值到某個變數。

let  = console;

log('hello')

//hello

//把console物件的log方法賦值給 變數log 注:'log'名需要相同

如果變數名與屬性名不一致,必須寫成下面這樣。

let  = ;

baz // "aaa"

let obj = ;

let = obj;

f // 'hello'

l // 'world'

這實際上說明,物件的解構賦值是下面形式的簡寫

let  = ;
也就是說,物件的解構賦值的內部機制,是先找到同名屬性,然後再賦給對應的變數。真正被賦值的是後者,而不是前者。

let  = ;

baz // "aaa"

foo // error: foo is not defined

let obj = {};

let arr = ;

( = );

obj //

arr // [true]

場景:把物件的值分別取出賦值

物件的解構也可以指定預設值。
var  = {};

x // 3

var = ;

x // 1

y // 5

var = {};

y // 3

var = ;

y // 5

var = {};

msg // "something went wrong"

預設值生效的條件與陣列結構賦值相同,物件的屬性值嚴格等於undefined。
var  = ;

x // 3

var = ;

x // null

null 為賦值為 空值

undefined 為 未定義

字串也可以解構賦值。這是因為此時,字串被轉換成了乙個類似陣列的物件。

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

a // "h"

b // "e"

c // "l"

d // "l"

e // "o"

let = 'hello';

len // 5

function a(a = 0,num = 9)

a(1);

let x = 1;

let y = 2;

[x, y] = [y, x];

再用原始方法進行陣列排序時,可以很方便讓前後兩位對換;

函式只能返回乙個值,如果要返回多個值,只能將它們放在陣列或物件裡返回。有了解構賦值,取出這些值就非常方便。

// 返回乙個陣列

function example()

let [a, b, c] = example();

// 返回乙個物件

function example() ;

}let = example();

解構賦值可以方便地將一組引數與變數名對應起來。

// 引數是一組有次序的值

function f([x, y, z])

f([1, 2, 3]);

// 引數是一組無次序的值

function f()

f();

解構賦值對提取 json 物件中的資料,尤其有用

let jsondata = ;

let = jsondata;

console.log(id, status, number);

// 42, "ok", [867, 5309]

jquery.ajax = function (url, ,

cache = true,

complete = function () {},

crossdomain = false,

global = true,

// ... more config

} = {}) ;

任何部署了 iterator 介面的物件,都可以用for…of迴圈遍歷。map 結構原生支援 iterator 介面,配合變數的解構賦值,獲取鍵名和鍵值就非常方便。

const map = new map();

map.set('first', 'hello');

map.set('second', 'world');

for (let [key, value] of map)

// first is hello

// second is world

載入模組時,往往需要指定輸入哪些方法。解構賦值使得輸入語句非常清晰。

const  = require("source-map");

//大多框架中引入的方法

do while false 結構的妙用

今天看原始碼的時候,發現某個框架的原始碼裡面經常出現如下片段 do while false 我對於do while false 結構的使用,在此之前無非兩種,第一種是基本用法,也就是把它當成迴圈結構使用,和for while 沒太大區別 還有一種用法是用在巨集定義中,如下所示 define larg...

結構體內部偏移的妙用

結構體內部偏移的妙用 華清遠見嵌入式學院講師。c語言中對結構體的處理是嚴格的按照定義順序來進行記憶體分布,所以我們可以利用這一點來十分方便地通過結構體內部的位址偏移來遍歷或賦值每乙個成員。下面用乙個程式的片段來說明這個問題 1.需求 程式的任務是從檔案中按照固定格式讀取學生的基本成績資訊並完成排序。...

js的結構賦值

var foo one two three var one,two,three foo console.log one one console.log two two console.log three three var a,b a,b 1,2 console.log a 1 console.lo...