JavaScript變數與數據類型詳解

来源:https://www.cnblogs.com/itbsl/archive/2018/11/22/10002415.html
-Advertisement-
Play Games

變數 變數來源於數學,是電腦語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。 變數的作用就是用於存儲值。 語法: 聲明變數時,總是以關鍵字 打頭。任何情況下都應該這樣做。然後給變數指定名稱。在聲明變數時,也可以給它賦值,方法是在變數名後面加上等號和值。賦值語句總是以分號結束。 說明 ...


變數

變數來源於數學,是電腦語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。

變數的作用就是用於存儲值。

語法:

聲明變數時,總是以關鍵字var打頭。任何情況下都應該這樣做。然後給變數指定名稱。在聲明變數時,也可以給它賦值,方法是在變數名後面加上等號和值。賦值語句總是以分號結束。

var 變數名;
//或
var 變數名 = 值;

說明:儘管省略關鍵字var,JavaScript也不會報錯,但是這會導致變數變成全局變數,在JavaScript使用全局變數並不是一個好習慣。分號也不是必須的,但是加上分號可讀性更好,同時也能避免代碼壓縮時出錯。

示例:

var msg;
var age = 20;
var sex = 'Male';
var isReal = true;

JavaScript的變數是鬆散類型的,在JavaScript中聲明變數無需指定數據類型,它可以用來保存任何類型的數據。正是由於定義變數時無需指定類型,所以在JavaScript中變數的類型並不是固定的,比如上面的isReal變數本來是布爾型的,但是你也可以再把一個字元串賦給isReal變數,如isReal = "ABC";,所以說,變數僅僅是一個用於保存值的占位符。

對於未賦值的變數,系統會預設給一個undefined值,上面示例中的msg的值就是undefined

變數的數據類型

ECMAScript中有5種基本數據類型和1種引用類型。

基本數據類型:

undefined, null, boolean, number, string

引用數據類型:

object

typeof操作符

鑒於ECMAScript是鬆散類型的,因此需要有一種手段來檢測給定變數的數據類型——typeof 就是負責提供這方面信息的操作符。對一個值使用 typeof 操作符可能返回下列某個字元串:

  • "undefined"——如果這個值未定義;
  • "boolean"——如果這個值是布爾值;
  • "string"——如果這個值是字元串;
  • "number"——如果這個值是數值;
  • "object"——如果這個值是對象或 null;
  • "function"——如果這個值是函數。

下麵是幾個使用 typeof 操作符的例子:

var msg = "itbsl";
alert(typeof msg);  //string
alert(typeof(msg)); //string
alert(typeof 25);   //number

這幾個例子說明,typeof 操作符的操作數可以是變數(msg),也可以是數值字面量。註意,typeof 是一個操作符而不是函數,因此例子中的圓括弧儘管可以使用,但不是必需的。

有些時候,typeof 操作符會返回一些令人迷惑但技術上卻正確的值。比如,調用 typeof null
會返回"object",因為特殊值 null 被認為是一個空的對象引用。

從技術角度講,函數在 ECMAScript 中是對象,不是一種數據類型。然而,函數也確實有一些特殊的屬性,因此通過 typeof 操作符來區分函數和其他對象是有必要的。

undefined

Undefined 類型只有一個值,即特殊的 undefined。在使用 var 聲明變數但未對其加以初始化時, 這個變數的值就是 undefined,例如:

var message;
alert(message == undefined); //true

這個例子只聲明瞭變數 message,但未對其進行初始化。比較這個變數與 undefined 字面量,結果表明它們是相等的。

一般而言,不存在需要顯式地把一個變數設置為 undefined 值的情況。字面值undefined 的主要目的是用於比較,而 ECMA-262 第 3 版之前的版本中並沒有規定這個值。第 3 版引入這個值是為了正式區分空對象指針與未經初始化的變數。

哪些情況下的值會是undefined呢?

  • 沒有return語句的函數的返回值
  • 未賦值的變數的值
  • 稀疏數組中不存在的數組元素的值
  • 訪問不存在的屬性的值
  • 訪問已刪除屬性的值

稀疏數組是有些索引處有值,而其他索引處沒有值得數組。假設有一個長度為10的數組,在索引1000處添加一個新元素後,索引10~999處的值都是undefined。你可以這樣認為,這猶如創建了989個變數,但沒有對它們進行初始化。雖然這些變數沒有值,但它們都要占用電腦記憶體,因此除非有充分的理由,否則千萬不要創建稀疏數組。請註意,undefined是一個值,而不是字元串,undefined和字元串"undefined"並不是一個東西。

undefined到底是什麼呢?它其實並不複雜。你可以這麼認為:對於任何還沒值(即還未初始化)的東西,都會將undefined賦給它。

undefined值的類型為什麼是undefined?

我認為原因如下:它不是對象,不是數字、字元串或布爾值,也不是任何明確的東西。既然如此,為何不將這種類型也視為未定義的呢?這是JavaScript怪異的灰色地帶之一,你不得不接受。

null

Null 類型是第二個只有一個值的數據類型,這個特殊的值是 null。從邏輯角度來看,null 值表示一個空對象指針,而這也正是使用 typeof 操作符檢測 null 值時會返回"object"的原因,如下麵
的例子所示:

var car = null;
alert(typeof car); //"object"

如果定義的變數準備在將來用於保存對象,那麼最好將該變數初始化為 null 而不是其他值。這樣一來,只要直接檢查 null 值就可以知道相應的變數是否已經保存了一個對象的引用。

實際上,undefined 值是派生自 null 值的,因此 ECMA-262 規定對它們的相等性測試要返回 true:

alert(null == undefined);    //true

這裡,位於 null 和 undefined 之間的相等操作符(==)總是返回 true,不過要註意的是,這個操作符出於比較的目的會轉換其操作數。

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

我們在使用getElementById獲取dom對象時,如果指定的id不存在,它返回的值是null,而不是undefined。null到底是什麼?getElementById為何不返回undefined?

答: 在很多語言中,都有一個表示”無對象“的概念,這挺好。就拿方法document.getElementById來說吧,是不是要求它返回一個對象?如果它無法返回一個對象呢?在這種情況下,我們希望返回一個含義如下的值:要是有對象,我就會是一個對象,可當前沒有。這正是null的含義。我們以後還會經常碰到將變數的值顯式的設置為null,意思是說我原本要將一個對象賦給這個變數,但現在沒有這樣的對象。你可能撓著頭說,為何不使用undefined來表達這種意思呢?很多人都這麼想。原因是JavaScript剛面世時時這麼想的:用一個值表示變數還未初始化,用另一個值表示沒有對象可賦給變數。這並不完美,而且顯得有些多餘,但現實情況就是如此。你只需牢記undefined和null各自的用途,並知道下麵一點就行了:在應該提供一個對象,但無法創建或找到時,將提供null;在變數未初始化、對象沒有指定屬性或數組沒有指定元素時,將返回undefined。

boolean

Boolean 類型是 ECMAScript 中使用得最多的一種類型,該類型只有兩個字面值:true 和 false。這兩個值與數字值不是一回事,因此 true 不一定等於 1,而 false 也不一定等於 0。以下是為變數賦Boolean 類型值的例子:

var found = true;
var lost = false;

需要註意的是,Boolean 類型的字面值 true 和 false 是區分大小寫的。也就是說,True 和 False(以及其他的混合大小寫形式)都不是 Boolean 值,只是標識符。

雖然 Boolean 類型的字面值只有兩個,但 ECMAScript 中所有類型的值都有與這兩個 Boolean 值等價的值。要將一個值轉換為其對應的 Boolean 值,可以調用轉型函數 Boolean(),如下例所示:

var message = "Hello world!";
var messageAsBoolean = Boolean(message);

在這個例子中,字元串 message 被轉換成了一個 Boolean 值,該值被保存在 messageAsBoolean變數中。可以對任何數據類型的值調用 Boolean()函數,而且總會返回一個 Boolean 值。至於返回的這個值是 true 還是 false,取決於要轉換值的數據類型及其實際值。下表給出了各種數據類型及其對應的轉換規則。

數據類型 轉換為true的值 轉換為false的值
Boolean true false
String 任何非空字元串 ""(空字元串)
Number 任何非零數字值(包括無窮大) 0和NaN
Object 任何對象 null
Undefined undefined

這些轉換規則對理解流控制語句(如if語句)自動執行相應的Boolean轉換非常重要,請看下麵的代碼:

var message = "Hello world!";
if (message){
    alert("Value is true");
}

運行這個示例,就會顯示一個警告框,因為字元串 message 被自動轉換成了對應的 Boolean 值 (true)。由於存在這種自動執行的 Boolean 轉換,因此確切地知道在流控制語句中使用的是什麼變數 至關重要。錯誤地使用一個對象而不是一個 Boolean 值,就有可能徹底改變應用程式的流程。

number

Number 類型應該是 ECMAScript 中最令人關註的數據類型了,這種類型使用 IEEE754 格式來表示整數和浮點數值(浮點數值在某些語言中也被稱為雙精度數值)。

數值範圍

由於記憶體的限制,ECMAScript 並不能保存世界上所有的數值。ECMAScript 能夠表示的最小數值保 存在 Number.MIN_VALUE 中——在大多數瀏覽器中,這個值是 5e-324;能夠表示的最大數值保存在 Number.MAX_VALUE 中——在大多數瀏覽器中,這個值是 1.7976931348623157e+308。如果某次計算的 結果得到了一個超出 JavaScript 數值範圍的值,那麼這個數值將被自動轉換成特殊的 Infinity 值。具 體來說,如果這個數值是負數,則會被轉換成-Infinity(負無窮),如果這個數值是正數,則會被轉 換成 Infinity(正無窮)。

如上所述,如果某次計算返回了正或負的 Infinity 值,那麼該值將無法繼續參與下一次的計算, 因為 Infinity 不是能夠參與計算的數值。要想確定一個數值是不是有窮的(換句話說,是不是位於最 小和最大的數值之間),可以使用 isFinite()函數。這個函數在參數位於最小與最大數值之間時會返 回 true,如下麵的例子所示:

var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); //false

儘管在計算中很少出現某些值超出表示範圍的情況,但在執行極小或極大數值的計算時,檢測監控這些值是可能的,也是必需的。

NaN

NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用於表示一個本來要返回數值的操作數未返回數值的情況(這樣就不會拋出錯誤了)。例如,在其他編程語言中,任何數值除以 0 都會導致錯誤, 從而停止代碼執行。但在 ECMAScript 中,0除以 0 會返回 NaN,正數除以 0 返回 Infinity,負數除以 0 返回-Infinity,因此不會影響其他代碼的執行。

NaN 本身有兩個非同尋常的特點。首先,任何涉及 NaN 的操作(例如 NaN/10)都會返回 NaN,這個特點在多步計算中有可能導致問題。其次,NaN 與任何值都不相等,包括 NaN 本身。例如,下麵的代碼會返回 false:

alert(NaN == NaN); //false

針對 NaN 的這兩個特點,ECMAScript 定義了 isNaN()函數。這個函數接受一個參數,該參數可以
是任何類型,而函數會幫我們確定這個參數是否“不是數值”。isNaN()在接收到一個值之後,會嘗試
將這個值轉換為數值。某些不是數值的值會直接轉換為數值,例如字元串"10"或 Boolean 值。而任何
不能被轉換為數值的值都會導致這個函數返回 true。請看下麵的例子:

alert(isNaN(NaN));    //true
alert(isNaN(10));     //false(10 是一個數值)
alert(isNaN("10"));   //false(可以被轉換成數值 10)
alert(isNaN("blue")); //true(不能轉換成數值)
alert(isNaN(true));   //false(可以被轉換成數值 1)

這個例子測試了 5 個不同的值。測試的第一個值是 NaN 本身,結果當然會返回 true。然後分別測試了數值 10 和字元串"10",結果這兩個測試都返回了 false,因為前者本身就是數值,而後者可以被轉換成數值。但是,字元串"blue"不能被轉換成數值,因此函數返回了 true。由於 Boolean 值 true可以轉換成數值 1,因此函數返回false。

既然NaN(Not a Number)指的是”不是數字“,那它是什麼呢?如果指出它是什麼,而非它不是什麼,是不是更容易理解呢?那你認為它是什麼呢?為獲得一點線索,可檢查類型:

var test = 0/0;
console.log(typeof test); //number

到底是怎麼回事兒?NaN的類型是數字?一個不是數字的東西,其類型怎麼可能是數字呢?你可以這樣想:NaN是一個糟糕的名稱;與其稱之為”不是數字“,還不如稱之為”無法表示的數字“(必須承認,這樣首字母縮寫將不那麼出色)。如果這樣想,就可以認為NaN是一個數字,只是無法表示而已(至少對電腦來說如此)。

string

String 類型用於表示由零或多個 16 位 Unicode 字元組成的字元序列,即字元串。字元串可以由雙引號(")或單引號(')表示,因此下麵兩種字元串的寫法都是有效的:

var firstName = "Nicholas";
var lastName = 'Zakas';

與 PHP 中的雙引號和單引號會影響對字元串的解釋方式不同,ECMAScript 中的這兩種語法形式沒有什麼區別。用雙引號表示的字元串和用單引號表示的字元串完全相同。

其它類型數據和字元串進行+操作時,會將其它類型數據轉為字元串,然後同字元串拼接。

var num = 3;
var isTrue = true;
var str = "123";

var result1 = num + str;
var result2 = isTrue + str;
alert(result1); //3123
alert(result2); //true123

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要: 本插件基於layui.layedit,增加了HTML源碼模式,片插入功能添加alt屬性(layupload),視頻插入功能,全屏功能,段落格式,字體顏色設置,右鍵菜單操作,插入錨點,水平線功能。 所有拓展功能菜單按鈕圖標均引用自layui自帶圖標。 演示地址:kz.layedit 一、基礎拓 ...
  • RegExp語法(包含ES2018標準) 註意:本次所有代碼都僅在Chrome 70中進行測試 1. 正則表達式是什麼? 正則表達式是用於匹配字元串中字元組合的模式。(mdn) 簡單來說,正則表達式是用來提取、捕獲文本(匹配字元)的。 2. 創建: 字面量: 構造函數: 3. 實例屬性: 每個正則表 ...
  • 安裝 cordova 新建項目 運行項目 編譯項目 修改編譯輸出 打開vue項目目錄下麵的index.html,添加 打開/config/index.js 編譯打包 先刪除 cordova項目下的www文件夾里的東西 執行編譯vue項目將輸出到 cordova 項目目錄下的www文件內 添加andr ...
  • 寫JS時,不斷翻看HTML,確保`querySelector`能取到期望的元素。 改HTML時,一個個排查JS文件,確保其沒受影響。 類似的情況很影響我們工作效率。 ...
  • 基於CANVAS的簡單畫圖組件讓你用類似於dom的方式,在canvas上畫圖,感覺會不會很爽。 主頁:http://graph.jm47.com/示例:http://graph.jm47.com/example/index.html 安裝 直接從github下載 https://github.com ...
  • 有時候富文本渲染到頁面的時候 會連帶標簽一起渲染出來。 解決辦法: 首先引用 <script src="https://cdn.jsdelivr.net/npm/[email protected]/fuwenben.js"></script> 然後把富文本數據用 htmlDecode() 轉換一下 就可以 ...
  • input:focus{ outline: none; border: 1px solid #fff; } 或者 input[type=text]:focus{ outline: none; border: 1px solid #fff; } ...
  • @[toc] 構造函數與原型介紹 1.函數與函數的原型對象(prototype object): 在JavaScript中,創建一個函數A, 瀏覽器就會在記憶體中創建一個對象B,而且該函數預設會有一屬性 prototype 指向這個對象(即:prototype屬性的值) 這個對象B就是函數A的 原型對 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...