日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

這些強大的 JS 操作符,你都知道嗎?

來源: 責編: 時間:2024-03-26 17:41:16 220觀看
導讀大家好,我是 CUGGZ。JavaScript 為我們提供了很多操作符,用于操作表達式。下面就來盤點一下 JavaScript 中那些強大的操作符!一、一元操作符操作符可以根據他們期待的操作符個數來分類,多數的JavaScript操作符都是二元操

TMb28資訊網——每日最新資訊28at.com

大家好,我是 CUGGZ。TMb28資訊網——每日最新資訊28at.com

JavaScript 為我們提供了很多操作符,用于操作表達式。下面就來盤點一下 JavaScript 中那些強大的操作符!TMb28資訊網——每日最新資訊28at.com

TMb28資訊網——每日最新資訊28at.com

一、一元操作符

操作符可以根據他們期待的操作符個數來分類,多數的JavaScript操作符都是二元操作符,二元操作符可以將兩個表達式合成一個更復雜的表達式。JavaScript也支持一元操作符,這些操作符可以將一個表達式轉化為另一個更復雜的表達式。同時,JavaScript中也有一個三元操作符,就是條件操作符(?:),它用于將三個表達式組成一個表達式。下面就先來看看一元操作符。TMb28資訊網——每日最新資訊28at.com

一元操作符具有以下特點:TMb28資訊網——每日最新資訊28at.com

  • 最簡單的操作符,用來操作一個表達式;
  • 具有高優先級和右結合性;
  • 在必要時將操作數自動轉化為數值。

1. 遞增和遞減操作符(++ --)

遞增操作符顧名思義就是遞增其操作數,遞減操作符就是遞減其操作數。它們都有兩個版本:TMb28資訊網——每日最新資訊28at.com

  • 前綴版(++i):操作符位于變量的前面,表示先遞增(遞減),后執行語句;
  • 后綴版(i++):操作符位于變量的后面,表示先執行語句,后遞增(遞減);

簡單看兩個例子:TMb28資訊網——每日最新資訊28at.com

// 前置遞增操作符:let num1 = 1, num2 = 2;console.log(++num1 + num2) // 4// 后置遞增操作符:let num1 = 1, num2 = 2;console.log(num1++ + num2) // 3

可以看到,兩種類型的結果是不一樣的,原因就在于后置遞增遞減操作是在包含它們的語句被求值之后才執行的。TMb28資訊網——每日最新資訊28at.com

這四個操作符可以作用于任何類型的數據。對于這些類型,JavaScript會將他們轉化為數值,再在這個數值上進行加一或減一操作。如果不能轉化為一個數字,那么遞增或遞減的結果就是NaN:TMb28資訊網——每日最新資訊28at.com

let str = "hello";console.log(str++)  // NaN

遞增和遞減操作符主要用于for循環中控制計算器遞增或遞減。TMb28資訊網——每日最新資訊28at.com

2. 加和減操作符

加和減操作符既是一元操作符,也是二元操作符。這里我們先來看一元加和減操作符。TMb28資訊網——每日最新資訊28at.com

(1)一元加運算符(+)

一元加操作符會將其操作數轉化為數值,并返回轉化后的值。需要注意:TMb28資訊網——每日最新資訊28at.com

  • 如果操作數是數值,那它什么都不做;
  • 如果操作數不能轉化為數值,那么會返回NaN;
  • 由于BigInt值不能轉化為數值,因此這個操作符不能用于BigInt。
let a = -1;let b = "hello";let c = BigInt;console.log(+a)  // -1console.log(+b)  // NaNconsole.log(+c)  // NaN

(2)一元減運算符(-)

一元減操作符和一元加操作符類似,會先將操作數轉化為數值,然后會改變結果的符號:TMb28資訊網——每日最新資訊28at.com

let a = -1;let b = 2;console.log(-a)  // 1console.log(-b)  // -2

一元加和減操作符主要用于基本的算術運算,也可以用于數據類型的轉換,將不同類型的數據轉化為數字類型,像Number()方法一樣。TMb28資訊網——每日最新資訊28at.com

二、位操作符

現代計算機中數據都是以二進制的形式存儲的,即0、1兩種狀態,計算機對二進制數據進行的運算加減乘除等都是叫位運算,即將符號位共同參與運算的運算。TMb28資訊網——每日最新資訊28at.com

JavaScript中所有的數字都是以IEEE 754 64位格式存儲,但是位操作并不直接應用到64位,而是先將值轉化為32位整數,再進行位操作。之后再把運算結果轉化為64位,所以我們只需要考慮32位整數即可。位操作是在數值的底層完成的,所以運算速度會相對于其他運算符快很多。TMb28資訊網——每日最新資訊28at.com

常見的位運算有以下幾種:TMb28資訊網——每日最新資訊28at.com

運算符TMb28資訊網——每日最新資訊28at.com

描述TMb28資訊網——每日最新資訊28at.com

運算規則TMb28資訊網——每日最新資訊28at.com

&`TMb28資訊網——每日最新資訊28at.com

TMb28資訊網——每日最新資訊28at.com

兩個位都為1時,結果才為1TMb28資訊網——每日最新資訊28at.com

|TMb28資訊網——每日最新資訊28at.com

TMb28資訊網——每日最新資訊28at.com

兩個位都為0時,結果才為0TMb28資訊網——每日最新資訊28at.com

^TMb28資訊網——每日最新資訊28at.com

異或TMb28資訊網——每日最新資訊28at.com

兩個位相同為0,相異為1TMb28資訊網——每日最新資訊28at.com

~TMb28資訊網——每日最新資訊28at.com

取反TMb28資訊網——每日最新資訊28at.com

0變1,1變0TMb28資訊網——每日最新資訊28at.com

<<TMb28資訊網——每日最新資訊28at.com

左移TMb28資訊網——每日最新資訊28at.com

各二進制位全部左移若干位,高位丟棄,低位補0TMb28資訊網——每日最新資訊28at.com

>>TMb28資訊網——每日最新資訊28at.com

右移TMb28資訊網——每日最新資訊28at.com

各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄TMb28資訊網——每日最新資訊28at.com

在說這些操作符之前,先來看幾個相關的概念。計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。三種表示方法均有符號位和數值位兩部分,符號位都是用0表示“正”,用1表示“負”,而數值位,三種表示方法各不相同。TMb28資訊網——每日最新資訊28at.com

(1)原碼

原碼就是一個數的二進制數。例如:10的原碼為0000 1010TMb28資訊網——每日最新資訊28at.com

(2)反碼

  • 正數的反碼與原碼相同,如:10    反碼為 0000 1010
  • 負數的反碼為除符號位,按位取反,即0變1,1變0。

例如,-10的反碼如下:TMb28資訊網——每日最新資訊28at.com

原碼:1000 1010反碼:1111 0101

(3)補碼

  • 正數的補碼與原碼相同,如:10    補碼為 0000 1010
  • 負數的補碼是原碼除符號位外的所有位取反即0變1,1變0,然后加1,也就是反碼加1。

例如,-10的補碼如下:TMb28資訊網——每日最新資訊28at.com

原碼:1000 1010反碼:1111 0101補碼:1111 0110

1. 按位與操作符(&)

按位與操作符(&)會對參加運算的兩個數據按二進制位進行與運算,即兩位同時為 1 時,結果才為1,否則結果為0。運算規則如下:TMb28資訊網——每日最新資訊28at.com

0 & 0 = 0  0 & 1 = 0  1 & 0 = 0  1 & 1 = 1

例如,3 & 5 的運算結果如下:TMb28資訊網——每日最新資訊28at.com

0000 0011    0000 0101  = 0000 0001

因此 3 & 5 的值為 1。需要注意:負數按補碼形式參加按位與運算。TMb28資訊網——每日最新資訊28at.com

用途:TMb28資訊網——每日最新資訊28at.com

(1)判斷奇偶

只要根據最未位是0還是1來決定,為0就是偶數,為1就是奇數。因此可以用if ((i & 1) === 0)代替if (i % 2 === 0)來判斷a是不是偶數。TMb28資訊網——每日最新資訊28at.com

(2)清零

如果想將一個單元清零,即使其全部二進制位為0,只要與一個各位都為零的數值相與,結果為零。TMb28資訊網——每日最新資訊28at.com

2. 按位或操作符(|)

按位或操作符(|)會對參加運算的兩個對象按二進制位進行或運算,即參加運算的兩個對象只要有一個為1,其值為1。運算規則如下:TMb28資訊網——每日最新資訊28at.com

0 | 0 = 00 | 1 = 1  1 | 0 = 1  1 | 1 = 1

例如,3 | 5 的運算結果如下:TMb28資訊網——每日最新資訊28at.com

0000 0011  0000 0101 = 0000 0111

因此,3 | 5的值為7。需要注意:負數按補碼形式參加按位或運算。TMb28資訊網——每日最新資訊28at.com

3. 按位非操作符 (~)

按位非操作符 (~)會對參加運算的一個數據按二進制進行取反運算。即將0變成1,1變成0。運算規則如下:TMb28資訊網——每日最新資訊28at.com

~ 1 = 0~ 0 = 1

例如:~6 的運算結果如下:TMb28資訊網——每日最新資訊28at.com

0000 0110= 1111 1001

在計算機中,正數用原碼表示,負數使用補碼存儲,首先看最高位,最高位1表示負數,0表示正數。此計算機二進制碼為負數,最高位為符號位。TMb28資訊網——每日最新資訊28at.com

當按位取反為負數時,就直接取其補碼,變為十進制:TMb28資訊網——每日最新資訊28at.com

0000 0110   = 1111 1001反碼:1000 0110補碼:1000 0111

因此,~6的值為-7。按位非的操作結果實際上是對數值進行取反并減1,TMb28資訊網——每日最新資訊28at.com

4. 按位異或運算符(^)

按位異或運算符(^)會對參加運算的兩個數據按二進制位進行“異或”運算,即如果兩個相應位相同則為0,相異則為1。運算規則如下:TMb28資訊網——每日最新資訊28at.com

0 ^ 0 = 0  0 ^ 1 = 1  1 ^ 0 = 1  1 ^ 1 = 0

例如, 3 ^ 5的運算結果如下:TMb28資訊網——每日最新資訊28at.com

0000 0011  0000 0101 = 0000 0110

因此,3^5的值為6。TMb28資訊網——每日最新資訊28at.com

異或運算具有以下性質:TMb28資訊網——每日最新資訊28at.com

  • 交換律:(a^b)^c == a^(b^c)
  • 結合律:(a + b)^c == a^b + b^c
  • 對于任何數x,都有 x^x=0,x^0=x
  • 自反性: a^b^b=a^0=a;

5. 左移操作符(<<)

左移操作符(<<)會將運算對象的各二進制位全部左移若干位,左邊的二進制位丟棄,右邊補0。若左移時舍棄的高位不包含1,則每左移一位,相當于該數乘以2。TMb28資訊網——每日最新資訊28at.com

例如:TMb28資訊網——每日最新資訊28at.com

a = 1010 1110a = a << 2

這里將a的二進制位左移2位、右補0,即得 a = 1011 1000。TMb28資訊網——每日最新資訊28at.com

需要注意,左移會保留他所操作數值的符號。比如,將-2左移5位,會得到-64,而不是64。TMb28資訊網——每日最新資訊28at.com

6. 右移運算符

(1)有符號右移操作符(>>)

有符號右移操作符(>>)會將數值的32位全部右移若干位(同時會保留正負號)。正數左補0,負數左補1,右邊丟棄。操作數每右移一位,相當于該數除以2。TMb28資訊網——每日最新資訊28at.com

例如:a = a >>2 就是將a的二進制位右移2位,左補0 或者 左補1得看被移數是正還是負。TMb28資訊網——每日最新資訊28at.com

(2)無符號右移操作符(>>>)

無符號右移操作符(>>>)會將數值的32位全部右移。對于正數,有符號右移操作符和無符號右移操作符的結果是一樣的。對于負數的操作,兩者就會有較大的差異。TMb28資訊網——每日最新資訊28at.com

無符號右移操作符將負數的二進制表示當成正數的二進制表示來處理。所以,對負數進行無符號右移操作之后就會變的特別大。TMb28資訊網——每日最新資訊28at.com

三、加減乘除操作符

1. 加法操作符(+)

這里說的加法操作符就是二元的加操作符了。二元加操作符用于計算數值操作或者拼接字符串操作。TMb28資訊網——每日最新資訊28at.com

1 + 1             // 2"1" + "2"         // "12""hello" + "world" // "helloworld"

在進行加操作時,如果兩個操作數都是數值或者都是字符串,那么執行結果就分別是計算出來的數值和拼接好的字符串。除此之外,執行結果都取決于類型轉化的結果:它會優先進行字符串拼接,只有操作數是字符串或者是可以轉化為字符串的對象,另一個操作數也會被轉化為字符串,并執行拼接操作。只有任何操作數都不是字符串時才會執行加法操作。TMb28資訊網——每日最新資訊28at.com

1 + 2             // 3"1" + "2"         // "12""1" + 2           // "12"1 + {}            // "1[object Object]"true + false      // 1  布爾值會先轉為數字,再進行運算1 + null          // 1 null會轉化為0,再進行計算1 + undefined     // NaN undefined轉化為數字是NaN

需要注意加操作的順序:TMb28資訊網——每日最新資訊28at.com

let a = 1;let b = 2;let c = "hello" + a + b;  // "hello12"

這里,由于每次加法操作都是獨立完成的,第一次是字符串hello和數字a做加法操作,得到的結果是"hello1",第二次加法操作仍然是一個字符串加一個數字,所以最終結果是一個字符串。如果想讓a和b兩個數字相加,就需要加上括號。TMb28資訊網——每日最新資訊28at.com

除此之外,還需要注意以下特殊情況:TMb28資訊網——每日最新資訊28at.com

  • 如果有一個操作數是NaN,則結果是NaN;
  • 如果是Infinity加Infinity,則結果是Infinity;
  • 如果是-Infinity加-Infinity,則結果是-Infinity;
  • 如果是Infinity加-Infinity,則結果是NaN;
  • 如果是+0加+0,則結果是+0;
  • 如果是-0加-0,則結果是-0;
  • 如果是+0加-0,則結果是+0。

2. 減法操作符(-)

減法操作和加法操作符類似, 但是減法操作符只能用于數值的計算,不能用于字符串的拼接。當進行減法操作時,如果兩個操作數都是數值,就會直接進行減法操作,如果有一個操作數是非數值,就會將其轉化為數值,再進行減法操作。如果轉化結果為NaN,則運算結果也是NaN。TMb28資訊網——每日最新資訊28at.com

3 - 1      // 23 - true   // 23 - ""     // 33 - null   // 3NaN - 1    // NaN

需要注意以下特殊情況:TMb28資訊網——每日最新資訊28at.com

  1. 如果是Infinity減Infinity,則結果是NaN;
  2. 如果是-Infinity減-Infinity,則結果是NaN;
  3. 如果是Infinity減-Infinity,則結果是Infinity;
  4. 如果是-Infinity減Infinity,則結果是-Infinity;
  5. 如果是+0減+0,則結果是+0;
  6. 如果是-0減+0,則結果是-0;
  7. 如果是-0減-0,則結果是+0。

3. 乘法操作符(*)

乘法操作符用于計算兩個數的乘積。如果兩個操作數都是數值,則會執行常規的乘法運算。如果不是數值,會將其轉化為數值,在進行乘法操作。TMb28資訊網——每日最新資訊28at.com

需要注意以下特殊情況:TMb28資訊網——每日最新資訊28at.com

  • 如果有一個操作數是NaN,則結果是NaN;
  • 如果Infinity與0相乘,則結果是NaN;
  • 如果Infinity與非0數值相乘,則結果是Infinity或-Infinity,取決于有符號操作數的符號;
  • 如果Infinity與Infinity相乘,則結果是Infinity。

4. 除法操作符(/)

除法操作符用于計算一個操作數除以第二個操作數的商。如果兩個操作數都是數值,則會執行常規的除法運算。如果不是數值,會將其轉化為數值,在進行除法操作。TMb28資訊網——每日最新資訊28at.com

需要注意以下特殊情況:TMb28資訊網——每日最新資訊28at.com

  • 如果有一個操作數是NaN,則結果是NaN;
  • 如果0除以0,則結果是NaN;
  • 如果Infinity除以Infinity,則結果是Infinity。
  • 如果是非零的有限數被零除,則結果是Infinity或-Infinity,取決于有符號操作數的符號;
  • 如果是Infinity被任何非零數值除,則結果是Infinity或-Infinity,取決于有符號操作數的符號。

5. 取余操作符(%)

取余操作符用于計算一個數除以第二個數的余數。計算規則和上述運算符類似。TMb28資訊網——每日最新資訊28at.com

需要注意以下特殊情況:TMb28資訊網——每日最新資訊28at.com

  • 如果被除數是無窮大值而除數是有限大的數值,則結果是NaN;
  • 如果被除數是有限大的數值而除數是零,則結果是NaN;
  • 如果是Infinity被Infinity除,則結果是NaN;
  • 如果被除數是有限大的數值而除數是無窮大的數值,則結果是被除數;
  • 如果被除數是零,則結果是零。

6. 指數操作符(**)

在ECMAScript 7中新增了指數操作符(**),它的計算效果是Math.pow()是一樣的:TMb28資訊網——每日最新資訊28at.com

Math.pow(2, 10);    // 10242 ** 10;            // 1024

指數運算符和上面的加減乘除運算符都有對應的賦值操作運算符:TMb28資訊網——每日最新資訊28at.com

let a = 2;a **= 10;console.log(a);   // 1024
let a = 1;let b = 2;let c = 3;let d = 4;a += 1;     // 2b -= 2;     // 0c *= 3;     // 9d /= 4;     // 1

四、布爾操作符

在開發時,布爾操作符是很有用的,可以精簡很多代碼,干掉很多多余的id-else語句,下面來看看常見的三種布爾操作符。TMb28資訊網——每日最新資訊28at.com

1. 邏輯非操作符(!)

邏輯非操作符可以用于JavaScript中的任何值,這個操作符使用返回布爾值。邏輯非操作符首先會將操作數轉化為布爾值,然后在對其取反。TMb28資訊網——每日最新資訊28at.com

邏輯非操作規則如下:TMb28資訊網——每日最新資訊28at.com

  • 如果操作數是對象,則返回 false;
  • 如果操作數是空字符串,則返回 true;
  • 如果操作數是非空字符串,則返回 false;
  • 如果操作數是數值0,則返回 true;
  • 如果操作數是非0數值(包括 Infinity),則返回 false;
  • 如果操作數是 null,則返回 true;
  • 如果操作數是 NaN,則返回 true;
  • 如果操作數是 undefined, 則返回 true.

邏輯非操作符也可以用于將任何值轉化為布爾值,同時使用兩個!,相當于調用了Boolean()方法:TMb28資訊網——每日最新資訊28at.com

!!"blue" // true!!0;     // false!!NaN    // false!!""     // false!!12345  // true

2. 邏輯與操作符(&&)

邏輯與操作符的兩個操作數都為真時,最終結果才會返回真。該運算符可以用于任何類型的數據。如果有操作數不是布爾值,則結果并一定會返回布爾值,會遵循以下規則:TMb28資訊網——每日最新資訊28at.com

  • 如果第一個操作數是對象,則返回第二個操作數;
  • 如果第二個操作數是對象,則只有在第一個操作數的求值結果為true的情況下才會返回該對象;
  • 如果兩個操作數都是對象,則返回第二個操作數;
  • 如果第一個操作數是null,則返回null;
  • 如果第一個操作數是NaN,則返回NaN;
  • 如果第一個操作數是undefined,則返回undefined;

根據第二條規則,我們可以對我們項目代碼中的代碼進行優化:TMb28資訊網——每日最新資訊28at.com

if(data) {  setData(data);}// 改寫后:data && setData(data);

這里當data為真時,也就是存在時,才會執行setData方法,代碼就精簡了很多。TMb28資訊網——每日最新資訊28at.com

邏輯與操作符是一種短路操作符,只要第一個操作數為false,就不會繼續執行運算符后面的表達式,直接返回false。上面的data如果是不存在的,就會直接發生短路,不會繼續執行后面的方法。TMb28資訊網——每日最新資訊28at.com

3. 邏輯或操作符(||)

邏輯或操作符和邏輯與操作符類似,不過只要兩個操作數中的一個為真,最終的結果就為真。該運算符可以用于任何類型的數據。如果有操作數不是布爾值,則結果并一定會返回布爾值,會遵循以下規則:TMb28資訊網——每日最新資訊28at.com

  • 如果第一個操作數是對象,則返回第一個操作對象;
  • 如果第一個操作數的求值結果是false,則返回第二個操作數;
  • 如果兩個操作數都是對象,則返回第一個操作數;
  • 如果兩個操作數都是null,則返回null;
  • 如果兩個數都是NaN,則返回NaN;
  • 如果兩個數都是undefined,則返回undefined。

邏輯或操作符也是具有短路特性,如果第一個操作數為真,那么第二個操作數就不需要在進行判斷了,會直接返回true。TMb28資訊網——每日最新資訊28at.com

可以利用這個特性給變量設置默認值:TMb28資訊網——每日最新資訊28at.com

let datas = data || {};

這里,如果data不存在,就會將datas賦值為第二個操作數(默認值)。TMb28資訊網——每日最新資訊28at.com

五、比較操作符

1. 相等操作符

相等操作符包括四種:TMb28資訊網——每日最新資訊28at.com

  • 等于(==)
  • 不等于(!=)
  • 全等(===)
  • 不全等(!==)

JavaScript中的等于用兩個等號(==)表示,如果兩個操作數相等,那么就返回true。不等于和等于相反。在進行比較時,兩個操作數都會進行強制類型轉換,在確實是否相等。其判斷規則如下:TMb28資訊網——每日最新資訊28at.com

  • 首先會判斷兩者類型是否相同,相同的話就比較兩者的大小。
  • 類型不相同的話,就會進行類型轉換。
  • 會先判斷是否在對比 null 和 undefined,是的話就會返回 true。
  • 判斷兩者類型是否為 string 和 number,是的話就會將字符串轉換為 number。
1 == '1'      ↓1 ==  1
  • 判斷其中一方是否為 boolean,是的話就會把 boolean 轉為 number 再進行判斷。
'1' == true        ↓'1' ==  1        ↓ 1  ==  1
  • 判斷其中一方是否為 object 且另一方為 string、number 或者 symbol,是的話就會把 object 轉為原始類型再進行判斷。
'1' == { name: 'js' }         ↓'1' == '[object Object]'

其流程圖如下:TMb28資訊網——每日最新資訊28at.com

TMb28資訊網——每日最新資訊28at.com

需要注意,如果其中一個操作數是NaN,相等運算符會返回false,不相等運算符會返回true。TMb28資訊網——每日最新資訊28at.com

對于不等于運算符(!=),只有在強制類型轉化后不相等才會返回true。TMb28資訊網——每日最新資訊28at.com

對于全等運算符(===),只有當兩個操作數的數據類型和值都相等時,才會返回true。它并不會進行數據類型的轉化。TMb28資訊網——每日最新資訊28at.com

對于不全等運算符(!==),只有兩個操作數在不進行類型轉化的情況下是不相等的,才會返回true。TMb28資訊網——每日最新資訊28at.com

在平時的開發中,建議使用全等和不全等在做比較,這樣會更加嚴謹,避免出現意料之外的結果。TMb28資訊網——每日最新資訊28at.com

2. 關系操作符

關系操作符包括四種:TMb28資訊網——每日最新資訊28at.com

  • 小于(<)
  • 大于(>)
  • 小于等于(<=)
  • 大于等于(>=)

這幾個操作符都會返回一個布爾值,他們操作時會遵循以下規則:TMb28資訊網——每日最新資訊28at.com

  • 如果這兩個操作數都是數值,則執行數值比較;
  • 如果兩個操作數都是字符串,則比較兩個字符串對應的字符編碼值;
  • 如果一個操作數是數值,則將另一個操作數轉換為一個數值,然后執行數值比較;
  • 如果一個操作數是對象,則調用這個對象的valueOf()方法,并用得到的結果根據前面的規則執行比較;
  • 如果一個操作數是布爾值,則先將其轉換為數值,然后再執行比較。

六、其他操作符

最后這一部分的一些操作符在平時的開發中就很實用了,下面來看看它們的用法吧。TMb28資訊網——每日最新資訊28at.com

1. 擴展運算符(...)

擴展操作符(Spread operator)可以用來擴展一個數組對象和字符串。它用三個點(…)表示,可以將可迭代對象轉為用逗號分隔的參數序列。TMb28資訊網——每日最新資訊28at.com

(1)用于展開數組:

const a = [1, 2, 3],      b = [4, 5, 6];const c = [...a]       // [1, 2, 3]const d = [...a, ...b] // [1, 2, 3, 4, 5, 6]const e = [...a, 4, 5] // [1, 2, 3, 4, 5]

(2)將類數組對象變成數組:

const list = document.getElementsByTagName('a');const arr = [..list];

(3)用于展開對象:

const obj1 = { a: 1, b: 2 };const obj2 = { c: 3, d: 4 };const merged = { ...obj1, ...obj2 };  // { a: 1, b: 2, c: 3, d: 4 }

需要注意,如果合并時的多個對象有相同屬性,則后面的對象的會覆蓋前面對象的屬性。TMb28資訊網——每日最新資訊28at.com

(4)用于展開字符串

const str = "hello";[...str]  // ["h", "e", "l", "l", "o"]

(5)用于函數傳參

const f = (foo, bar) => {}const a = [1, 2]f(...a)const numbers = [1, 2, 3, 4, 5]const sum = (a, b, c, d, e) => a + b + c + d + econst sum = sum(...numbers)

(6)用于具有 Iterator 接口的對象

具有 Iterator 接口的對象 Map 和 Set 結構,Generator 函數,可以使用展開操作符:TMb28資訊網——每日最新資訊28at.com

const s = new Set();s.add(1);s.add(2);const arr = [...s]// [1,2]function * gen() {  yield 1;  yield 2;  yield 3;}const arr = [...gen()] // 1,2,3

如果是map,會把每個key 和 value 轉成一個數組:TMb28資訊網——每日最新資訊28at.com

const m = new Map();m.set(1,1)m.set(2,2)const arr = [...m]  // [[1,1],[2,2]]

注意 ,對象不是一個Iterator對象。TMb28資訊網——每日最新資訊28at.com

2. 條件操作符(?:)

這里的條件運算符實際上就是我們常說的三元表達式??匆粋€例子:TMb28資訊網——每日最新資訊28at.com

let res = num1 > num2 ? num1 : num2;

這里,將num1和num2中的最大值賦值給了res。TMb28資訊網——每日最新資訊28at.com

使用條件表達式可以代替很多if-else,使得代碼很簡潔。在React的項目中,我個人就經常使用條件操作符來做組件的條件渲染。當然如果判斷的層數過多,感覺代碼就有些難讀懂了。(React-Router源碼中就有嵌套了六七層條件操作符的地方,很難理解...)TMb28資訊網——每日最新資訊28at.com

3. 賦值操作符

其實賦值操作符有很多種,包括簡單的賦值操作符(=),以及一些復合賦值操作符:TMb28資訊網——每日最新資訊28at.com

  • 乘賦值操作符:*=
  • 除賦值操作符:/=
  • 模賦值操作符:%=
  • 加賦值操作符:+=
  • 減賦值操作符:-=
  • 左移操作符: <<=
  • 有符號右移賦值操作符:>>=
  • 無符號右移賦值操作符:>>>=

這些僅僅是他們對應的簡寫形式,并不會產生其他影響。TMb28資訊網——每日最新資訊28at.com

4. in操作符

in操作符可以用來判斷一個屬性是否屬于一個對象,它的返回值是一個布爾值:TMb28資訊網——每日最新資訊28at.com

const author = {  name: "CUGGZ",  age: 18}"height" in author;  // false"age" in author;     // true

還可以用來判斷一個屬性是否屬于對象原型鏈的一部分:TMb28資訊網——每日最新資訊28at.com

let arr = ["hello", "jue", "jin"];"length" in arr;   // true

5. delete操作符

delete 操作符用于刪除對象的某個屬性或者數組元素。對于引用類型的值,它也是刪除對象屬性的本身,不會刪除屬性指向的對象。TMb28資訊網——每日最新資訊28at.com

const o = {};const a = { x: 10 };o.a = a;delete o.a; // o.a屬性被刪除console.log(o.a); // undefinedconsole.log(a.x); // 10, 因為{ x: 10 } 對象依然被 a 引用,所以不會被回收

需要注意:TMb28資訊網——每日最新資訊28at.com

  • 原型中聲明的屬性和對象自帶的屬性無法被刪除;
  • 通過var聲明的變量和通過function聲明的函數擁有dontdelete特性,是不能被刪除。

6. instanceof操作符

instanceof運算符用來判斷一個構造函數的prototype屬性所指向的對象是否存在另外一個要檢測對象的原型鏈上。TMb28資訊網——每日最新資訊28at.com

console.log(2 instanceof Number);                    // falseconsole.log(true instanceof Boolean);                // false console.log('str' instanceof String);                // false  console.log([] instanceof Array);                    // trueconsole.log(function(){} instanceof Function);       // trueconsole.log({} instanceof Object);                   // true

可以看到,instanceof只能正確判斷引用數據類型,而不能判斷基本數據類型。instanceof運算符可以用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性。TMb28資訊網——每日最新資訊28at.com

可以簡單來實現一下 instanceof 操作符:TMb28資訊網——每日最新資訊28at.com

function myInstanceof(left, right) {  // 獲取對象的原型  let proto = Object.getPrototypeOf(left)  // 獲取構造函數的 prototype 對象  let prototype = right.prototype;    // 判斷構造函數的 prototype 對象是否在對象的原型鏈上  while (true) {    if (!proto) return false;    if (proto === prototype) return true;    // 如果沒有找到,就繼續從其原型上找,Object.getPrototypeOf方法用來獲取指定對象的原型    proto = Object.getPrototypeOf(proto);  }}

7. typeof操作符

typeof是一元運算符,它的返回值是一個字符串,它是操作數的類型,JavaScript常見數據對應的類型如下:TMb28資訊網——每日最新資訊28at.com

xTMb28資訊網——每日最新資訊28at.com

typeofTMb28資訊網——每日最新資訊28at.com

undefinedTMb28資訊網——每日最新資訊28at.com

undefinedTMb28資訊網——每日最新資訊28at.com

nullTMb28資訊網——每日最新資訊28at.com

objectTMb28資訊網——每日最新資訊28at.com

true或falseTMb28資訊網——每日最新資訊28at.com

booleanTMb28資訊網——每日最新資訊28at.com

數值或NaNTMb28資訊網——每日最新資訊28at.com

numberTMb28資訊網——每日最新資訊28at.com

BigIntTMb28資訊網——每日最新資訊28at.com

bigIntTMb28資訊網——每日最新資訊28at.com

字符串TMb28資訊網——每日最新資訊28at.com

stringTMb28資訊網——每日最新資訊28at.com

symbolTMb28資訊網——每日最新資訊28at.com

symbolTMb28資訊網——每日最新資訊28at.com

函數TMb28資訊網——每日最新資訊28at.com

functionTMb28資訊網——每日最新資訊28at.com

非函數對象TMb28資訊網——每日最新資訊28at.com

objectTMb28資訊網——每日最新資訊28at.com

typeof 2               // numbertypeof true            // booleantypeof 'str'           // stringtypeof []              // object    typeof function(){}    // functiontypeof {}              // objecttypeof undefined       // undefinedtypeof null            // object

那這里為什么 typeof null 的結果是Object呢?TMb28資訊網——每日最新資訊28at.com

在 JavaScript 第一個版本中,所有值都存儲在 32 位的單元中,每個單元包含一個小的 類型標簽(1-3 bits) 以及當前要存儲值的真實數據。類型標簽存儲在每個單元的低位中,共有五種數據類型:TMb28資訊網——每日最新資訊28at.com

000: object   - 當前存儲的數據指向一個對象。  1: int      - 當前存儲的數據是一個 31 位的有符號整數。010: double   - 當前存儲的數據指向一個雙精度的浮點數。100: string   - 當前存儲的數據指向一個字符串。110: boolean  - 當前存儲的數據是布爾值。

如果最低位是 1,則類型標簽標志位的長度只有一位;如果最低位是 0,則類型標簽標志位的長度占三位,為存儲其他四種數據類型提供了額外兩個 bit 的長度。TMb28資訊網——每日最新資訊28at.com

有兩種特殊數據類型:TMb28資訊網——每日最新資訊28at.com

  • undefined的值是 (-2)30(一個超出整數范圍的數字)。
  • null 的值是機器碼 NULL 指針(null 指針的值全是 0)。

那也就是說null的類型標簽也是000,和Object的類型標簽一樣,所以會被判定為Object。TMb28資訊網——每日最新資訊28at.com

8. 空值合并操作符(??)

在編寫代碼時,如果某個屬性不為 null 和 undefined,那么就獲取該屬性,如果該屬性為 null 或 undefined,則取一個默認值:TMb28資訊網——每日最新資訊28at.com

const name = dogName ? dogName : 'default';

可以通過 || 來簡化:TMb28資訊網——每日最新資訊28at.com

const name =  dogName || 'default';

但是 || 的寫法存在一定的缺陷,當 dogName 為 0 或 false 的時候也會走到 default 的邏輯。所以 ES2020 引入了 ?? 運算符。只有 ?? 左邊為 null 或 undefined時才返回右邊的值:TMb28資訊網——每日最新資訊28at.com

const dogName = false; const name =  dogName ?? 'default';  // name = false;

9. 可選鏈操作符(?.)

在開發過程中,我們可能需要獲取深層次屬性,例如 system.user.addr.province.name。但在獲取 name 這個屬性前需要一步步的判斷前面的屬性是否存在,否則并會報錯:TMb28資訊網——每日最新資訊28at.com

const name = (system && system.user && system.user.addr && system.user.addr.province && system.user.addr.province.name) || 'default';

為了簡化上述過程,ES2020 引入了「鏈判斷運算符」?.,可選鏈操作符( ?. )允許讀取位于連接對象鏈深處的屬性的值,而不必明確驗證鏈中的每個引用是否有效。?. 操作符的功能類似于 . 鏈式操作符,不同之處在于,在引用為null 或 undefined 的情況下不會引起錯誤,該表達式短路返回值是 undefined。與函數調用一起使用時,如果給定的函數不存在,則返回 undefined。TMb28資訊網——每日最新資訊28at.com

const name = system?.user?.addr?.province?.name || 'default';

當嘗試訪問可能不存在的對象屬性時,可選鏈操作符將會使表達式更短、更簡明。在探索一個對象的內容時,如果不能確定哪些屬性必定存在,可選鏈操作符也是很有幫助的。TMb28資訊網——每日最新資訊28at.com

可選鏈有以下三種形式:TMb28資訊網——每日最新資訊28at.com

a?.[x]// 等同于a == null ? undefined : a[x]a?.b()// 等同于a == null ? undefined : a.b()a?.()// 等同于a == null ? undefined : a()

10. 逗號操作符(,)

逗號操作符也沒啥好說的,當同時聲明多個變量時會用到:TMb28資訊網——每日最新資訊28at.com

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

還有一種使用場景就是有多個循環變量的 for 循環中:TMb28資訊網——每日最新資訊28at.com

for(let i = 0, j = 10; i < j; i++, j--){  console.log(i + j);}

11. void操作符(void)

void 是一元運算符,它可以出現在任意類型的操作數之前執行操作數,會忽略操作數的返回值,返回一個 undefined。void 常用于 HTML 腳本中執行 JavaScript 表達式,但不需要返回表達式的計算結果。比如對于鏈接標簽,我們并不想讓它發生跳轉,就可以設置href="javascript:void(0)。TMb28資訊網——每日最新資訊28at.com

在下面代碼中,使用 void 運算符讓表達式返回 undefined:TMb28資訊網——每日最新資訊28at.com

let a = b = c = 2;  // 定義并初始化變量的值d = void (a -= (b *= (c += 5)));  // 執行void運算符,并把返回值賦予變量dconsole.log(a);  // -12console.log(b);  // 14console.log(c);  // 7console.log(d);  // undefined

由于 void 運算符的優先級比較高,高于普通運算符的優先級,所以在使用時應該使用小括號明確 void 運算符操作的操作數,避免引發錯誤。TMb28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-79454-0.html這些強大的 JS 操作符,你都知道嗎?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 比 ElasticSearch 快 1000 倍的日志引擎

下一篇: 讓AI軟件編寫成為過去式,盤點GTC2024上發布的軟件開發工具

標簽:
  • 熱門焦點
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式??梢詾閾碛兄付▽傩缘?HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • 華為和江淮汽車合作開發百萬元問界MPV?雙方回應來了

    8月1日消息,郭明錤今天在社交平臺發文稱,華為正在和江淮汽車合作,開發售價在100萬元的問界MPV,預計在2024年第2季度量產,銷量目標為上市首年交付5萬輛。
  • 華為開發者大會2023日程公開:開設鴻蒙HarmonyOS 4體驗區

    IT之家 7 月 31 日消息,華為今日公布了 HDC.Together 開發者大會 2023 的詳細日程。整場大會將于 8 月 4 日-6 日之間舉行,屆時將發布最新一代鴻蒙 H
  • 聯想YOGA 16s 2022筆記本將要推出,屏幕支持觸控功能

    聯想此前宣布,將于11月2日19:30召開聯想秋季輕薄新品發布會,推出聯想 YOGA 16s 2022 筆記本等新品。官方稱,YOGA 16s 2022 筆記本將搭載 16 英寸屏幕,并且是一
  • 上海舉辦人工智能大會活動,建設人工智能新高地

    人工智能大會在上海浦江兩岸隆重拉開帷幕,人工智能新技術、新產品、新應用、新理念集中亮相。8月30日晚,作為大會的特色活動之一的上海人工智能發展盛典人工
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲美女精品成人在线视频| 亚洲欧美精品中文字幕在线| 国产精品久久久久高潮| 欧美极品在线播放| 浪潮色综合久久天堂| 亚洲日本无吗高清不卡| 久久精品30| 欧美人成免费网站| 亚洲人被黑人高潮完整版| 91久久精品视频| 久久精品欧美日韩| 国产区日韩欧美| 亚洲一区欧美激情| 久久久亚洲成人| 欧美一区二区三区在线视频| 久久精品视频免费| 国产视频在线观看一区 | 欧美日韩午夜| 亚洲国产成人高清精品| 亚洲国产欧美日韩精品| 免费不卡视频| 亚洲激情在线观看| 欧美日韩播放| 久久久视频精品| 亚洲人成网在线播放| 久久久久久高潮国产精品视| 黄色成人在线网站| 亚洲在线观看| 久久精品99无色码中文字幕| 亚洲淫片在线视频| 亚洲欧洲99久久| 欧美成人高清| 国产欧美日韩视频在线观看| 亚洲国产欧美不卡在线观看| 亚洲欧美国产高清| 欧美激情麻豆| 狠狠色伊人亚洲综合成人| 亚洲手机在线| 欧美成人精品不卡视频在线观看 | 欧美一区二区三区久久精品茉莉花| 欧美福利视频一区| 国产一区二区成人| 亚洲天堂网在线观看| 欧美成人免费观看| 国产亚洲美州欧州综合国| 一区二区三区欧美激情| 鲁鲁狠狠狠7777一区二区| 国产麻豆9l精品三级站| 9l国产精品久久久久麻豆| 美女主播一区| 好吊一区二区三区| 小黄鸭精品aⅴ导航网站入口| 欧美日韩一区二区在线播放| 亚洲动漫精品| 久久天堂国产精品| 国产专区欧美精品| 亚洲欧美怡红院| 中日韩美女免费视频网址在线观看| 久久免费高清| 国产一区91精品张津瑜| 亚洲欧美在线一区二区| 欧美日韩免费观看一区二区三区| 在线成人激情视频| 久久激情五月丁香伊人| 国产精品中文字幕欧美| 亚洲特级片在线| 欧美精品一区二区三区四区| 亚洲国产视频直播| 蜜桃av综合| 在线观看视频免费一区二区三区| 久久久精品国产免大香伊 | 欧美日韩国产另类不卡| 亚洲人成高清| 欧美国产第二页| 亚洲第一在线综合网站| 久久午夜电影网| 国模私拍视频一区| 久久国产精品久久精品国产| 国产伦理精品不卡| 亚洲精品日韩一| 欧美成熟视频| 亚洲肉体裸体xxxx137| 欧美ed2k| 亚洲精品资源| 欧美日韩亚洲精品内裤| 一区二区三区四区在线| 欧美视频日韩视频| 亚洲天堂免费在线观看视频| 国产精品草莓在线免费观看| 亚洲在线一区二区三区| 国产酒店精品激情| 久久www成人_看片免费不卡| 韩日成人av| 老司机免费视频久久| 亚洲国产精品一区二区三区| 欧美国产视频在线观看| 一本色道久久综合狠狠躁篇怎么玩| 欧美日韩在线不卡一区| 亚洲一区三区电影在线观看| 国产麻豆视频精品| 久久国产直播| 亚洲成人资源| 欧美日韩不卡合集视频| 亚洲综合国产精品| 国产揄拍国内精品对白 | 国产一区二区三区不卡在线观看| 久久精品首页| 亚洲二区免费| 欧美日韩亚洲高清一区二区| 亚洲在线免费观看| 狠狠入ady亚洲精品| 欧美成人在线影院| 亚洲视频999| 国产三级精品三级| 麻豆精品传媒视频| 99亚洲一区二区| 国产美女精品视频免费观看| 久久免费视频网站| 日韩亚洲不卡在线| 久久xxxx| 亚洲精品一区二区三区在线观看 | 国产一区二区三区视频在线观看| 久久综合九色综合欧美狠狠| 亚洲精品影院在线观看| 国产精品久久久久久久久免费| 久久黄色影院| 亚洲精品日韩精品| 国产三级精品三级| 欧美成人亚洲成人日韩成人| 亚洲午夜一区| 在线观看欧美| 国产精品久久久久久久久久久久久久| 久久国产精品一区二区三区| 亚洲精品国产精品乱码不99| 国产精品尤物| 欧美高清在线精品一区| 亚洲免费影院| 亚洲高清视频在线观看| 国产精品草莓在线免费观看| 久久久亚洲影院你懂的| 一区二区三区欧美日韩| 激情亚洲成人| 国产精品超碰97尤物18| 免费不卡在线观看av| 亚洲一区二区三区乱码aⅴ| 影音先锋日韩有码| 国产精品免费视频观看| 免费一级欧美在线大片| 亚洲欧美激情一区二区| 亚洲国产精品一区二区尤物区 | 狠狠色综合播放一区二区| 欧美色综合网| 免费观看欧美在线视频的网站| 亚洲永久精品国产| 亚洲欧洲中文日韩久久av乱码| 国产欧美一区二区三区沐欲 | 久久夜色精品国产| 亚洲无线一线二线三线区别av| 在线观看精品| 国产日韩专区| 欧美视频在线观看视频极品| 蜜桃av一区| 欧美中在线观看| 亚洲无线视频| 亚洲人成小说网站色在线| 国内精品久久久久影院优| 国产精品成人av性教育| 欧美激情一二三区| 久久人人爽爽爽人久久久| 午夜激情久久久| 一区二区成人精品| 亚洲黄色三级| 伊人成综合网伊人222| 国产视频一区在线| 国产精品伦一区| 欧美日韩视频一区二区| 欧美福利小视频| 另类尿喷潮videofree| 欧美一区深夜视频| 亚洲专区欧美专区| 中文亚洲免费| 日韩一级不卡| 亚洲人成小说网站色在线| 一区在线影院| 国内精品伊人久久久久av一坑| 国产农村妇女精品一二区| 国产精品高精视频免费| 欧美日韩一区二区三区在线视频 | 欧美在线观看视频一区二区| 国产视频精品免费播放| 国产精品久久久久三级| 欧美私人啪啪vps| 欧美视频一区在线| 欧美午夜电影在线| 欧美日韩免费一区二区三区视频| 欧美激情视频网站| 欧美激情一区二区三区| 欧美福利在线| 欧美激情91| 欧美日韩大片| 欧美日韩在线观看一区二区三区 | 国产欧美一区二区精品婷婷| 国产伦精品一区二区三区四区免费 | 亚洲精品一二三|