JavaScript——變量與基本數據類型

前言

JavaScript中的變量為松散類型,所謂松散類型就是指當一個變量被申明出來就可以保存任意類型的值,就是不像SQL一樣申明某個鍵值為int就只能保存整型數值,申明varchar只能保存字符串。一個變量所保存值的類型也可以改變,這在JavaScript中是完全有效的,只是不推薦。相比較于將變量理解為“盒子“,《JavaScript編程精解》中提到應該將變量理解為“觸手”,它不保存值,而是抓取值。這一點在當變量保存引用類型值時更加明顯。

JavaScript中變量可能包含兩種不同的數據類型的值:基本類型引用類型。基本類型是指簡單的數據段,而引用類型指那些可能包含多個值的對象。本文主要介紹基本數據類型及其特點。

基本類型包括:NullUndefinedNumberStringBoolean。引用類型主要包括:ObjectArrayDateRegExpFunction

接下來主要介紹五種基本類型。引用類型本菜希望在以后的博文中與大家交流。

申明

JavaScript中申明變量通過var操作符,申明的變量會成為其所在作用域內的局部變量,意思就是在全局申明的變量就是通常所說的全局變量,在函數內申明的變量就是以該函數為作用域的局部變量,局部變量會在函數執行完畢后被銷毀,未通過var操作符申明的變量會默認為全局變量。需要一次申明多個變量時可以通過單var操作符的方式,代碼會更加簡潔。

var name = 'susan',age = '23',sex = 'female';

typeof操作符

在介紹基本類型值之前,先說下typeof操作符,typeof操作符會返回數據類型的字符串表示。用它來檢測基本數據類型比較有效率,而檢測引用類型時通常用instanceof操作符。

typeof undefined; //undefined
typeof 2015; //number
typeof false; //boolean
typeof null; //object
typeof 'abc'; //string
typeof {a:1}; //object

這里有一點不同的是,typeof在對null進行檢測時會返回字符串“object”,因為在JavaScript中null被當作空對象指針,這一點在Douglas的《JavaScript語言精粹》也被吐槽過,不過了解下就可以了。

Undefined類型

Undefined類型只有一個特殊值即undefiend。所有未初始化的變量均會保存該值。

var aa;
alert(aa); //undefined

?這里要注意一點,undefined與未定義的變量不同,如果在代碼中調用某個未定義(申明)的變量,解析器會提示如下信息。

?

意為這個變量沒有被申明過,查找的方式是通過沿作用域鏈向上搜索,如果在全局環境中都沒有找到該變量的申明則拋出錯誤,這部分內容本菜以后和大家討論。

Null類型

Null類型同樣也只包含一個值即null,從邏輯上看它被當作空對象指針,正是由于這個特性,如果你定義某個變量時不確定當前賦何值,但未來需要賦某個object類型值時,正確的方式就是將該變量初始化為null。

這里提一句,在對null與undefined進行==比較時,會返回true,據《JavaScript高級程序設計》說,undefined派生自null,所以ECMA-262規定它倆相等性操作為true。

Boolean類型

Boolean俗稱布爾,僅包括兩個值:true和false。這里有一個Boolean()轉型函數,它可以對任意類型的值使用,作用就是將其它類型值轉換為布爾型。轉換規則主要如下。

String型:非空字符串-true,空字符串("")-false

Number型:任何非0數-true,0與NaN-false

Object型:任何對象-true,null-false

Undefined型:false

但并非使用該轉型函數才會使數據類型轉換,當遇到if語句時會對數據進行自動的類型轉換。自動類型轉換有其優點也有弊端,這里不再擴展。重要的是通過Boolean轉型函數理解轉換規則,以便在編碼中使用。

這里舉個非常簡單的例子:在某個app中需要通過檢測本地是否緩存了用戶ID來判斷需不需要登錄操作。

if (!localStorage['memberId']) {//登陸操作    
}

這里當本地沒有用戶ID時,localStorage值為undefined,轉換后為false值,非運算后為true,執行登錄操作。而不需要寫成localStorage['memberId'] === undefined等等。

Number類型

JavaScript中的Number類型支持十進制、八進制以及十六進制的數值。關于浮點型的數值這里有幾點要注意,在JavaScript中,0.1與.1相同,但是這種省略的寫法是不推薦的。由于保存浮點型所需的內存是整型的兩倍,所以JavaScript會在適當的時候將不必要的浮點型轉換為整型,比如浮點型的10.0會自動保存為整型的10。特別需要注意的一點是,浮點型運算精度遠不如整型,例子如下:

console.log(0.1 + 0.2);

可以看到,運算并沒有得到預期的結果,所以在實際運算中要注意這一點,同時這個例子也反映出了JavaScript中浮點型的最高精度即為顯示的17位小數。過大或過小的數可以使用科學計數法e來表示,這一點就不再贅述。

Infinity

JavaScript能夠保存的數值并不是無限大小的,當大于或小于某個界限時,該值會被自動轉換為特殊值——Infinity,Infinity也包括正負兩種。檢測一個數值是否為Infinity可以通過isFinite()函數。

NaN

在Number類型中還有個很特殊的值,那就是NaN,即非數值(Not a Number)。這個特殊值的存在是為了避免在某些需要返回數值時因為運算問題未返回數值報錯,影響程序運行。比如一個數除以0,在其他編程語言中會拋出錯誤,而在JavaScript中會返回NaN。

NaN有兩個特點:1.任何涉及NaN的操作均會返回NaN,2.NaN不與任何值相等,包括他自己=.=,即做NaN == NaN的相等性驗證時會返回false。

檢測一個值是否為NaN可以用isNaN()函數,它會嘗試將接收的參數轉換為數值,意思就是字符串“10”可以被轉換成數值10,而字符串“color”不行。轉換成功返回false,反之為true。

數值轉換

Number類型的數值轉換方式可能通過三個函數:Number()parseInt()parseFloat()。由于Number()轉換函數轉換規則奇葩(復雜且不合理),所以這里主要介紹parseInt()與parseFloat()。

首先申明一點,parseInt()與parseFloat()函數是專門用于把字符串轉換成數字的。這一點可能會導致困惑,明明是用來轉換數值的,為什么要接收字符串。舉個簡單的例子,parseInt()在接收3.14這個浮點型數值時,會自動轉換成該值的字符串表示——“3.14”,它會把3.14轉換為3從邏輯上來看并不是它真的能對數值取整,而是在解析“3.14”這個字符串時遇到小數點“.”這個不能轉換為數值的字符時會自動省略后面的東西。

有了以上的認識,我們來了解這兩個函數具體的轉換規則:

parseInt()函數在轉換字符串時,會忽略前面的空格,直到找到第一個非空字符。如果第一個非空字符不是數字字符或者負號則返回NaN。如果第一個字符是數值字符會繼續解析第二個,直到解析完整個字符串或者遇到了一個非數值字符(如上面3.14的例子)。

parseInt(""); //NaN
parseInt(3.14); //3
parseInt("4.12"); //4
parseInt("xyx123"); //NaN
parseInt("123xyx"); //123

?parseInt()同樣可以解析二進制、八進制與十六進制的數值,由于ECMAScript版本不同對非十進制數解析時會出現分歧,所以最好傳入第二個參數作為基數。

parseInt(100111,2); //39
parseInt(123,8); //83
parseInt("0xBC",16); //188

?與parseInt()函數類似,parseFloat()也是從第一個字符開始解析,直到字符串末尾或者遇到一個無效的浮點數字字符為止。比如,第一個小數點是有效的,第二個是無效的,因此后面的字符會被忽略。與parseInt()不同的是它始終會忽略開頭的0,且不具備傳入基數的能力,即只能解析十進制數值。

parseFloat("123xyx"); //123
parseFloat("xyx123"); //NaN
parseFloat("012.3"); //12.3
parseFloat("34.5"); //34.5
parseFloat("34.5.6"); //34.5

String類型

在JavaScript中字符串使用單、雙引號沒有區別,只是要注意起始與結束保持一致即可。JavaScript中也有轉義字符,與其他語言基本一致,這里就不再贅述了。任何字符串都可以通過length屬性來獲取其長度。

var str = 'Hello World';
alert(str.length); //11

?這里簡要說一個特點,ECMAScript中字符串一旦創建了就不能被改變,例如拼接某兩個字符串,首先是創建一個新的字符串,將原有的字符串組合后裝入其中,最后銷毀原來的兩個字符串。所以并不是像看上去那樣進行簡單的拼接。

字符串轉換

要將一個值轉換為字符串類型有兩個方式:1.toString()方法,2.String()轉型函數。這兩個方法的區別就是null,undefined值沒有toString()方法,而任何類型值都可以使用String()函數。

var num = 123;
num.toString(); //"123"
var boo = false;
boo.toString(); //"false"

?多數情況下,調用toString()方法不必傳遞參數。當要確定輸出數值的不同進制時,可以傳入一個基數。

var num = 10;
num.toString(); //"10"
num.toString(2); //"1010"
num.toString(8); //"12"
num.toString(10); //"10"
num.toString(16); //"a"

在不知道要轉換的值是不是null或undefined時,可以使用String()方法。其規則為:如果該值有toString()方法則調用該方法,如果是null或undefined則返回其字符串表示.....好吧,總之用String()轉型函數就不會錯。

String(10); //"10"
String(true); //"true"
String(null); //"null"
String(undefined); //"undefined"

感謝您的瀏覽,希望能有所幫助。

轉載于:https://www.cnblogs.com/ghost-xyx/p/4418750.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259078.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259078.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259078.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode可以打開jupyternotebook嗎_剛剛,官方宣布 VS Code 支持 Python 全開發了!

關注Python高校每天早上23:10準時推送北京時間 2019 年 9 月 21 日,PyCon China 2019 在上海舉行。在下午的演講中,來自微軟開發工具事業部的資深研發工程師韓駿做了主題為《Python 與 Visual Studio Code 在人工智能應用中的最佳 Azure 實踐》的演講。在…

C++類的內聯成員函數應放在哪

今天復習C Primer的時候,看到了關于C類的內聯成員函數的放置,應該放在頭文件中。那么這到底是為什么 呢?僅僅是一種代碼規范問題還是必須這樣做呢? 下面我就來講講我自己的理解吧。要徹底理解這個問題,首先就要了解下函…

python selenium自動化(三)Chrome Webdriver的兼容

當一個自動化測試被實現在一個瀏覽器之后,我們會希望我們的測試能夠覆蓋到盡量多的別的瀏覽器。通過跨平臺的測試來保證我們的程序在多個瀏覽器下都能正常工作。 在安裝了selenium之后,firefox webdriver和IE webdriver就已經是ready to use的了&#xf…

NDK 編譯armebai-v7a的非4字節對齊crash Fatal signal 7 (SIGSEGV) 錯誤解決

一直都是編譯armabi的。沒有不論什么問題,這個架構是軟件模擬浮點運算的。后來看到NDK文檔上說armabi-v7a是針對有硬件處理浮點計算的arm cpu的。 于是就改動配置編譯armebai-v7a的so文件。 結果是編譯沒問題。一執行就是crash掉,Fatal signal 7 (SIGSEG…

作業三

作業三 第一章問題:書上寫的“Bug的多少可以直接衡量一個軟件的開發效率、用戶滿意度、可靠性和可維護性”,那么一個比較完好的軟件中一般大概會出現多少Bug? 第二章問題:現在開始訓練寫更多的程序能否更早地達到軟件工程師的標準&#xff1…

springboot默認數據源如何設置連接數_Spring Boot系列之配置數據庫連接池

在實際的應用開發中,與數據庫交互通常使用數據庫連接池來重用Connection對象,減少資源消耗。Spring Boot 的數據源是自動配置的。在 Spring Boot 2.2.1 版本中,有幾種數據源配置可選,它們按照 HikariCP -> Tomcat -> DBCP2 …

使用Qt正則表達式提取全路徑的文件名

問題描述: 給定三個全路徑,例如 path1"C:/Users/asus/Desktop/nefertiti_4465.obj"; path2"C:/Users/asus/Desktop/nefertiti_4465_k1.txt"; path3"C:/Users/asus/Desktop/nefertiti_4465_k2.txt"; 我希望說明path2和pa…

Beyond Compare 3.3.8 build 16340 + Key

本文摘錄自冰點社區:http://forum.z27315.com/topic/14746-beyond-compare-338-build-16340-key/ Download Beyond Compare 3 Current Version: 3.3.8, build 16340, released June 19, 2013 Windows 版本 Windows Standard and Pro EditionsEnglish version 5800k…

hdu 1198 Farm Irrigation

題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid1198 題目大意: 有一大塊土地需要澆水,這塊土地由很多的小塊土地(有十一種)組成,小塊土地上有水溝,問至少需要建幾個井,才能灌…

strcpy_s、sptintf_s與strcat_s的使用

strcpy_s、sptintf_s與strcat_s是strcpy、sptintf與strcat的安全版本,均是通過指定緩沖區長度來避免存在的溢出風險。 strcpy_s 與strcpy strcpy_s和strcpy函數的功能幾乎是一樣的。strcpy函數,就象gets函數一樣,它沒有方法來保證有效的緩沖…

小米一鍵上鎖工具_小米首款高端全自動智能鎖火熱預售中,一觸開啟全自動時代...

近些年,隨著科技的發展,人工智能逐漸走入大眾視野。人類社會也正從信息時代向“智能時代”過渡,在整個過程中智能家居領域的蓬勃發展可謂當仁不讓,一直備受用戶矚目。智能鎖作為家的第一道守護防線,家庭物聯網入口的關…

Eigen+suitesparse for windows 安裝

Eigen是著名的C矩陣運算庫,提供了許多矩陣運算的接口,主要包括兩大部分,一部分是稠密矩陣,另一部分是稀疏矩陣。Eigen以源碼形式提供給大家,用的時候,只要將源碼包含在項目的包含路徑上,具體安裝…

軟件盤控制的問題

2019獨角獸企業重金招聘Python工程師標準>>> 在全屏模式或者是沉寢室標題欄 方案一:全屏模式 1.軟鍵盤被EditText遮擋住了,如果說EditText被嵌套在有滑動的視圖中,采取的方式是: activity中設置此屬性 android:windowSoftInputMode"…

python語言學習零基礎教學視頻_Python告白小白視頻教程(零基礎入門)

1 Python編程基礎入門篇通過本次課程的學習,我們每個人都可以進入python世界里,從簡單到高級,讓人人都能學會python,我們在學習的時候,python讓我們的運維變得更有樂趣,讓我們的運維更加的高大上&#xff0…

SQL 快速入門2.1

MySQL top(MySQL limit)語法 SELECT column_name(s) FROM table_name LIMIT number 例子 SELECT * FROM Persons LIMIT 5 SQL LIKE 操作符 SQL LIKE 操作符語法 SELECT column_name(s) FROM table_name WHERE column_name LIKE pattern 原始的表 (用在例…

sencha touch 入門系列 (一)sencha touch 簡介

參考鏈接:http://mobile.51cto.com/others-278381.htm Sencha touch 是基于JavaScript編寫的Ajax框架ExtJS,將現有的ExtJS整合JQTouch、Raphaël庫,推出適用于最前沿Touch Web的移動應用開發框架,該框架是世界上第一個 基于HTML5的Mobile App框架…

求二叉樹的深度和寬度

// 求二叉樹的深度和寬度.cpp : 定義控制臺應用程序的入口點。 <pre name"code" class"cpp">#include <iostream> #include <queue> using namespace std;struct BTNode {char m_value;BTNode *m_left;BTNode *m_right; };//先序創建二叉…

漢堡包

在我們結對的這些天里&#xff0c;我清晰的感受到同伴對我的幫助&#xff0c;每當我有不懂的時候她都會積極的幫助我&#xff0c;也會聽取我的意見積極配合我&#xff0c;在我懶惰的時候也能夠提醒督促我&#xff0c;我想這些只有結對時才能體會到。我們都知道&#xff0c;結對…

zabbix自動發現監控磁盤(iops和讀寫量)

2019獨角獸企業重金招聘Python工程師標準>>> 對于磁盤有個iops的概念比較奇怪&#xff0c;想監控起來看下&#xff0c;利用zabbix的自動發現把每個磁盤的iops監控起來&#xff0c;思路&#xff1a;自動發現所有的磁盤&#xff0c;然后監控各個磁盤的iops。效果如下圖…

一個表單同時向兩個頁面傳值

現在有一個表單<form action"AddNewstu.asp" METHOD"POST" ><INPUT TYPE "Text" NAME "name" SIZE "20"><BR></FORM>此表單向AddNewstu.asp頁面傳入了一個name的值&#xff0c;如果同時把name…