<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                ## 一、值,類型和運算符 > 原文:[Values, Types, and Operators](http://eloquentjavascript.net/01_values.html) > > 譯者:[飛龍](https://github.com/wizardforcel) > > 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) > > 自豪地采用[谷歌翻譯](https://translate.google.cn/) > > 部分參考了[《JavaScript 編程精解(第 2 版)》](https://book.douban.com/subject/26707144/) > 在機器的表面之下,程序在運轉。 它不費力就可以擴大和縮小。 在和諧的關系中,電子散開并重新聚合。 監視器上的表格只是水面上的漣漪。 本質隱藏在下面。 > > Master Yuan-Ma,《The Book of Programming》 ![](https://img.kancloud.cn/b2/3f/b23f51656f21182db4036e6b838e6bfe_490x310.jpg) 計算機世界里只有數據。 你可以讀取數據,修改數據,創建新數據 - 但不能提及不是數據的東西。 所有這些數據都以位的長序列存儲,因此基本相似。 位是任何類型的二值的東西,通常描述為零和一。 在計算機內部,他們有一些形式,例如高電荷或低電荷,強信號或弱信號,或 CD 表面上的亮斑點或暗斑點。 任何一段離散信息都可以簡化為零和一的序列,從而以位表示。 例如,我們可以用位來表示數字 13。 它的原理與十進制數字相同,但不是 10 個不同的數字,而只有 2 個,每個數字的權重從右到左增加 2 倍。 以下是組成數字 13 的位,下方顯示數字的權重: ``` 0 0 0 0 1 1 0 1 128 64 32 16 8 4 2 1 ``` 因此,這就是二進制數`00001101`,或者`8+4+1`,即 13。 ## 值 想象一下位之海 - 一片它們的海洋。 典型的現代計算機的易失性數據存儲器(工作存儲器)中,有超過 300 億位。非易失性存儲(硬盤或等價物)往往還有幾個數量級。 為了能夠在不丟失的情況下,處理這些數量的數據,我們必須將它們分成代表信息片段的塊。 在 JavaScript 環境中,這些塊稱為值。 雖然所有值都是由位構成的,但他們起到不同的作用,每個值都有一個決定其作用的類型。 有些值是數字,有些值是文本片段,有些值是函數,等等。 要創建一個值,你只需要調用它的名字。 這很方便。 你不必為你的值收集建筑材料或為其付費。 你只需要調用它,然后刷的一下,你就有了它。 當然,它們并不是真正憑空創造的。 每個值都必須存儲在某個地方,如果你想同時使用大量的值,則可能會耗盡內存。 幸運的是,只有同時需要它們時,這才是一個問題。 只要你不再使用值,它就會消失,留下它的一部分作為下一代值的建筑材料。 本章將會介紹 JavaScript 程序當中的基本元素,包括簡單的值類型以及值運算符。 ## 數字 數字(`Number`)類型的值即數字值。在 JavaScript 中寫成如下形式: ```js 13 ``` 在程序中使用這個值的時候,就會將數字 13 以位序列的方式存放在計算機的內存當中。 JavaScript使用固定數量的位(64 位)來存儲單個數字值。 你可以用 64 位創造很多模式,這意味著可以表示的不同數值是有限的。 對于`N`個十進制數字,可以表示的數值數量是`10^N`。 與之類似,給定 64 個二進制數字,你可以表示`2^64`個不同的數字,大約 18 億億(18 后面有 18 個零)。太多了。 過去計算機內存很小,人們傾向于使用一組 8 位或 16 位來表示他們的數字。 這么小的數字很容易意外地溢出,最終得到的數字不能放在給定的位數中。 今天,即使是裝在口袋里的電腦也有足夠的內存,所以你可以自由使用 64 位的塊,只有在處理真正的天文數字時才需要擔心溢出。 不過,并非所有 18 億億以下的整數都能放在 JavaScript 數值中。 這些位也存儲負數,所以一位用于表示數字的符號。 一個更大的問題是,也必須表示非整數。 為此,一些位用于存儲小數點的位置。 可以存儲的實際最大整數更多地在 9000 萬億(15 個零)的范圍內 - 這仍然相當多。 使用小數點來表示分數。 ```js 9.81 ``` 對于非常大或非常小的數字,你也可以通過輸入`e`(表示指數),后面跟著指數來使用科學記數法: ```js 2.998e8 ``` 即`2.998 * 10^8 = 299,800,000`。 當計算小于前文當中提到的 9000 萬億的整數時,其計算結果會十分精確,不過在計算小數的時候精度卻不高。正如(`pi`)無法使用有限個數的十進制數字表示一樣,在使用 64 位來存儲分數時也同樣會丟失一些精度。雖說如此,但這類丟失精度只會在一些特殊情況下才會出現問題。因此我們需要注意在處理分數時,將其視為近似值,而非精確值。 ### 算術 與數字密切相關的就是算術。比如,加法或者乘法之類的算術運算會使用兩個數值,并產生一個新的數字。JavaScript 中的算術運算如下所示: ```js 100 + 4 * 11 ``` 我們把`+`和`*`符號稱為運算符。第一個符號表示加法,第二個符號表示乘法。將一個運算符放在兩個值之間,該運算符將會使用其旁邊的兩個值產生一個新值。 但是這個例子的意思是“將 4 和 100 相加,并將結果乘 11”,還是是在加法之前計算乘法? 正如你可能猜到的那樣,乘法首先計算。 但是和數學一樣,你可以通過將加法包在圓括號中來改變它: ```js (100 + 4) * 11 ``` `–`運算符表示減法,`/`運算符則表示除法。 在運算符同時出現,并且沒有括號的情況下,其運算順序根據運算符優先級確定。示例中的乘法運算符優先級高于加法。而`/`運算符和`*`運算符優先級相同,`+`運算符和`–`運算符優先級也相同。當多個具有相同優先級的運算符相鄰出現時,運算從左向右執行,比如`1–2+1`的運算順序是`(1–2)+1`。 你無需擔心這些運算符的優先級規則,不確定的時候只需要添加括號即可。 還有一個算術運算符,你可能無法立即認出。 `%`符號用于表示取余操作。 `X % Y`是`Y`除`X`的余數。 例如,`314 % 100`產生`14`,`144 % 12`產生`0`。 余數的優先級與乘法和除法的優先級相同。 你還經常會看到這個運算符被稱為模運算符。 ### 特殊數字 在 JavaScript 中有三個特殊的值,它們雖然是數字,但看起來卻跟一般的數字不太一樣。 前兩個是`Infinity`和`-Infinity`,它們代表正無窮和負無窮。 “無窮減一”仍然是“無窮”,依此類推。 盡管如此,不要過分信任基于無窮大的計算。 它在數學上不合理,并且很快導致我們的下一個特殊數字:`NaN`。 `NaN`代表“不是數字”,即使它是數字類型的值。 例如,當你嘗試計算`0/0`(零除零),`Infinity - Infinity`或任何其他數字操作,它不會產生有意義的結果時,你將得到此結果。 ## 字符串 下一個基本數據類型是字符串(`String`)。 字符串用于表示文本。 它們是用引號括起來的: ```js `Down on the sea` "Lie on the ocean" 'Float on the ocean' ``` 只要字符串開頭和結尾的引號匹配,就可以使用單引號,雙引號或反引號來標記字符串。 幾乎所有的東西都可以放在引號之間,并且 JavaScript 會從中提取字符串值。 但少數字符更難。 你可能難以想象,如何在引號之間加引號。 當使用反引號(`` ` ``)引用字符串時,換行符(當你按回車鍵時獲得的字符)可能會被包含,而無需轉義。 若要將這些字符存入字符串,需要使用下列規則:當反斜杠(`\`)出現在引號之間的文本中時,表示緊跟在其后的字符具有特殊含義,我們將其稱之為轉義符。當引號緊跟在反斜杠后時,并不意味著字符串結束,而表示這個引號是字符串的一部分。當字符`n`出現在反斜杠后時,JavaScript 將其解釋成換行符。以此類推,`\t`表示制表符,我們來看看下面這個字符串: ```js "This is the first line\nAnd this is the second" ``` 該字符串實際表示的文本是: ``` This is the first line And this is the second ``` 當然,在某些情況下,你希望字符串中的反斜杠只是反斜杠,而不是特殊代碼。 如果兩個反斜杠寫在一起,它們將合并,并且只有一個將留在結果字符串值中。 這就是字符串“`A newline character is written like "\n".`”的表示方式: ```js "A newline character is written like \"\\n\"." ``` 字符串也必須建模為一系列位,以便能夠存在于計算機內部。 JavaScript 執行此操作的方式基于 Unicode 標準。 該標準為你幾乎需要的每個字符分配一個數字,包括來自希臘語,阿拉伯語,日語,亞美尼亞語,以及其他的字符。 如果我們為每個字符分配一個數字,則可以用一系列數字來描述一個字符串。 這就是 JavaScript 所做的。 但是有一個復雜的問題:JavaScript 的表示為每個字符串元素使用 16 位,它可以描述多達 2 的 16 次方個不同的字符。 但是,Unicode 定義的字符多于此 - 大約是此處的兩倍。 所以有些字符,比如許多 emoji,在 JavaScript 字符串中占據了兩個“字符位置”。 我們將在第 5 章中回來討論。 我們不能將除法,乘法或減法運算符用于字符串,但是`+`運算符卻可以。這種情況下,運算符并不表示加法,而是連接操作:將兩個字符串連接到一起。以下語句可以產生字符串`"concatenate"`: ```js "con" + "cat" + "e" + "nate" ``` 字符串值有許多相關的函數(方法),可用于對它們執行其他操作。 我們將在第 4 章中回來討論。 用單引號或雙引號編寫的字符串的行為非常相似 - 唯一的區別是需要在其中轉義哪種類型的引號。 反引號字符串,通常稱為模板字面值,可以實現更多的技巧。 除了能夠跨越行之外,它們還可以嵌入其他值。 ```js `half of 100 is ${100 / 2}` ``` 當你在模板字面值中的`$ {}`中寫入內容時,將計算其結果,轉換為字符串并包含在該位置。 這個例子產生`"half of 100 is 50"`。 ## 一元運算符 并非所有的運算符都是用符號來表示,還有一些運算符是用單詞表示的。比如`typeof`運算符,會產生一個字符串的值,內容是給定值的具體類型。 ```js console.log(typeof 4.5) // → number console.log(typeof "x") // → string ``` 我們將在示例代碼中使用`console.log`,來表示我們希望看到求值結果。更多內容請見下一章。 我們所見過的絕大多數運算符都使用兩個值進行操作,而`typeof`僅接受一個值進行操作。使用兩個值的運算符稱為二元運算符,而使用一個值的則稱為一元運算符。減號運算符既可用作一元運算符,也可用作二元運算符。 ```js console.log(- (10 - 2)) // → -8 ``` ## 布爾值 擁有一個值,它能區分兩種可能性,通常是有用的,例如“是”和“否”或“開”和“關”。 為此,JavaScript 擁有布爾(`Boolean`)類型,它有兩個值:`true`和`false`,它們就寫成這些單詞。 ### 比較 一種產生布爾值的方法如下所示: ```js console.log(3 > 2) // → true console.log(3 < 2) // → false ``` `>`和`<`符號分別表示“大于”和“小于”。這兩個符號是二元運算符,通過該運算符返回的結果是一個布爾值,表示其運算是否為真。 我們可以使用相同的方法比較字符串。 ```js console.log("Aardvark" < "Zoroaster") // → true ``` 字符串排序的方式大致是字典序,但不真正是你期望從字典中看到的那樣:大寫字母總是比小寫字母“小”,所以`"Z"<"a"`,非字母字符(`!`,`-`等)也包含在排序中。 比較字符串時,JavaScript 從左向右遍歷字符,逐個比較 Unicode 代碼。 其他類似的運算符則包括`>=`(大于等于),`<=`(小于等于),`==`(等于)和`!=`(不等于)。 ```js console.log("Apple" == "Orange") // → false ``` 在 JavaScript 中,只有一個值不等于其自身,那就是`NaN`(Not a Number,非數值)。 ```js console.log(NaN == NaN) // → false ``` `NaN`用于表示非法運算的結果,正因如此,不同的非法運算結果也不會相等。 ### 邏輯運算符 還有一些運算符可以應用于布爾值上。JavaScript 支持三種邏輯運算符:與(and),或(or)和非(not)。這些運算符可以用于推理布爾值。 `&&`運算符表示邏輯與,該運算符是二元運算符,只有當賦給它的兩個值均為`true`時其結果才是真。 ```js console.log(true && false) // → false console.log(true && true) // → true ``` `||`運算符表示邏輯或。當兩個值中任意一個為`true`時,結果就為真。 ```js console.log(false || true) // → true console.log(false || false) // → false ``` 感嘆號(`!`)表示邏輯非,該運算符是一元運算符,用于反轉給定的值,比如`!true`的結果是`false`,而`!false`結果是`true`。 在混合使用布爾運算符和其他運算符的情況下,總是很難確定什么時候需要使用括號。實際上,只要熟悉了目前為止我們介紹的運算符,這個問題就不難解決了。`||`優先級最低,其次是`&&`,接著是比較運算符(`>`,`==`等),最后是其他運算符。基于這些優先級順序,我們在一般情況下最好還是盡量少用括號,比如說: ```js 1 + 1 == 2 && 10 * 10 > 50 ``` 現在我們來討論最后一個邏輯運算符,它既不屬于一元運算符,也不屬于二元運算符,而是三元運算符(同時操作三個值)。該運算符由一個問號和冒號組成,如下所示。 ```js console.log(true ? 1 : 2); // → 1 console.log(false ? 1 : 2); // → 2 ``` 這個被稱為條件運算符(或者有時候只是三元運算符,因為它是該語言中唯一的這樣的運算符)。 問號左側的值“挑選”另外兩個值中的一個。 當它為真,它選擇中間的值,當它為假,則是右邊的值。 ## 空值 有兩個特殊值,寫成`null`和`undefined`,用于表示不存在有意義的值。 它們本身就是值,但它們沒有任何信息。 在 JavaScript 語言中,有許多操作都會產生無意義的值(我們會在后面的內容中看到實例),這些操作會得到`undefined`的結果僅僅只是因為每個操作都必須產生一個值。 `undefined`和`null`之間的意義差異是 JavaScript 設計的一個意外,大多數時候它并不重要。 在你實際上不得不關注這些值的情況下,我建議將它們視為幾乎可互換的。 ## 自動類型轉換 在引言中,我提到 JavaScript 會盡可能接受幾乎所有你給他的程序,甚至是那些做些奇怪事情的程序。 以下表達式很好地證明了這一點: ```js console.log(8 * null) // → 0 console.log("5" - 1) // → 4 console.log("5" + 1) // → 51 console.log("five" * 2) // → NaN console.log(false == 0) // → true ``` 當運算符應用于類型“錯誤”的值時,JavaScript 會悄悄地將該值轉換為所需的類型,并使用一組通常不是你想要或期望的規則。 這稱為類型轉換。 第一個表達式中的`null`變為`0`,第二個表達式中的`"5"`變為`5`(從字符串到數字)。 然而在第三個表達式中,`+`在數字加法之前嘗試字符串連接,所以`1`被轉換為`"1"`(從數字到字符串)。 當某些不能明顯映射為數字的東西(如`"five"`或`undefined`)轉換為數字時,你會得到值`NaN`。 `NaN`進一步的算術運算會產生`NaN`,所以如果你發現自己在一個意想不到的地方得到了它,需要尋找意外的類型轉換。 當相同類型的值之間使用`==`符號進行比較時,其運算結果很好預測:除了`NaN`這種情況,只要兩個值相同,則返回`true`。但如果類型不同,JavaScript 則會使用一套復雜難懂的規則來確定輸出結果。在絕大多數情況下,JavaScript 只是將其中一個值轉換成另一個值的類型。但如果運算符兩側存在`null`或`undefined`,那么只有兩側均為`null`或`undefined`時結果才為`true`。 ```js console.log(null == undefined); // → true console.log(null == 0); // → false ``` 這種行為通常很有用。 當你想測試一個值是否具有真值而不是`null`或`undefined`時,你可以用`==`(或`!=`)運算符將它與`null`進行比較。 但是如果你想測試某些東西是否嚴格為“false”呢? 字符串和數字轉換為布爾值的規則表明,`0`,`NaN`和空字符串(`""`)計為`false`,而其他所有值都計為`true`。 因此,像`'0 == false'`和`"" == false`這樣的表達式也是真的。 當你不希望發生自動類型轉換時,還有兩個額外的運算符:`===`和`!==`。 第一個測試是否嚴格等于另一個值,第二個測試它是否不嚴格相等。 所以`"" === false`如預期那樣是錯誤的。 我建議使用三字符比較運算符來防止意外類型轉換的發生,避免作繭自縛。但如果比較運算符兩側的值類型是相同的,那么使用較短的運算符也沒有問題。 ### 邏輯運算符的短路特性 邏輯運算符`&&`和`||`以一種特殊的方式處理不同類型的值。 他們會將其左側的值轉換為布爾型,來決定要做什么,但根據運算符和轉換結果,它們將返回原始的左側值或右側值。 例如,當左側值可以轉換為`true`時,`||`運算符會返回它,否則返回右側值。 當值為布爾值時,這具有預期的效果,并且對其他類型的值做類似的操作。 ```js console.log(null || "user") // → user console.log("Agnes" || "user") // → Agnes ``` 我們可以此功能用作回落到默認值的方式。 如果你的一個值可能是空的,你可以把`||`和備選值放在它之后。 如果初始值可以轉換為`false`,那么你將得到備選值。 `&&`運算符工作方式與其相似但不相同。當左側的值可以被轉換成`false`時,`&&`運算符會返回左側值,否則返回右側值。 這兩個運算符的另一個重要特性是,只在必要時求解其右側的部分。 在`true || X`的情況下,不管`X`是什么 - 即使它是一個執行某些惡意操作的程序片段,結果都是`true`,并且`X`永遠不會求值。 `false && X`也是一樣,它是`false`的,并且忽略`X`。 這稱為短路求值。 條件運算符以類似的方式工作。 在第二個和第三個值中,只有被選中的值才會求值。 ## 本章小結 在本章中,我們介紹了 JavaScript 的四種類型的值:數字,字符串,布爾值和未定義值。 通過輸入值的名稱(`true`,`null`)或值(`13`,`"abc"`)就可以創建它們。你還可以通過運算符來對值進行合并和轉換操作。本章已經介紹了算術二元運算符(`+`,`–`,`*`,`/`和`%`),字符串連接符(`+`),比較運算符(`==`,`!=`,`===`,`!==`,`<`,`>`,`<=`和`>=`),邏輯運算符(`&&`和`||`)和一些一元運算符(`–`表示負數,`!`表示邏輯非,`typeof`用于查詢值的類型)。 這為你提供了足夠的信息,將 JavaScript 用作便攜式計算器,但并不多。 下一章將開始將這些表達式綁定到基本程序中。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看