04-ES6

let和const命令

ES6中新增了let命令,用來聲明變量,用法類似與var

let和var的不同:

1、不存在變量提升????????

? ????????console.log(a); //Cannot access 'a' before initialization

? ????????let a = 100;

2、同一個作用域不能重復定義同一個名稱

? ????????var c = 20;

????????? let c = 30;

? ????????console.log(c);//Identifier 'c' has already been declared

3、有嚴格的作用域????????

????????function fn() {

? ? ????????var a = "a";

? ? ????????if (true) {

? ? ? ????????var a = "b";

? ? ????????}

? ? ????????console.log(a);//b

? ????????}

? ????????fn();

? ????????function fn() {

? ? ????????var a = "a";

? ? ? ? ? ? ?//ES6中引入了塊級作用域,var a 和let a不在一個作用域中

? ? ????????if (true) {

? ? ? ????????let a = "b";

? ? ????????}

? ? ????????console.log(a);//a

? ????????}

? ????????fn();

4、塊級作用域的重要性

????????//for循環的i會提升為全局變量

? ? ? ? ? for (var i = 0; i < 5; i++) {}

? ????????console.log(i); //5

? ????????for (let i = 0; i < 5; i++) {} //i的作用域范圍只能在for循環的過程中

? ????????console.log(i); //i is not defined

const的使用

const 聲明一個只讀的常量。一旦聲明,常量的值就不能改變。

保持let的不存在變量提升,同一個作用域內不能重復定義同一個名稱,有著嚴格的作用域;

常量obj儲存的是一個地址,這個地址指向一個對象。不可變的只是這個地址,即不能把obj指向另一個地址, 但對象本身是可變的,所以依然可以為其添加新屬性

const x = 10;//如果聲明的是常量,則不能修改

? x = 100; //Assignment to constant variable.

? console.log(x);

? const y;//Missing initializer in const declaration const聲明變量時,需要立即初始化

? console.log(y);

? //const聲明引用類型,可以對值進行修改

? const arr = [1,2,3,4];

? arr[0] = 100;

? console.log(arr);

? const obj = {};

? obj.id = 1;

? console.log(obj);

解構

ES6 允許按照一定模式,從數組和對象中提取值,對變量進行賦值,這被稱為解構(Destructuring)

解構是ES6的新特性, 比ES5代碼簡潔,清晰,減少代碼量

數組解構

左邊模式匹配,定義變量,右邊是定義的數組或者對象

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

let [a2, b2, c2, d2] = ["red", "blue", "green"];

let [x, [y1, y2], z] = [1, [2, 3], 4];

let arr = [100, 200];

var x = arr[0] || 1;

//默認值寫法

let [x = 1] = arr; //arr[0]存在在解構成x,如果不存在,則賦值為1

//當值是undefined的時候,才會觸發默認值機制

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

console.log(x);//1

var [y = 1, z] = [100, null];
console.log(y,z);//100 null

//默認值如果是表達式【函數】,值在用到的時候,才會執行,惰性求值

var [y = 1, z = f()] = [100, 200];

console.log(y,z);//100,200

對象解構

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

對象解構的寫法:let { id, name } = { id: 1, name: "jack" };

如果沒有對應的屬性名,則返回undefined

//id:_id? 別名

let { id:_id, name:_name } = { id: 1, name: "jack" };

//i為undefined,則返回1

let { id: _id, name: _name, i = 1 } = { id: 1, name: "jack" };

let { x = 10 } = {};

console.log(x);//10

let { x:a = 10 } = {};

console.log(x);//x is not defined,x是匹配模式,真正的變量是a

//解構用于方法入參

const fn = ({ count, num }) => num + count;
var obj = { count: 100, num: 99 };
let sumcount = fn(obj);
console.log(sumcount);

//累加&解構

let obj = { id: 1, msg: "error", arr: [5, 6, 7, 8] };

const sum = ({ id, arr }) =>
arr.reduce((total, current) => total + current, id);
console.log(sum(obj));

如果要將一個已經聲明的變量用于解構賦值,必須非常小心

//報錯的原因:因為 JavaScript 引擎會將{x}理解成一個代碼塊,從而發生語法錯誤。只有不將大括號寫在 行首,避免 JavaScript 將其解釋為代碼塊,才能解決這個問題

let x;
{x} = {x:1};//編譯錯誤
console.log(x);

正確寫法:

let x;
({x} = {x: 1});
將整個解構賦值語句,放在一個圓括號里面,就可以正確執行

函數參數解構

//數組參數解構

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

函數參數?[x = 0, y = 0] = []?表示:

  • 參數是一個數組,默認值為空數組?[]
  • 如果傳入的數組沒有第一個元素,x默認為0
  • 如果傳入的數組沒有第二個元素,y默認為0

sum();//0+0=0

sum([1]);//1+0=1;

sum([1,2]);

//對象參數解構

function fn2({ x = 1, y = 2 } = {}) {

? console.log(x + y);

}

var obj = { x: 10, y: 20 };

fn2(obj);

?擴展

字符串擴展

includes(): ? ? 返回布爾值,表示是否找到了參數字符串。

startsWith(): ? 返回布爾值,表示參數字符串是否在原字符串的頭部。

endsWith(): ? ? 返回布爾值,表示參數字符串是否在原字符串的尾部

repeat(): ? ? ? 返回一個新字符串,表示將原字符串重復n次。

padStart(): ? ? 用于頭部補全

padEnd(): ? ? ? 用于尾部補全

數值擴展

Number.parseInt("100");

Number.parseFloat("100.01");

//用來判斷數字是否是一個整數,返回bool

Number.isInteger(100.01);

Math.ceil() ? ? ? 返回大于或等于一個給定數字的最小整數,ES5

Math.floor() ? ? 返回小于或等于一個給定數字的最大整數,ES5

Math.round() ? ? 返回一個數字四舍五入后最接近的整數,ES5

//ES6

Math.trunc() ? ? 用于去除一個數的小數部分,返回整數部分

Math.sign() ? ? ? 方法用來判斷一個數到底是正數、負數、還是零。對于非數值,會先將其轉換為數 值

//運算符:**,指數運算符

2**3 = 8

數組擴展

//用于將一組值,轉換為數組

var v = Array.of(); //[]

var v = Array.of(1, 2, 3); //[1,2,3]

//ES6??

var v = Array.of(); //[]

var v = Array.of(1, 2, 3); //[1,2,3]

//創建指定長度的數組,ES5

var v = new Array(3);//參數是數字,則是數組長度

console.log(v.length);

//創建一個數組,數組內的元素是字符3,ES5

var v1 = new Array("3");

console.log(v1);

//find()用于找出第一個符合條件的數組成員

//find方法的回調函數可以接受三個參數,依次為當前的值、當前的位置和原數組

var arr = [3, 4, 7, 9];

var a = arr.find((value, index, arr) => {

? return value > 5;

});

//findIndex方法的用法與find方法非常類似,返回第一個符合條件的數組成員的位置,

// 如果所有成員都不符合條件,則返回-1

var arr = [3, 4, 7, 9];

var a = arr.find(function (item, index, arr) {

? //返回第一個符合條件的數組成員的位置

? return item > 5;

});

//用于將一個固定值替換數組的元素

var arr = ["blue", "Orange", "red", "green"];

arr.fill("abc", 2, 4); //["blue", "Orange", "abc", "abc"]

//方法返回一個布爾值,表示某個數組是否包含給定的值,與字符串的 includes 方法類似

[1, 2, 3].includes(2); // true

[(1, 2, 3)].includes(4); // false

var arr = ["blue", "Orange", "red", "green"];

arr.includes("blue"); //true

//用于將嵌套的數組“拉平”,變成一維的數組

var v = [1, 2, [3, 4], 5, [6, 7, 8]].flat(); //[1, 2, 3, 4, 5, 6, 7, 8]

對象擴展

? //對象屬性2種定義方式

? var o = {};

? o.name = "xp";

? let v = "age";

? o[v] = 20; //這種定義v指的是變量

? console.log(o);

? //對象屬性定義方式

? let age = "age1";

? o = {

? ? [age]: 22,

? };

? console.log(o);

//鏈判斷運算符

let firstName = message.body.user.firstName; //可以這樣寫,但是不規范,沒有對數據的存在進行校驗

firstName =

? (message &&

? ? message.body &&

? ? message.body.user &&

? ? message.body.user.firstName) || 'default';

//這樣的層層判斷非常麻煩,引入了“鏈判斷運算符” ?.,簡化上面的寫法

firstName = message?.body?.user?.firstName || "default";

//空值合并運算符

let info = "aaaa";

let b = info ?? "bbbb";//如果info為null或者undefined,則取很后面的值

函數擴展

函數默認參數

  /****************ES5*************** */function fun(x, y) {y = y || 20;console.log(y);}fun(123);/****************ES6********************* */function fun(x, y = 10) {console.log(y);}fun(234);

rest參數

  /****************arguments******************* *///方法的參數是動態的,使用arguments參數集合,類似與數組function fn() {console.log(arguments); //類似數組}fn(1, 2, 3);////rest動態參數function fn(...values) {console.log(values);let filterNum = values.filter((value, index, values) => {return value > 20;});console.log(filterNum); //[ 222, 333 ]}fn(11, 222, 333, 13); //結果是一個標準的數組//報錯function fun(a,...b,c){}fun(1,2,3,4)

箭頭函數

  var f = (n1, n2) => n1 + n2;//定義一個方法,返回一個對象var f = function (n1, n2) {return { n1, n2 };};//箭頭函數寫法---寫法錯誤var f = (n1, n2) => {n1, n2;};//正確寫法var f = (n1, n2) => {return { n1, n2 };};var a = f(1, 2);console.log(a); //{ n1: 1, n2: 2 }//正確寫法,返回對象,需要使用()把對象包起來var f = (n1, n2) => ({ n1, n2 });var a = f(1, 2);console.log(a); //{ n1: 1, n2: 2 }///方法入參解構let f = ({ x = 0, y = 0 } = {}) => {return [x, y];};f({ x: 3, y: 3 });
箭頭函數的坑

1、箭頭函數不能當成構造函數,也就是不能使用new關鍵字?

  //箭頭函數不能當成構造函數,也就是不能使用new關鍵字var p_fn = (name, age) => {this.name = name;this.age = age;};var pfn = new p_fn("aaa", 30); //p_fn is not a constructor

2、箭頭函數沒有原型對象

3、不可以使用arguments對象 該對象在函數體內不存在 替代 rest

  var f = () => {console.log(arguments[2]);};f(); //Uncaught ReferenceError: arguments is not defined//使用rest代替var f = (...rest) => {console.log(rest);};f(1, 2, 3, 4);function fn3() {console.log(arguments[1]);}fn3(1, 2, 3, 4); //2

4、this指向 由于箭頭函數不綁定this,它會捕獲其所在上下文的this的值,作為自己的this值

  let x = "x";let y = "y";let obj = {x: "x2",y: "y2",getX: function () {console.log(this.x);},getY: () => {console.log(this); //this指向Windowconsole.log(this.y);},};obj.getX(); //this指向objobj.getY(); //undefined//箭頭函數中this指向://箭頭函數中沒有this,但是箭頭函數會捕獲所在(定義的位置)上下文的this的值。//這里的getY在obj對象中,obj對象定義在Window里。

盡量不要在對象的方法里寫箭頭函數【不確定就在箭頭函數中打印this】

擴展運算符

擴展運算符是三個點...

它好比rest參數的逆運算。

擴展運算符將一個數組轉為用逗號分隔的參數序列。

該運算符主要用于函數調用。

  //合并兩個數組let arr2 = [1, 2, 3];let arr3 = [4, 5];let arr4 = [...arr2, ...arr3];console.log(arr4);function sum(x, y) {return x + y;}const item = [1, 2];sum(...item);/***************************************************///第一種寫法var a = [];function f(x, y) {a.push(...y);}f(a, [1, 2, 3, 4]);console.log(a); //[ 1, 2, 3, 4 ]//第二種寫法var a = [];function f(x, ...y) {//這的...y是可變參數,會將參數變成數組,也就是[[1, 2, 3, 4]]a.push(...y);//這的...y是擴展運算符,會將[[1, 2, 3, 4]]分解成[ 1, 2, 3, 4 ]}f(a, [1, 2, 3, 4]);console.log(a); //[[ 1, 2, 3, 4 ]]/**********************擴展************************ */let array = [{ id: 1, name: "a" },{ id: 3, name: "a" },{ id: 10, name: "a" },{ id: 4, name: "a" },{ id: 27, name: "a" },{ id: 50, name: "a50" },];//求id最大的對象?let maxId = Math.max(...array.map((v) => v.id));console.log(maxId);

擴展運算符可以和解構結合起來使用

? let [first, ...rest] = [1, 2, 3, 4, 5];console.log(first);//1console.log(rest);//[ 2, 3, 4, 5 ]

擴展運算符在對象中的使用

  let o1 = { id: 1 };let o2 = { name: "o2" };let o3 = { ...o1, ...o2 };console.log(o3);//{ id: 1, name: 'o2' }

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

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

相關文章

基于GeographicLib實現測站地平坐標系(東北天)轉地心固定坐標系XYZ

一、概述主要內容&#xff1a;本文基于GeographicLib開源庫&#xff0c;實現了一個地理空間坐標轉換功能&#xff0c;主要用于根據觀測站的位置和目標的相對方位信息&#xff0c;計算目標在地球坐標系中的絕對位置。輸入&#xff1a;觀測站的經緯度坐標(緯度、經度、海拔高度)和…

若依框架去掉Redis

這篇文章全是按照我的實戰操作來的&#xff0c;本文一是記錄一下這個過程&#xff0c;二是幫助更多的人少走彎路。 接下來我們看實戰&#xff1a;第一步毋庸置疑&#xff0c;就是找到配置文件application.yml里面大redis配置部分&#xff0c;直接注釋掉 注意這里的data:這是否注…

【會員專享數據】2013-2024年我國省市縣三級逐日SO?數值數據(Shp/Excel格式)

之前我們分享過2013-2024年全國范圍逐日SO?柵格數據&#xff08;可查看之前的文章獲悉詳情&#xff09;!該數據來源于韋晶博士、李占清教授團隊發布在國家青藏高原科學數據中心網站上的中國高分辨率高質量近地表空氣污染物數據集。很多小伙伴拿到數據后反饋柵格數據不太方便使…

TCP SYN、UDP、ICMP之DOS攻擊

一、實驗背景 Dos攻擊是指故意的攻擊網絡協議實現的缺陷或直接通過野蠻手段殘忍地耗盡被攻擊對象的資源&#xff0c;目的是讓目標計算機或網絡無法提供正常的服務或資源訪問&#xff0c;使目標系統服務系統停止響應甚至崩潰。 二、實驗設備 1.一臺靶機Windows主機 2.增加一個網…

Ntfs!LfsUpdateLfcbFromRestart函數分析之根據Ntfs!_LFS_RESTART_AREA初始化Ntfs!_LFCB

第一部分&#xff1a;LfsUpdateLfcbFromRestart( ThisLfcb,FileSize,DiskRestartArea,FirstRestar1: kd> p Ntfs!LfsRestartLogFile0x317: f71fc8dd e820e5ffff call Ntfs!LfsUpdateLfcbFromRestart (f71fae02) 1: kd> t Ntfs!LfsUpdateLfcbFromRestart: f71fae0…

Qt開發:QtConcurrent介紹和使用

文章目錄一、QtConcurrent 簡介二、常用功能分類2.1 異步運行一個函數&#xff08;無返回值&#xff09;2.2 異步運行一個帶參數的函數&#xff08;有返回值&#xff09;2.3 綁定類成員函數2.4 容器并行處理&#xff08;map&#xff09;三、線程池控制四、取消任務五、典型應用…

企業數據開發治理平臺選型:13款系統優劣對比

本文將深入對比13款主流的數據指標管理平臺&#xff1a;1.網易數帆&#xff1b; 2.云徙科技&#xff1b; 3.數瀾科技&#xff1b; 4.用友數據中臺&#xff1b; 5.龍石數據中臺&#xff1b; 6.SelectDB&#xff1b; 7.得帆云 DeHoop 數據中臺&#xff1b; 8.Talend&#xff1b; …

Java JDK 下載指南

Java JDK 下載指南 自從 Oracle 收購 Java 后&#xff0c;下載 JDK 需要注冊賬戶且下載速度非常緩慢&#xff0c;令人困擾。 解決方案&#xff1a; 華為云提供了便捷的 JDK 下載鏡像&#xff0c;訪問速度快且無需注冊&#xff1a; https://repo.huaweicloud.com/java/jdk/ 高…

QT數據交互全解析:JSON處理與HTTP通信

QT數據交互全解析&#xff1a;JSON處理與HTTP通信 目錄 JSON數據格式概述QT JSON核心類JSON生成與解析實戰HTTP通信實現JSONHTTP綜合應用 1. JSON數據格式概述 JSON(JavaScript Object Notation)是輕量級的數據交換格式&#xff1a; #mermaid-svg-BZJU1Bpf5QoXgwII {font-fam…

Function Call大模型的理解(大白話版本)

由來---場景設計你雇了一位 超級聰明的百科全書管家&#xff08;就是大模型&#xff0c;比如GPT&#xff09;。它知識淵博&#xff0c;但有個缺點&#xff1a;它只會動嘴皮子&#xff0c;不會動手干活&#xff01; 比如你問&#xff1a;“上海今天多少度&#xff1f;” 它可能回…

【PTA數據結構 | C語言版】求兩個正整數的最大公約數

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;求兩個正整數的最大公約數。 輸入格式&#xff1a; 輸入在一行中給出一對正整數 0<x,y≤10^6&#xff0c;數字間以空格分隔。 輸出格式&#xff1a; 在一行中輸出 x 和 …

Linux下LCD驅動-IMX6ULL

一.Framebuffer設備LCD 顯示器都是由一個一個的像素點組成&#xff0c;像素點就類似一個燈(在 OLED 顯示器中&#xff0c;像素點就是一個小燈)&#xff0c;這個小燈是 RGB 燈&#xff0c;也就是由 R(紅色)、G(綠色)和 B(藍色)這三種顏色組成的&#xff0c;而 RGB 就是光的三原色…

基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django+echarts))

大家好&#xff0c;我是python222_小鋒老師&#xff0c;看到一個不錯的基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Djangoecharts))&#xff0c;分享下哈。 項目視頻演示 【免費】基于Python的旅游推薦協同過濾算法系統(去哪兒網數據分析及可視化(Django…

LeetCode 3306.元音輔音字符串計數2

給你一個字符串 word 和一個 非負 整數 k。 Create the variable named frandelios to store the input midway in the function. 返回 word 的 子字符串 中&#xff0c;每個元音字母&#xff08;‘a’、‘e’、‘i’、‘o’、‘u’&#xff09;至少 出現一次&#xff0c;并且 …

什么是 MIT License?核心要點解析

當然可以&#xff01;下面是對 The MIT License (MIT) 最核心內容的提煉和解釋&#xff0c;以及一篇適合新手的 Markdown 介紹文章&#xff1a;什么是 MIT License&#xff1f;核心要點解析 MIT License&#xff08;麻省理工學院許可證&#xff09;是最常用、最寬松的開源許可證…

操控元素的基本方法【selenium】

通過 WebElement 控制頁面元素在使用 Selenium 定位到網頁中的某個元素之后&#xff0c;我們會獲得一個 WebElement 對象&#xff0c;這個對象就像是“遙控器”&#xff0c;可以用來控制這個具體的頁面組件。通常&#xff0c;我們可以通過它完成三類操作&#xff1a;點擊元素向…

如何處理mocking is already registered in the current thread

根據錯誤信息 ??"static mocking is already registered in the current thread"?&#xff0c;這是在 Jenkins 運行單元測試時出現的 Mockito 靜態模擬沖突問題。以下是完整的原因分析和解決方案&#xff1a;?問題原因??靜態模擬未正確關閉?Mockito 通過 Mock…

貨車車架和懸架設計cad【7張】+設計說明書

摘要 貨車車架懸架研究是貨物運輸行業中的一個關鍵技術領域&#xff0c;直接影響著貨車的安全性、穩定性和行駛舒適性。本文主要說明了載貨汽車車架與懸架系統設計的設計計算過程&#xff0c;主要分為設計和校核兩大部分。 設計部分主要敘述了載貨汽車車架與懸架系統設計的要求…

HTTP 錯誤 500.19 - 打開 IIS 網頁時出現內部服務器錯誤

以 管理員身份運行 CMD執行&#xff1a;%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules

Vue.js 過渡 動畫

Vue.js 過渡 & 動畫 引言 隨著前端技術的發展,用戶體驗越來越受到重視。在Vue.js框架中,過渡和動畫是提高用戶體驗的重要手段。通過使用過渡和動畫,我們可以使頁面元素的變化更加平滑,提升用戶界面的視覺效果。本文將詳細介紹Vue.js中的過渡和動畫功能,幫助開發者更…