JavaScript學習(2)數(shù)據(jù)類型轉(zhuǎn)換

JavaScript基本語法

變量

var a = 1;

上面的代碼先聲明變量a心例,然后在變量a與數(shù)值1之間建立引用關系宵凌,也稱為將數(shù)值1“賦值”給變量a。以后止后,引用變量a就會得到數(shù)值1瞎惫。最前面的var,是變量聲明命令译株。它表示通知解釋引擎瓜喇,要創(chuàng)建一個變量a。

JavaScirpt是一種動態(tài)類型語言歉糜,也就是說乘寒,變量的類型沒有限制,可以賦予各種類型的值匪补。

可重新賦值伞辛,但無需重新聲明。

null和undefined

如果只是聲明變量而沒有賦值夯缺,則該變量的值是undefined蚤氏。undefined是一個JavaScript關鍵字,表示“無定義踊兜,不存在的值”瞧捌。而不是null(理解為無值)。

null表示一個“空”的值润文,它和0以及空字符串''不同姐呐,0是一個數(shù)值,''表示長度為0的字符串典蝌,而null表示“空”曙砂。

在其他語言中,也有類似JavaScript的null的表示骏掀,例如Java也用null鸠澈,Swift用nil,Python用None表示截驮。但是笑陈,在JavaScript中,還有一個和null類似的undefined葵袭,它表示“未定義”涵妥。

JavaScript的設計者希望用null表示一個空的值,而undefined表示值未定義坡锡。事實證明蓬网,這并沒有什么卵用窒所,區(qū)分兩者的意義不大。大多數(shù)情況下帆锋,我們都應該用null吵取。undefined僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用。

變量提升

JavaScript引擎的工作方式是锯厢,先解析代碼皮官,獲取所有被聲明的變量,就是所有的變量的聲明語句实辑,都會被提升到代碼的頭部臣疑,這就叫做變量提升(hoisting)。

標識符

標識符(identifier)是用來識別具體對象的一個名稱徙菠。

標識符命名規(guī)則:

第一個字符讯沈,可以是任意Unicode字母(包括英文字母和其他語言的字母),以及美元符號($)和下劃線(_)婿奔。
第二個字符及后面的字符缺狠,除了Unicode字母、美元符號和下劃線萍摊,還可以用數(shù)字0-9

注意不要用保留字挤茄,有arguments、break冰木、case穷劈、catch、class踊沸、const歇终、continue、debugger逼龟、default评凝、delete、do腺律、else臭觉、enum千劈、eval、export归斤、extends辅愿、false姐叁、finally潘悼、for庞萍、function、if、implements达椰、import翰蠢、in项乒、instanceof啰劲、interface、let檀何、new蝇裤、null、package频鉴、private栓辜、protected、public垛孔、return藕甩、static、super周荐、switch狭莱、this、throw概作、true腋妙、try、typeof讯榕、var骤素、void、while愚屁、with济竹、yield。

另外霎槐,還有三個詞雖然不是保留字规辱,但是因為具有特別含義,也不應該用作標識符栽燕。分別是Infinity(無限大罕袋,當數(shù)值超過了JavaScript的Number所能表示的最大值時,就表示為Infinity)碍岔、NaN(表示Not a Number浴讯,當無法計算結(jié)果時用NaN表示)、undefined(未定義)蔼啦。

注釋符

// 這是單行注釋

/*
 這是
 多行
 注釋
*/

此外榆纽,由于歷史上JavaScript兼容HTML代碼的注釋,所以<\!--和-->也被視為單行注釋。

區(qū)塊

JavaScript使用大括號奈籽,將多個相關的語句組合在一起饥侵,稱為“區(qū)塊”(block)。

與大多數(shù)編程語言不一樣衣屏,JavaScript的區(qū)塊不構(gòu)成單獨的作用域(scope)躏升。也就是說,區(qū)塊中的變量與區(qū)塊外的變量狼忱,屬于同一個作用域膨疏。

標簽(label)

JavaScript語言允許,語句的前面有標簽(label)钻弄,相當于定位符佃却,用于跳轉(zhuǎn)到程序的任意位置,標簽的格式如下窘俺。

label:
  statement

數(shù)據(jù)類型轉(zhuǎn)換

JavaScript是一種動態(tài)類型語言饲帅,變量沒有類型限制,可以隨時賦予任意值瘤泪。雖然變量沒有類型灶泵,但是數(shù)據(jù)本身和各種運算符是有類型的。如果運算符發(fā)現(xiàn)均芽,數(shù)據(jù)的類型與預期不符丘逸,就會自動轉(zhuǎn)換類型。當然有些時候也會出現(xiàn)需要強制轉(zhuǎn)換的時候掀宋。

強制轉(zhuǎn)換

強制轉(zhuǎn)換主要指使用Number深纲、StringBoolean三個構(gòu)造函數(shù),手動將各種類型的值劲妙,轉(zhuǎn)換成數(shù)字湃鹊、字符串或者布爾值。

Number()

可以將任意類型的值轉(zhuǎn)化成數(shù)值镣奋。

(1)原始類型值的轉(zhuǎn)換規(guī)則
// 數(shù)值:轉(zhuǎn)換后還是原來的值
Number(324) // 324

// 字符串:如果可以被解析為數(shù)值币呵,則轉(zhuǎn)換為相應的數(shù)值
Number('\t\v\r324\n') // 324

// 字符串:如果不可以被解析為數(shù)值,返回NaN
Number('abc') // NaN

// 空字符串轉(zhuǎn)為0
Number('') // 0

// undefined:轉(zhuǎn)成 NaN
Number(undefined) // NaN

// null:轉(zhuǎn)成0
Number(null) // 0

parseInt('42 abc') // 42

parseInt逐個解析字符侨颈,而Number函數(shù)整體轉(zhuǎn)換字符串的類型余赢。
另外,Number函數(shù)會自動過濾一個字符串前導和后綴的空格哈垢。

(2)對象的轉(zhuǎn)換規(guī)則

Number方法的參數(shù)是對象時妻柒,將返回NaN。

1.調(diào)用對象自身的valueOf方法耘分。如果返回原始類型的值举塔,則直接對該值使用Number函數(shù)绑警,不再進行后續(xù)步驟。

2.如果valueOf方法返回的還是對象央渣,則改為調(diào)用對象自身的toString方法计盒。如果返回原始類型的值,則對該值使用Number函數(shù)芽丹,不再進行后續(xù)步驟北启。

3.如果toString方法返回的是對象,就報錯志衍。

String()

可以將任意類型的值轉(zhuǎn)化成字符串暖庄。

(1)原始類型值的轉(zhuǎn)換規(guī)則

數(shù)值:轉(zhuǎn)為相應的字符串聊替。
字符串:轉(zhuǎn)換后還是原來的值楼肪。
布爾值:true轉(zhuǎn)為"true",false轉(zhuǎn)為"false"惹悄。
undefined:轉(zhuǎn)為"undefined"春叫。
null:轉(zhuǎn)為"null"。

String()對象的轉(zhuǎn)換規(guī)則

String方法的參數(shù)如果是對象泣港,返回一個類型字符串暂殖;如果是數(shù)組,返回該數(shù)組的字符串形式当纱。

String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"

String方法背后的轉(zhuǎn)換規(guī)則呛每,優(yōu)先toString方法,后valueOf方法坡氯。

Boolean()

使用Boolean函數(shù)晨横,可以將任意類型的變量轉(zhuǎn)為布爾值。

它的轉(zhuǎn)換規(guī)則相對簡單:除了以下六個值的轉(zhuǎn)換結(jié)果為false箫柳,其他的值全部為true手形。

undefined
null
-0
0或+0
NaN
''(空字符串)

注意:所有對象(包括空對象)的轉(zhuǎn)換結(jié)果都是true,甚至連false對應的布爾對象new Boolean(false)也是true悯恍。

自動轉(zhuǎn)換

下面介紹自動轉(zhuǎn)換库糠,它是以強制轉(zhuǎn)換為基礎的。

遇到以下三種情況時涮毫,JavaScript會自動轉(zhuǎn)換數(shù)據(jù)類型瞬欧,即轉(zhuǎn)換是自動完成的,對用戶不可見罢防。

// 1. 不同類型的數(shù)據(jù)互相運算
123 + 'abc' // "123abc"

// 2. 對非布爾值類型的數(shù)據(jù)求布爾值
if ('abc') {
  console.log('hello')
}  // "hello"

// 3. 對非數(shù)值類型的數(shù)據(jù)使用一元運算符(即“+”和“-”)
+ {foo: 'bar'} // NaN
- [1, 2, 3] // NaN

自動轉(zhuǎn)換的規(guī)則是這樣的:預期什么類型的值艘虎,就調(diào)用該類型的轉(zhuǎn)換函數(shù)。比如篙梢,某個位置預期為字符串顷帖,就調(diào)用String函數(shù)進行轉(zhuǎn)換美旧。如果該位置即可以是字符串,也可能是數(shù)值贬墩,那么默認轉(zhuǎn)為數(shù)值榴嗅。

由于自動轉(zhuǎn)換具有不確定性,而且不易出錯陶舞,建議在預期為布爾值嗽测、數(shù)值、字符串的地方肿孵,全部使用Boolean唠粥、Number和String函數(shù)進行顯式轉(zhuǎn)換。

除了加法運算符有可能把運算子轉(zhuǎn)為字符串停做,其他運算符都會把運算子自動轉(zhuǎn)成數(shù)值晤愧。

false / '5' // 0
'abc' - 1   // NaN

學習參考:
廖雪峰的JavaScript教程
JavaScript 標準參考教程 阮一峰
李炎恢的JavaScript視頻教程

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蛉腌,隨后出現(xiàn)的幾起案子官份,更是在濱河造成了極大的恐慌,老刑警劉巖烙丛,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舅巷,死亡現(xiàn)場離奇詭異,居然都是意外死亡河咽,警方通過查閱死者的電腦和手機钠右,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忘蟹,“玉大人飒房,你說我怎么就攤上這事『撸” “怎么了情屹?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杂腰。 經(jīng)常有香客問我垃你,道長,這世上最難降的妖魔是什么喂很? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任惜颇,我火速辦了婚禮,結(jié)果婚禮上少辣,老公的妹妹穿的比我還像新娘凌摄。我一直安慰自己,他們只是感情好漓帅,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布锨亏。 她就那樣靜靜地躺著痴怨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪器予。 梳的紋絲不亂的頭發(fā)上浪藻,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音乾翔,去河邊找鬼爱葵。 笑死,一個胖子當著我的面吹牛反浓,可吹牛的內(nèi)容都是我干的萌丈。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼雷则,長吁一口氣:“原來是場噩夢啊……” “哼辆雾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巧婶,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤乾颁,失蹤者是張志新(化名)和其女友劉穎涂乌,沒想到半個月后艺栈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡湾盒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年湿右,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罚勾。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡毅人,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尖殃,到底是詐尸還是另有隱情丈莺,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布送丰,位于F島的核電站缔俄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏器躏。R本人自食惡果不足惜俐载,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望登失。 院中可真熱鬧遏佣,春花似錦、人聲如沸揽浙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膛虫,卻和暖如春空闲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背走敌。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工碴倾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掉丽。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓跌榔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捶障。 傳聞我的和親對象是個殘疾皇子僧须,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容