解構賦值混淆

本章只是個人的一個筆記,邊看邊記錄,怕自己混淆,特意記錄下的隨筆,如果有不一樣的見解,歡迎指點。
一、解構賦值只是數組和對象?


let a,b,c = 1,'hello',undefined
//Uncaught SyntaxError: Unexpected string

但是,我們可以這樣

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

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

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

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

如果對數值布爾型有疑惑可以看下

let ao = Number(124).toString();
console.log(ao); //"124"

let ab = Number(124).toString;
console.log(ab); //? toString() { [native code] }

函數

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

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

注意看下面兩組

function move({x = 0, y = 0} = {}) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]
function move({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]

第一組{x = 0, y = 0} = {}是為函數move的參數指定默認值。
第二組{x, y} = { x: 0, y: 0 }被視為一個對象,如下

function move () {
  var _ref = arguments.length > 0 && arguments[0] !== undefined 
             ? arguments[0] 
             :{x:0, y:0},
             x = _ref.x,
             y=_ref.y;
  return [x, y];
}

二、在數組解構賦值過程中容易混淆的部分

正常情況下,我們一般這樣用

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

默認值

let [foo = true] = [];
foo // true

undefined

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

可以看到y的解構賦值是undefined,也就是解構賦值失敗,所以依然保持默認值'b'

三、在對象解構賦值過程中容易混淆的部分

正常的用法

let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"

當變量名與屬性名不一致時

let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"

大括號不要當一行中的第一位

// 錯誤的寫法
let x;
{x} = {x: 1};
// SyntaxError: syntax error

這種情況{x}會被JavaScript引擎認為是一個代碼塊

// 正確的寫法
let x;
({x} = {x: 1});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執行單位為行(line),也就是一...
    悟名先生閱讀 4,195評論 0 13
  • 1.數組的解構賦值 2.對象的解構賦值 3.字符串的解構賦值 4.數值和布爾值的解構賦值 5.函數參數的解構賦值 ...
    卞卞村長L閱讀 919評論 0 0
  • 基本用法 ES6 允許按照一定模式,從數組和對象中提取值,對變量進行賦值,這被稱為解構(Destructuring...
    嘉奇呦_nice閱讀 791評論 0 2
  • 本文通過學習阮一峰的博客,外加自己的理解,整理了一下我對js變量的解構賦值的理解。 數組的解構賦值 對象的解構賦值...
    宋樂怡閱讀 489評論 0 2
  • 裁決之地-經典復古掛機手游 單機傳世私服游戲 無兄弟,不傳奇!《裁決之地》復刻經典玩法,還原自由PK爆裝,再現屠龍...
    erkai_e388閱讀 370評論 0 0