首頁 web前端 js教程 js資料類型詳解

js資料類型詳解

Mar 22, 2018 pm 05:22 PM
javascript 類型 詳解

ES5簡單資料型別(也稱為基本資料型別):Undefined、Null、Boolean、Number和String。還有1 種複雜資料類型—Object,Object 本質上是由一組無序的名值對組成的。 ECMAScript不支援任何建立自訂類型的機制,而所有值最終都將是上述6 種資料類型之一。

1. typeof 運算子-偵測給定變數的資料型別
對一個值使用typeof 運算子可能會傳回下列某個字串:
 "undefined"-如果這個值未定義;
 "boolean"—如果這個值是布林值;
 "string"—如果這個值是字串;
"number"—如果這個值是數值;
" object"—如果這個值是物件或null;
"function"—如果這個值是函數。
下面是幾個使用typeof 運算子的範例:
var message = "some string";
alert(typeof message); // "string"
alert(typeof(message)); // "string"
alert(typeof 95); // "number"
這幾個例子說明,typeof 運算子的運算元可以是變數,也可以是數值字面量。請注意,typeof 是一個運算子而不是函數,因此範例中的圓括號儘管可以使用,但不是必需的。

有時候,typeof 運算子會傳回一些令人困惑但技術上卻正確的值。例如,呼叫typeof null 會回傳"object",因為特殊值null 被認為是空的物件參考。 Safari 5 及之前版本、Chrome 7 及之前版本在對正規表示式呼叫typeof 運算子時會傳回"function",而其他瀏覽器在這種情況下會回傳"object"。從技術角度講,函數在ECMAScript 中是對象,不是一種資料型態。然而,函數也確實有一些特殊的屬性,因此透過typeof 操作符來區分函數和其他物件是有必要的。

2.1 undefined 類型

undefined 型別只有一個值,即特殊的undefined。引入這個值是為了正式區分空物件指標與未經初始化的變數。對於尚未宣告過的變量,只能執行一項操作,即使用typeof 操作符檢測其資料類型。來看下面的範例:

var message; // 這個變數宣告之後預設取得了undefined 值
alert(typeof message); // "undefined"
alert(typeof age ); // "undefined"
結果表明,對未初始化和未宣告的變數執行typeof 操作符都傳回了undefined 值。因為雖然這兩種變數從技術角度看有本質區別,但實際上無論對哪種變數也不可能執行真正的操作。

2.2 null 類型

null 類型是只有一個值的資料型別,這個特殊的值是null。從邏輯角度來看,null 值表示一個空物件指針,而這也正是使用typeof 運算子偵測null 值時會傳回"object"的原因。
如果定義的變數準備在將來用於保存對象,那麼最好將該變數初始化為null 而不是其他值。
實際上,undefined 值是衍生自null 值的,因此ECMA-262 規定對它們的相等性測試要傳回true:
alert(null == undefined); //true
這裡,位於null 和undefined 之間的相等運算子(==)總是回傳true,不過要注意的是,這個運算子會因為比較的目的而轉換其運算元。

儘管null 和undefined 有這樣的關係,但它們的用途完全不同。無論在什麼情況下都沒有必要把一個變數的值明確地設定為undefined,可是同樣的規則對null 卻不適用。換句話說,只要意在保存對象的變數還沒有真正保存對象,就應該明確地讓該變數保存null 值。這樣做不僅可以體現null 作為空物件指標的慣例,而且也有助於進一步區分null 和undefined。

2.3 boolean 類型

boolean 類型只有兩個字面上值:true 和false,區分大小寫。

轉換為false的值:  false ,""(空字串),0和NaN ,null  ,undefined

##2.4 number 類型




number 類型:整數和浮點數數值。
由於儲存浮點數值所需的記憶體空間是儲存整數值的兩倍,因此ECMAScript 會不失時機地將浮點數值轉換為整數值。顯然,如果小數點後面沒有跟任何數字,那麼這個數值就可以當作整數值來保存。
var floatNum1 = 1.; // 小數點後面沒有數字-解析為1
var floatNum2 = 10.0; // 整數-解析為10

浮點數數值的最高精確度是17 位元小數,但在進行算術計算時其精確度遠不如整數。

###關於浮點數值計算會產生捨入誤差的問題,有一點需要明確:這是使用基於IEEE754 數值的浮點計算的通病,ECMAScript 並非獨此一家;其他使用相同數值格式的語言也存在這個問題。 ###

isFinite()函數可以確定一個數值是不是有窮的(是不是位於最小和最大的數值之間)。這個函數在參數位於最小與最大數值之間時會傳回true。

NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用來表示一個本來要傳回數值的運算元未傳回數值的情況(這樣就不會拋出錯誤了) 。例如,在ECMAScript 中,任何數值除以0 會傳回NaN,因此不會影響其他程式碼的執行。 NaN 本身有兩個非同尋常的特點。首先,任何涉及NaN 的操作(例如NaN/10)都會傳回NaN,這個特點在多步驟計算中都有可能導致問題。其次,NaN 與任何值都不相等,包括NaN 本身。例如,下面的程式碼會回傳false:alert(NaN == NaN);  //false
isNaN( )在接收到一個值之後,會嘗試將這個值轉換為數值。某些不是數值的值會直接轉換為數值,例如字串"10"或Boolean 值。而任何不能被轉換為數值的值都會導致這個函數回傳true。請看下面的範例:
alert(isNaN(NaN)); //true alert(isNaN("10")); //false(可以轉換成數值10)
alert(isNaN("blue ")); //true(不能轉換成數值) alert(isNaN(true)); //false(可以轉換成數值1)

isNaN()確實也適用於物件。在基於物件呼叫isNaN()函數時,會先呼叫物件的valueOf()方法,然後確定該方法傳回的值是否可以轉換為數值。如果不能,則基於這個回傳值再呼叫toString()方法,再測試回傳值。而這個過程也是ECMAScript 內建函數和操作符的一般執行流程。

數值轉換:有3 個函數可以把非數值轉換成數值:Number()、parseInt()和parseFloat()。
轉型函數Number()可以用於任何資料類型,而另兩個函數則專門用於把字串轉換成數值。這3 個函數對於同樣的輸入會有傳回不同的結果。
Number()函數的轉換規則如下:
 如果是Boolean 值,true 和false 將分別轉換為1 和0。
 如果是數字值,只是簡單的傳入和回傳。
 如果是null 值,回傳0。
 如果是undefined,則回傳NaN。
 如果是字串,請遵循下列規則:
 如果字串中只包含數字(包括前面帶正號或負號的情況),則將其轉換為十進制數值,即"1"會變成1,"123"會變成123,而"011"會變成11(注意:前導的零被忽略了);
 如果字串中包含有效的浮點格式,如"1.1" ,則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
 如果字串中包含有效的十六進位格式,例如"0xf",則將其轉換為相同大小的十進制整數值;
 如果字串是空的(不包含任何字元),則將其轉換為0;
 如果字串中包含除上述格式之外的字符,則將其轉換為NaN。
 如果是對象,則呼叫對象的valueOf()方法,然後依照前面的規則轉換回傳的值。如果轉換的結果是NaN,則呼叫物件的toString()方法,然後再次依照前面的規則轉換回傳的字串值。
下面還是給幾個具體的例子吧。
var num1 = Number("Hello world!"); //NaN
var num2 = Number(""); //0
var num3 = Number("000011"); //11
var num4 = Number(true); //1
在處理整數的時候更常用的是parseInt()函數。 parseInt()函數在轉換字串時,它會忽略字串前面的空格,直到找到第一個非空格字元。如果第一個字元不是數字字元或負號,parseInt()就會回傳NaN;也就是說,用parseInt()轉換空字串會回傳NaN(Number()對空字元回傳0)。如果第一個字符是數字字符,parseInt()會繼續解析第二個字符,直到解析完所有後續字符或遇到了一個非數字字符。例如,"1234blue"會被轉換為1234,因為"blue"會被完全忽略。類似地,"22.5"會被轉換為22,因為小數點並不是有效的數字字元。
如果字串中的第一個字符是數字字符,parseInt()也能夠識別出各種整數格式。如果字串以"0x"開頭且後跟數字字符,就會將其當作一個十六進制整數;如果字串以"0"開頭且後跟數字字符,則會將其當作一個八進制數來解析。
為了更好地理解parseInt()函數的轉換規則,以下給出一些例子:
var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10(十六進位數) var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 56 (八進位數) var num6 = parseInt("70"); // 70(十進位數)
var num7 = parseInt("0xf"); // 15(十六進位數)
var num = parseInt("070");//在ES5 JavaScript 引擎中,parseInt( )已經不具有解析八進位值的能力
parseInt()函數提供第二個參數:轉換時使用的基數(即多少進位) 。
var num = parseInt("0xAF", 16); //175 var num1 = parseInt("AF", 16); //175
如果指定了16 作為第二個參數,字串可以不帶前面的"0x"。 
與parseInt()函數類似,parseFloat()也是從第一個字元(位置0)開始解析每個字元。而且也是一直解析到字串結尾,或是解析到遇見一個無效的浮點數位字元為止。即字串中的第一個小數點是有效的,而第二個小數點就是無效的了,因此它後面的字串將被忽略。 "22.34.5"將會轉換為22.34。
除了第一個小數點有效之外,parseFloat()與parseInt()的第二個差異在於它總是會忽略前導的零。 parseFloat()可以辨識前面討論過的所有浮點數值格式,也包括十進制整數格式。但十六進位格式的字串則總是會被轉換成0。由於parseFloat()只解析十進制值,因此它沒有用第二個參數指定基數的用法。最後也要注意一點:如果字串包含的是一個可解析為整數的數(沒有小數點,或小數點後面都是零),parseFloat()會傳回整數。以下是使用parseFloat()轉換數值的幾個典型範例。
var num1 = parseFloat("1234blue"); //1234 (整數) var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.5"); //22.5 varnum44. = parseFloat("22.34.5"); //22.34
var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000

2.5 String 類型

#ECMAScript

ECMAScript 中的字串是不可變的,也就是說,字串一旦被創建,它們的值就不能改變。例如:
var lang = "Java";
lang = lang + "Script";
以上範例中的變數lang 開始時包含字串"Java"。而第二行程式碼則把lang 的值重新定義為"JavaScript"。實現這個操作的過程如下:先建立一個能容納10 個字元的新字串,然後在這個字串中填入"Java"和"Script",最後一步是銷毀原來的字串"Java"和字串" Script",因為這兩個字串已經沒用了。
var age = 11; var ageAsString = age.toString(); // 字串"11"
var found = true; var foundAsString = found.toString(); // 字串"true"
數值、布林值、物件和字串值(沒錯,每個字串也都有一個toString()方法,該方法傳回字串的副本)都有toString()方法。但null 和undefined 值沒有這個方法。
在不知道要轉換的值是不是null 或undefined 的情況下,也可以使用轉型函數String(),這個函數能夠將任何類型的值轉換為字串。 String()函數遵循下列轉換規則:
 如果值有toString()方法,則呼叫該方法(沒有參數)並傳回對應的結果;
 如果值是null,則傳回"null";
 如果值是undefined,則傳回"undefined"。
因為null 和undefined 沒有toString()方法,所以String()函數就回傳了這兩個值的字面量。

Tip:要把某個值轉換為字串,可以使用加號運算子把它與一個字串("")加在一起。


2.6 Object 型別



ECMAScript 中的物件其實就是一組資料與功能的集合。建立:var o = new Object();
Object 的每個實例都有下列屬性和方法。
 constructor:保存著用於建立目前物件的函數。對於前面的例子而言,建構子(constructor)就是Object()。
 hasOwnProperty(propertyName):用於檢查給定的屬性在目前物件實例中是否存在。其中,作為參數的屬性名稱(propertyName)必須以字串形式指定(例如:o.hasOwnProperty("name"))。
 isPrototypeOf(object):用來檢查傳入的物件是否為傳入物件的原型。
 propertyIsEnumerable(propertyName):用來檢查給定的屬性是否能夠使用for-in 語句來列舉。與hasOwnProperty()方法一樣,作為參數的屬性名稱必須以字串形式指定。
 toLocaleString():傳回物件的字串表示,該字串與執行環境的地區對應。
 toString():傳回物件的字串表示。
 valueOf():傳回物件的字串、數值或布林值表示。通常與toString()方法的傳回值相同。

由於在ECMAScript 中Object 是所有物件的基礎,因此所有物件都具有這些基本的屬性和方法。

從技術角度講,ECMA-262 中物件的行為不一定適用於JavaScript 中的其他物件。瀏覽器環境中的對象,例如BOM 和DOM 中的對象,都屬於宿主對象,因為它們是由宿主實作提供和定義的。 ECMA-262 不負責定義宿主對象,因此宿主對象可能會也可能不會繼承Object。

3. 注意


(1)任何運算元與NaN 進行關係比較,結果都是false。 ###(2)null == undefined 會傳回true,因為它們是類似的值;但null === undefined 會傳回false,因為它們是不同類型的值。 ###

以上是js資料類型詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Win11管理員權限取得詳解 Win11管理員權限取得詳解 Mar 08, 2024 pm 03:06 PM

Windows作業系統是全球最受歡迎的作業系統之一,其新版本Win11備受矚目。在Win11系統中,管理員權限的取得是一個重要的操作,管理員權限可以讓使用者對系統進行更多的操作和設定。本文將詳細介紹在Win11系統中如何取得管理員權限,以及如何有效地管理權限。在Win11系統中,管理員權限分為本機管理員和網域管理員兩種。本機管理員是指具有對本機電腦的完全管理權限

Oracle SQL中的除法運算詳解 Oracle SQL中的除法運算詳解 Mar 10, 2024 am 09:51 AM

OracleSQL中的除法運算詳解在OracleSQL中,除法運算是一種常見且重要的數學運算運算,用來計算兩個數相除的結果。除法在資料庫查詢中經常用到,因此了解OracleSQL中的除法運算及其用法是資料庫開發人員必備的技能之一。本文將詳細討論OracleSQL中除法運算的相關知識,並提供具體的程式碼範例供讀者參考。一、OracleSQL中的除法運算

PHP模運算子的作用及用法詳解 PHP模運算子的作用及用法詳解 Mar 19, 2024 pm 04:33 PM

PHP中的模運算子(%)是用來取得兩個數值相除的餘數的。在本文中,我們將詳細討論模運算子的作用及用法,並提供具體的程式碼範例來幫助讀者更好地理解。 1.模運算子的作用在數學中,當我們將一個整數除以另一個整數時,就會得到一個商和一個餘數。例如,當我們將10除以3時,商數為3,餘數為1。模運算子就是用來取得這個餘數的。 2.模運算子的用法在PHP中,使用%符號來表示模

linux系統呼叫system()函數詳解 linux系統呼叫system()函數詳解 Feb 22, 2024 pm 08:21 PM

Linux系統呼叫system()函數詳解系統呼叫是Linux作業系統中非常重要的一部分,它提供了一種與系統核心互動的方式。其中,system()函數是常用的系統呼叫函數之一。本文將詳細介紹system()函數的使用方法,並提供對應的程式碼範例。系統呼叫的基本概念系統呼叫是使用者程式與作業系統核心互動的一種方式。使用者程式透過呼叫系統呼叫函數來請求作業系統

視訊矩陣帳號怎麼做?它的矩陣帳號都有哪些類型呢? 視訊矩陣帳號怎麼做?它的矩陣帳號都有哪些類型呢? Mar 21, 2024 pm 04:57 PM

隨著短影片平台的盛行,影片矩陣帳號行銷已成為一種新興行銷方式。透過在不同平台上建立和管理多個帳號,企業和個人能夠實現品牌推廣、粉絲成長和產品銷售等目標。本文將為您探討如何有效運用視訊矩陣帳號,並介紹不同類型的視訊矩陣帳號。一、視訊矩陣帳號怎麼做?要做好視訊矩陣帳號,需要遵循以下幾個步驟:首先要明確你的影片矩陣帳號的目標是什麼,是為了品牌傳播、粉絲成長還是產品銷售。明確目標有助於制定相應的策略。 2.選擇平台:根據你的目標受眾,選擇合適的短影片平台。目前主流的短視頻平台有抖音、快手、火山小影片等。

Linux的curl指令詳解 Linux的curl指令詳解 Feb 21, 2024 pm 10:33 PM

Linux的curl命令詳解摘要:curl是一種強大的命令列工具,用於與伺服器進行資料通訊。本文將介紹curl指令的基本用法,並提供實際的程式碼範例,幫助讀者更好地理解和應用該指令。一、curl是什麼? curl是命令列工具,用於發送和接收各種網路請求。它支援多種協議,如HTTP、FTP、TELNET等,並提供了豐富的功能,如檔案上傳、檔案下載、資料傳輸、代

深入了解Promise.resolve() 深入了解Promise.resolve() Feb 18, 2024 pm 07:13 PM

Promise.resolve()詳解,需要具體程式碼範例Promise是JavaScript中一種用來處理非同步操作的機制。在實際開發中,常常需要處理一些需要依序執行的非同步任務,而Promise.resolve()方法就是用來傳回一個已經Fulfilled狀態的Promise物件。 Promise.resolve()是Promise類別的靜態方法,它接受一個

詳細解析C語言學習路線 詳細解析C語言學習路線 Feb 18, 2024 am 10:38 AM

C語言作為一門廣泛應用在軟體開發領域的程式語言,是許多程式設計師初學者的首選。學習C語言不僅可以幫助我們建立程式設計的基礎知識,還可以提升我們解決問題和思考的能力。本文將詳細介紹一條C語言學習的路線圖,幫助初學者更好地規劃自己的學習進度。 1.學習基本文法在開始學習C語言之前,我們首先需要先了解C語言的基本文法規則。這包括變數和資料類型、運算子、控制語句(如if語句、

See all articles