簡體   English   中英

Javascript 中的類型強制究竟是什么?

[英]What exactly is Type Coercion in Javascript?

Javascript 中的類型強制究竟是什么?

例如,關於使用==而不是===

類型強制意味着當一個運算符的操作數是不同的類型時,其中一個將被轉換為另一個操作數類型的“等價”值。 例如,如果你這樣做:

boolean == integer

布爾操作數將轉換為整數: false變為0true變為 1。然后比較兩個值。

但是,如果您使用非轉換比較運算符=== ,則不會發生此類轉換。 當操作數屬於不同類型時,該運算符返回false ,並且僅在它們屬於相同類型時比較值。

強制不僅由比較運算符完成,盡管它們是唯一同時具有“嚴格”和“松散”變體的運算符。 大多數算術運算符會自動將非數字參數轉換為數字,例如"50" / 5被視為50 / 5 還有許多需要字符串參數的內置函數和方法; 如果你給他們別的東西,他們會自動強制他們使用字符串。

但要小心—— +既是算術加法運算符又是字符串連接運算符——如果你使用string + number ,它會將數字轉換為字符串並連接,而不是將字符串轉換為數字並相加。 這是對用戶輸入執行算術運算時出現的許多錯誤的根源,因為輸入是字符串,除非您顯式轉換它。

您可以在You Don't Know JS中找到對 JavaScript 強制規則的很好解釋,在MDN中找到更多面向參考的文檔。

讓我們從一個簡短的類型系統介紹開始,我認為這將幫助您理解類型強制的一般概念。

一種語言的類型系統定義了一些規則,這些規則告訴我們該語言中存在哪些類型的數據以及如何使用不同的運算符組合它們。 例如,一個這樣的規則可能指定加號 (+) 運算符僅作用於數字。 這些規則的存在主要是為了防止你在腳上開槍。 但是當程序員在程序中打破這個規則時會發生什么? 沒有什么能阻止程序員在程序中輸入{} + {}“hello” + 5 ,即使語言認為這些表達式沒有任何意義。

在這些情況下最終會發生什么取決於語言對其類型規則的嚴格程度。

語言類型系統通常持有關於您違反其規則的兩種立場之一:

  1. 說“嘿,這不酷!” 並立即使您的程序崩潰。
  2. 說“我不能用 {} 做任何事情……但我可以用數字做一些事情”並嘗試將 {} 轉換為數字。

類型系統在其規則中占據首位的語言通俗地稱為“強類型”語言。 他們嚴格不讓你違反它的規則。 采用第二種方法的那些(例如 JavaScript)被稱為“弱類型”或“松散類型”語言。 當然,您可以打破規則,但當它強制轉換您在程序中描述的數據類型以符合其規則時,請不要感到驚訝。 這種行為被稱為......(鼓聲)......類型強制

現在讓我們看一些 JavaScript 中的示例。 首先,讓我們從一個不會導致類型強制的表達式開始。

5 + 5

將 + 運算符與兩個數字一起使用,這是完全有效的。 程序會將 + 視為“加”,並愉快地將兩個數字相加。 無需轉換。

但是關於 …

[] + 5

哦哦。 在 JavaScript 中, +可以表示添加兩個數字或連接兩個字符串。 在這種情況下,我們既沒有兩個數字也沒有兩個字符串。 我們只有一個數字和一個對象。 根據 JavaScript 的類型規則,這沒有邏輯意義。 因為它原諒你違反它的規則,所以它不會崩潰,而是試圖理解它。 那么 JavaScript 是做什么的呢? 好吧,它知道如何連接字符串,所以它將 [] 和 5 都轉換為字符串,結果是字符串值“5”。

比較運算符=====是怎么回事? 為什么有兩個比較運算符?

==無法避免 JavaScript 的類型轉換行為。 諸如5 == “5”類的表達式將評估為 true,因為 JavaScript 將嘗試轉換其中一個,以便比較相同類型的數據。

在許多情況下,這是不可取的,因為您可能想知道您要比較的某些數據是否屬於不同類型,以便您可以決定如何處理它。 這就是===運算符的用武之地。當您使用===時,不會發生類型轉換。 因此,表達式5 === “5”將評估為假。

在 Python 中,如果你嘗試添加字符串和整數,你會得到一個錯誤:

>>> "hi" + 10
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects

然而在 JavaScript 中,你不需要。 10被轉換為字符串:

> "hi" + 10
"hi10"

“類型強制”只是上面的一個花哨的誤稱。 實際上,兩種語言都沒有 Java 或 C 或其他具有靜態類型系統的語言意義上的“類型”。 語言如何處理各種非靜態類型值之間的交互是一個選擇和約定的問題。

讓我用下面的例子來解釋類型強制

類型強制意味着 Javascript 自動(即時)將變量從一種數據類型轉換為另一種數據類型

例如: 123 + "4"通常會引發錯誤,但在 Javascript 中由於類型強制,它會導致1234字符串

if(23 == "23"){
    console.log(" this line is inside the loop and is executed ");
}

在上面的代碼中,由於類型強制 - JavaScript 認為23 (數字)和"23" (字符串)是同一個東西。 這使得條件為真並打印 console.log

在另一種情況下

if(23 === "23"){
   console.log(" this line is inside the loop and is NOT executed");
}

===情況下,Javascript 不執行類型強制轉換,並且由於23是數字,而"23"是字符串,並且由於===這兩種數據類型不同,因此導致條件錯誤。 它不打印 console.log

簡單來說

在這種情況下=它是一個賦值運算符 - 它分配諸如var a = 3;之類的值。 , ETC

(以下運算符用於比較)

在這種情況下== Javascript 將數據類型轉換/強制轉換為另一種數據類型,然后進行比較。

在這種情況下=== Javascript 不會轉換/強制數據類型

為了避免錯誤和調試目的===主要用於

請讓我知道上述信息的准確性。

什么是強制:

javascript 中的類型強制發生在 Javascript 引擎必須執行特定操作時,它需要數據為特定類型。 當引擎遇到不適用於操作的某種類型的數據時,它會將數據強制轉換為某種類型。 這是必需的,因為 javascript 中的變量是動態類型的,這意味着可以為給定變量分配任何類型的值。

例子:


if(1){
  // 1 gets coerced to true
}


if(4 > '3') {
  // 3 gets coerced into a number
}


44 == "44"  // true, the string 44 gets converted to a nr

布爾強制:

在 javascript coercion 中,所有值都轉換為true ,但以下值被強制轉換為false

 console.log(!!""); // false console.log(!!0); // false console.log(!!null); // false console.log(!!undefined); // false console.log(!!NaN); // false console.log(!!false); // false

還要注意,在上面的例子中,雙! 使用運算符。 這 ! 標記運算符將一個值強制轉換為具有相反值的布爾值。 我們可以使用此運算符兩次將任何值轉換為布爾值。

a == b意味着 javascript 將根據是否可以平等地評估值來評估ab 例如, false == 0將評估為 true,因為 0 也是布爾 false 的值。 但是, false === 0將評估為 false,因為嚴格比較,0 與 false 的物理值不同。 另一個例子是false == ''所以基本上是松散比較與嚴格比較,因為 javascript 是一種松散類型的語言。 也就是說,javascript會嘗試根據代碼的上下文對變量進行轉換,如果不嚴格比較的話,這會起到使事物相等的作用。 php 也有這種行為。

var str = 'dude';
console.log(typeof str); // "string"
console.log(!str); // false
console.log(typeof !str); // "boolean"

最初聲明為字符串的變量示例被強制轉換為布爾值! 操作員

類型強制是將值從一種類型轉換為另一種類型的過程(例如字符串轉換為數字,對象轉換為布爾值等)。 任何類型,無論是原始類型還是對象,都是類型強制的有效主體。 回想一下,原語是:數字、字符串、布爾值、空值、未定義 + 符號(在 ES6 中添加)。

類型強制可以是顯式的也可以是隱式的。

當開發人員通過編寫適當的代碼(例如 Number(value))來表達在類型之間轉換的意圖時,它被稱為顯式類型強制(或類型轉換)。

由於 JavaScript 是一種弱類型語言,因此值也可以在不同類型之間自動轉換,稱為隱式類型強制。 它通常發生在您將運算符應用於不同類型的值時,例如 1 == null、2/'5'、null + new Date(),或者它可以由周圍的上下文觸發,例如 if (value) {... },其中值被強制為布爾值。

這是隱式類型強制的一些示例:

true + false
12 / "6"
"number" + 15 + 3
15 + 3 + "number"
[1] > null
"foo" + + "bar"
'true' == true
false == 'false'
null == ''
!!"false" == !!"true"
[‘x’] == ‘x’
[] + null + 1
[1,2,3] == [1,2,3]
{}+[]+{}+[1]
!+[]+[]+![]
new Date(0) - 0
new Date(0) + 0

閱讀更多: https ://www.freecodecamp.org/news/js-type-coercion-explained-27ba3d9a2839/

如果數據類型彼此不相等,則強制發生。 像 3 == "3" 或布爾 == 整數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM