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
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()函數就回傳了這兩個值的字面量。
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()方法的傳回值相同。
從技術角度講,ECMA-262 中物件的行為不一定適用於JavaScript 中的其他物件。瀏覽器環境中的對象,例如BOM 和DOM 中的對象,都屬於宿主對象,因為它們是由宿主實作提供和定義的。 ECMA-262 不負責定義宿主對象,因此宿主對象可能會也可能不會繼承Object。
以上是js資料類型詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

WebStorm Mac版
好用的JavaScript開發工具

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