ES6-4/5 解構賦值、函數默認值、數組解構、對象解構

在這里插入圖片描述

ES-4 解構賦值、函數默認值、數組解構、對象解構
ES-5 隱式轉換、函數參數解構、解構本質、()用法

一 解構賦值

1 虛值

  • 含義:在Boolean轉換結果為假的值falsy

2 函數默認值

ES6 內部使用嚴格相等運算符(===),判斷一個位置是否有值。所以,只有當一個數組成員嚴格等于undefined,默認值才會生效。(默認值如果是函數,當非undefined的情況,函數不會執行,只有在用到的時候,才會求值。)

// es5寫法
function foo(x, y) {// x = x || 1;// y = y || 2;// 以上寫法,遇0出bug// 計算類型的,要取得正確結果,要考慮0的情況,應如下if (x !== 0) {x = x || 1;}if (y !== 0) {y = y || 1;}console.log(x + y);
}

以上計算,更人性化的寫法應當是將null也轉為0

// es6寫法 能計算正確結果
function foo(x = 1, y = 2) {console.log(x + y)
}
// 轉譯es5
"use strict";function foo() {var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;console.log(x + y);
}
// null的時候,涉及到隱式類型轉化Number(null)為0
let x = 1;
function foo(x = 2) {let x = 2; // 報錯// Identifier 'x' has already been declared.console.log(x)
}
foo()
let x = 1;
function foo(y = x) {console.log(y) // 1
}
foo()

不要和for循環的父子級作用域搞混了,函數形參和函數體屬于同一作用域。

在這里插入圖片描述

  • 現象
function foo(x = x) {console.log(x) // 無實參時報錯,TDZ 
}
foo()
let x = 1;
function foo(x = x) {console.log(x) // 無實參時報錯,2
}
foo(2)
// 不報錯!
function bar(x = 2, y = x) {return [x, y];
}
bar(); // [2, 2]

注意

var w = 1, z = 2;
function foo(x = w + 1, y = x + 1, z = z + 1) {// 報錯地方在z// Uncaught ReferenceError: Cannot access 'z' before initializationconsole.log(x, y, z)
}
foo()
  • 形參默認值 - 惰性求值,不緩存,每次都重新計算
let a = 99;
function foo(b = a + 1) {console.log(b)
}
foo() // 100
a = 100
foo() // 101

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

  • 在項目中的應用
    在這里插入圖片描述

3 數組解構

  • 模式匹配(結構化賦值)
  • 解構失敗時,結果為undefined
  • 不完全解構:提供的值比需要解構的變量多
  • 變量給默認值+解構
let [a = 6] = [1]
console.log(a) // 1
let [a = 6] = []
console.log(a) // 6
// 解構失敗,模式不匹配
let [a = 6] = {} // 報錯
// {} is not iterable
console.log(a)
let [a, b = 6] = [1, undefined]
console.log(a, b) // 1 6
let [a, b = 6] = [1, null]
console.log(a, b) // 1 null
let [a = 1, b = a] = []
console.log(a, b) // 1 1
let [a = 1, b = a] = [2]
console.log(a, b) // 2 2

4 對象解構

let firstName = 'Jessica';
let lastName = 'Jung';
let superIdol = {[firstName + lastName]: 'owner of e&b'
}
console.log(superIdol)

在這里插入圖片描述
在這里插入圖片描述

  • 解構語句的語法報錯:認為等號左邊是語法塊
    在這里插入圖片描述

  • ()變成表達式
    在這里插入圖片描述
    在這里插入圖片描述

  • 聲明變量時不要亂加括號

[(b)] = [3];
console.log(b); // 3
({a:(b) = {}}) // 本身沒有進行匹配,而是默認值
console.log(b); // {}
  • 變量值互換
let a = 1, b = 100;
[a, b] = [b, a]
console.log(a, b) // 100 1

在這里插入圖片描述

5. 解構本質

事實上,只要某種數據結構具有 Iterator 接口,都可以采用數組形式的解構賦值。

  • 變量的解構就是變量的賦值
  • 模式匹配可以匹配同源屬性
    在這里插入圖片描述
var x = 200, y = 300, z = 100;
var obj1 = {x: {y: 42},z: {y: z}
};
({ y: x = { y: y } } = obj1);// x = {y: y} → x = {y: 300}
({ z: y = { y: z } } = obj1);// y = {y: z} → y = {y: 100} 
({ x: z = { y: x } } = obj1);// z = {y: 42}console.log(x.y, y.y, z.y) // 300 100 42
function test([x, y]) { // 報錯// Uncaught TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))console.log(x, y) 
}
test()
function foo({ x = 10 } = {}, { y } = { y: 10 }) {console.log(x, y)
}
foo() // 10 10
foo({}, {}) // 10 undefined
foo({x: 2}, {y: 3}) // 2 3

注意

({ x = 10 } = {});
// ({ x: x = 10 } = {}); 以上是屬性和變量相同時的es6寫法
({ y } = { y: 10 });
// ({ y: y } = { y: 10 });
console.log(x, y); // 10 10

6 解構的隱式轉換

  • 字符串隱式轉換類數組
const [a, b, c, d, e] = 'hello'
console.log(a, b, c, d, e) // h e l l o
let {length: len} = 'hello'
console.log(len) // 5
  • 數字類型/布爾值隱式轉換為包裝類
    在這里插入圖片描述

解構賦值的規則是,只要等號右邊的值不是對象或數組,就先將其轉為對象。由于undefined和null無法轉為對象,所以對它們進行解構賦值,都會報錯。

7. 對函數length屬性的影響

  • 當函數形參給默認值時,從當前位置及之后都不計入length(形參個數)的計算
  • 也就是說,指定了默認值后,length屬性將失真。
  • 這是因為length屬性的含義是,該函數預期傳入的參數個數。某個參數指定默認值以后,預期傳入的參數個數就不包括這個參數了。同理,后文的 rest 參數也不會計入length屬性。
function test(a, b, c = 0) {
}
console.log(test.length) // 2
  • 如果設置了默認值的參數不是尾參數,那么length屬性也不再計入后面的參數了。
function test(c = 0, a, b) {
}
console.log(test.length) // 0
  • 形參實參的映射關系不再成立

8. 函數默認值與作用域

相當復雜的一系列例子

一旦設置了參數的默認值,函數進行聲明初始化時,參數會形成一個單獨的作用域(context)。等到初始化結束,這個作用域就會消失。這種語法行為,在不設置參數默認值時,是不會出現的。

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251033.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251033.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251033.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

springboot之session、cookie

1- 獲取session的方案 session: https://blog.csdn.net/yiifaa/article/details/77542208 2- session什么時候創建? 一個常見的誤解是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用HttpServletRequest.getSession(true)這樣…

echarts --- 多折線圖按段顯示顏色規則訂制

描述: 圖中有4個序列,序列1和序列2在同一個x軸下,顯示不同的顏色.(如,在-40到-30,序列一是紅色,而序列2是黑色) 關鍵: VisualMap中的seriesIndex屬性(根據不同的系列,制定不同的顏色規則). 下面是代碼,可以直接復制到 echart實例 中進行調試 var symbolSize 20; var data [[…

Git-分布式版本控制系統

一、版本控制 版本控制系統是記錄若干文件內容變化,以便將來查閱修訂特定版本或還原部分文件的系統 分為:集中式版本控制系統(svn)簡稱cvcs 都有一個單一集中管理服務器,保存所有文件修訂版本,開發人員通…

ES6-6 - this指向、箭頭函數基本形式、rest運算符

一 chrome斷點調試 觀察函數調用棧 // 25min var x 1; function foo(x, y function () { x 2; console.log(2) }) {var x 3;y();console.log(x) } foo() console.log(x) // 2 3 1var x 1; function foo(x, y function () { x 2; console.log(x) }) {x 3;y();console.…

【二分答案】Problem C:木材加工

Problem C:木材加工 Time Limit:1000MS Memory Limit:65536K Total Submit:48 Accepted:20 Description 【問題描述】 木材廠有一些原木,現在想把這些木頭切割成一些長度相同的小段木頭(木頭有可能有剩余),需要得到的小段的數目是…

vue --- vue.js實戰基礎篇課后練習

練習1:在輸入框聚焦時,增加對鍵盤上下鍵按鍵的支持,相當于加1和減1 練習2:增加一個控制步伐的prop-step,比如設置為10,點擊加號按鈕,一次增加10 思路: // 考慮到子模板的復用性,即在父模板中復用如下: <input-number v-model"value" :max"10" :min&qu…

js打字效果

//文字依次出來效果 $.fn.autotype function() {var $text $(this);// console.log(this, this);var str $text.html(); //返回被選 元素的內容var index 0;var x $text.html();//$text.html()和$(this).html()有區別var timer setInterval(function() {//substr(index, …

ES6-7 - 箭頭函數的實質、箭頭函數的使用場景

箭頭函數返回對象 // 這種情況要要用(),否則會將對象的{}解釋為塊 const fn (a, b) > ({a:1, b:2})箭頭函數的特點 this指向由外層函數的作用域來決定&#xff0c;它本身沒有this&#xff0c;不能通過call、apply、bind改變不能作為構造函數使用不可以使用arguments對象&…

mybatis比hibernate處理速度快的原因

mybatis:是面向結果集的。當要展示的頁面需要幾個字段時&#xff0c;springmvc會提供這幾個字段并將其拼接成結果集&#xff0c;在轉化為相應的對象。 hibernate&#xff1a;是面向對象的。要展示的頁面需要某些字段時&#xff0c;會將所有字段都查出來&#xff0c;在轉化為相應…

zabbix 從入門到精通

https://www.cnblogs.com/clsn/p/7885990.html 轉載于:https://www.cnblogs.com/learningJAVA/p/8376589.html

javasript --- 一個日期規范(x秒前,x分前...)

Time函數(通俗易懂,自己根據實際需求修改吧- -) // time.js var Time {// 獲取當前時間戳getUnix: function () {var date new Date();return date.getTime();},// 獲取今天0點0分0秒的時間戳getTodayUnix: function () {var date new Date();date.setHours(0);date.setMin…

ES6-8 - 函數名/對象拓展、描述符、getter/setter

函數名 有兩種特殊情況&#xff1a;bind方法創造的函數&#xff0c;name屬性返回bound加上原函數的名字&#xff1b;Function構造函數創造的函數&#xff0c;name屬性返回anonymous。 bind函數名 // 以bound開頭 function foo() { } const fnName foo.bind().name console.lo…

javascript --- 再識閉包

看下面一個例子: function zipCode(code, location) {let _code code;let _location location || ;return {code: function () {return _code;},location: function() {return _location;}} }再上述封閉的函數中,code的匿名函數根據作用域鏈可以訪問到外面的_code變量. con…

iframe.contentWindow介紹

一、在使用iframe的頁面&#xff0c;要操作這個iframe里面的DOM元素可以用&#xff1a; contentWindow、contentDocument(測試的時候chrome瀏覽器&#xff0c;要在服務器環境下) 1、先獲取iframe里面的window對象&#xff0c;再通過這個對象&#xff0c;獲取到里面的DOM元素 例…

ES6-9 對象密封4種方式、assign、取值函數的拷貝

一 對象密封 1 Object.preventExtensions 禁止對象拓展&#xff0c;仍可刪除 嚴格模式下報錯 const origin {a: 1 } const fixed Object.preventExtensions(origin) console.log(origin fixed) // true console.log(Object.isExtensible(origin)) // false 不可拓展 orig…

MySQL入門命令

我主要是在維護OpenStack云平臺的時候會涉及MySQL數據庫的操作&#xff0c;這里就跟大家分享一下常用的簡單命令&#xff0c;也為自己做個小練習。 1.登錄MySQL數據庫 mysql -h localhost -u root -p 123456 其中&#xff0c;-h&#xff1a;mysql服務器的IP地址或主機名&#x…

【模板】分塊

題意簡述 已知一個數列&#xff0c;你需要進行下面兩種操作&#xff1a; 1.將某區間每一個數加上x 2.求出某區間每一個數的和 題解思路 對于一個長度為n的序列&#xff0c;我們可以講其中的元素分為\( \sqrt{n} \) 個連續的子序列&#xff0c;每塊的長度自然就為\( \sqrt{n} \)…

javascript --- 使用ajax與服務器進行通信

Ajax: (Asynchronous JavaScript and XML,異步JavaScript與XML技術)是一種有效利用JavaScript和DOM的操作. 與傳統HTTP請求的區別: Ajax允許只更新頁面的一部分,因此減少了響應中傳輸的數據量 Ajax的API: Ajax與服務器進行通信,可以使用JavaScript中原生的XMLHttpRequest對象…

ES6-10 super、4種遍歷方式、原型、symbol遍歷

由于現代 JavaScript 引擎優化屬性訪問所帶來的特性的關系&#xff0c;更改對象的 [[Prototype]]即__proto__在各個瀏覽器和 JavaScript 引擎上都是一個很慢的操作。 一 Object原型方法 1 Object.setPrototypeOf(obj, proto) 用該方法而不是直接修改__proto__返回值是設置好原…

IntelliJ IDEA使用

1&#xff1a;下載 ideaIU-2017.2.exe&#xff0c;JetbrainsCrack-2.6.2.jar(補丁) 2&#xff1a;安裝ideaIU-2017.2.exe&#xff0c;將補丁放在D:\java\intellij\IntelliJ IDEA 2017.2\bin 目錄下 3&#xff1a;在安裝的idea下面的bin目錄下面有2個文件 &#xff1a; 一個是id…