簡體   English   中英

Javascript:為什么 % 運算符作用於字符串?

[英]Javascript : Why does % operator work on strings?

我真的很困惑為什么下面的代碼應該在 Javascript 中工作:

var string  = '1233'
console.log(typeof string) // prints string
console.log(string % 2) // prints 1

var result = string - 4
console.log(result) // prints 1229

為什么字符串中允許使用 % 和 - 之類的運算符? Javascript 是否嘗試將字符串轉換為數字? (各種類型的提升)

PS我是C++背景。

因為規范是這么說的。 % (和*/ )是MultiplicativeOperator s,當使用其中任何一個時,運算符的兩邊都會轉換為數字:

  1. 讓 lnum 成為? ToNumeric(左值)。
  2. 讓 rnum 成為? ToNumeric(右值)。
  3. 如果 Type(lnum) 與 Type(rnum) 不同,則拋出 TypeError 異常。
  4. 令 T 為 Type(lnum)。
  5. 如果 MultiplicativeOperator 是 *,則返回 T::multiply(lnum, rnum)。
  6. 如果 MultiplicativeOperator 是 /,則返回 T::divide(lnum, rnum)。
  7. 別的,

    一種。 斷言:MultiplicativeOperator 是 %。

    b. 返回 T::remainder(lnum, rnum)。

-用於非數字時會發生同樣的事情 - 雙方首先被強制轉換為數字,然后執行操作。 它不會拋出錯誤,除非其中一個ToNumeric返回一個number ,而另一個ToNumeric返回一個bigint BigInts 是唯一需要您期望的顯式類型轉換的類型。

請注意,在 Typescript 中,它是 Javascript 的(大部分)類型安全版本,這種情況確實會導致錯誤,具體而言:

算術運算的右側(或左側)必須是“any”、“number”、“bigint”或枚舉類型。 TS(2363)

但是標准 Javascript,在出現此類沖突類型問題的情況下,幾乎總是傾向於嘗試執行操作而不是拋出錯誤。 出於類似的原因,你可以這樣做

 const obj = {}; const someStr = 'foo' + obj; console.log(someStr);

這沒有多大意義,因為obj是 object(並且在大多數情況下不能非常有意義地+ d 帶有字符串),但語言並不禁止它。

發生這種情況是因為當您嘗試使用只有數字的字符串進行數學運算時,Javacript 會嘗試將它們轉換為數字以進行此操作。 它被稱為“類型強制”更多信息可以在MDN中找到

暫無
暫無

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

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