概述
JavaScript是一門(mén)動(dòng)態(tài)、弱類(lèi)型
的解釋型高級(jí)編程語(yǔ)言,它基于原型
,支持面向?qū)ο?/code>和函數(shù)式編程等多種編程范式,通常簡(jiǎn)稱(chēng)為js。在世界上的絕大多數(shù)網(wǎng)站中都能看到JavaScript的身影,世界上所有的主流瀏覽器(Chrome、IE、Firefox、Safari、Opera)都支持它。
作者
Brendan Eich
背景
JavaScript誕生于1995年,其誕生的初衷是為了減輕服務(wù)器端的壓力而在客戶端提供一種表單驗(yàn)證的功能。最初命名為Mocha,1995年9月在Netscape Navigator 2.0的Beta版中改名為LiveScript
,同年12月,Netscape Navigator 2.0 Beta 3中部署時(shí)被重命名為JavaScript,當(dāng)時(shí)網(wǎng)景公司與昇陽(yáng)電腦公司(Sun)組成的開(kāi)發(fā)聯(lián)盟為了讓這門(mén)語(yǔ)言搭上Java這個(gè)編程語(yǔ)言“熱詞”,將其臨時(shí)改名為JavaScript(其實(shí)就像現(xiàn)在某些網(wǎng)紅蹭熱度一樣)。
標(biāo)準(zhǔn)
1996年11月,網(wǎng)景正式向ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))
提交語(yǔ)言標(biāo)準(zhǔn)。1997年6月,ECMA以JavaScript語(yǔ)言為基礎(chǔ)制定了ECMAScript標(biāo)準(zhǔn)規(guī)范ECMA-262。JavaScript成為了ECMAScript最著名的實(shí)現(xiàn)之一。實(shí)現(xiàn)ECMAScript規(guī)范的語(yǔ)言還有Adobe的ActionScript和微軟的JScript。
范圍
雖然在大多數(shù)情況下,我們都認(rèn)為ECMAScript和JavaScript表達(dá)的是相同的含義,但實(shí)際上JavaScript所表達(dá)的卻比ECMAScript要廣泛的多。完整的JavaScript應(yīng)該由以下三部分組成:
? ECMAScript 由ECMA-262定義,提供核心語(yǔ)法功能。
? DOM 全稱(chēng)Document Object Model
文檔對(duì)象模型,提供訪問(wèn)和操作網(wǎng)頁(yè)的API。
? BOM 全稱(chēng)Browser Object Model
瀏覽器對(duì)象模型,提供與瀏覽器交互的方法和接口。
歷史
ECMAScript迄今已經(jīng)歷多個(gè)版本的迭代,下面給出主要的版本歷史。
關(guān)系
ECMAScript是標(biāo)準(zhǔn)(規(guī)范),JavaScript是實(shí)現(xiàn)。H5是一種新的技術(shù),JS用于實(shí)現(xiàn)H5新標(biāo)簽深層的擴(kuò)展功能。HTML表示網(wǎng)頁(yè)的核心內(nèi)容和結(jié)構(gòu),CSS用于設(shè)置網(wǎng)頁(yè)的樣式,JavaScript控制網(wǎng)頁(yè)的行為。
應(yīng)用
JavaScript主要用于瀏覽器Web、物聯(lián)網(wǎng)、游戲、桌面和移動(dòng)應(yīng)用開(kāi)發(fā)和以及服務(wù)器端的開(kāi)發(fā)。
參考
ECMA官網(wǎng) ECMA-262規(guī)范PDF文件 布蘭登·艾克博客
在html頁(yè)面中使用JavaScript
在html頁(yè)面中編寫(xiě)JavaScript代碼需要借助script標(biāo)簽,具體的使用方式有兩種。① 在頁(yè)面中嵌入JavaScript代碼
。在html頁(yè)面中創(chuàng)建script標(biāo)簽,設(shè)置script標(biāo)簽的type屬性為text/javascript,并在標(biāo)簽中直接編寫(xiě)JavaScript代碼即可。② 在頁(yè)面中引入外部的js文件
。在html頁(yè)面中創(chuàng)建script標(biāo)簽,把javaScript代碼單獨(dú)保存在.js后綴的文件中,然后通過(guò)設(shè)置script標(biāo)簽的src屬性來(lái)引入js文件。
script 標(biāo)簽的 type 屬性可以省略,默認(rèn)值即為text/javascript
。
script 標(biāo)簽的 屬性(節(jié)點(diǎn))主要有:type
(類(lèi)型)、src
(資源地址)、async
(異步加載)、defer
(延遲執(zhí)行)、charset
(字符集)等。
注釋 JavaScript遵循C語(yǔ)言的注釋風(fēng)格,支持單行和多行注釋。
單行注釋 //
多行注釋 /*...*/
語(yǔ)句
概念
在JavaScript中,可以簡(jiǎn)單認(rèn)為一行完整的代碼就是一條語(yǔ)句(statement
)。
分類(lèi)
整體來(lái)講,JavaScript的語(yǔ)句大致可以區(qū)分為聲明賦值語(yǔ)句
和控制語(yǔ)句
兩種。
分號(hào)
JavaScript中使用分號(hào)(;)
來(lái)間隔多條語(yǔ)句,若各語(yǔ)句獨(dú)占一行那么大部分情況下可省略分號(hào)。
控制輸出
JavaScript需要具體的JavaScript引擎(解析器)來(lái)解析,該引擎通常由瀏覽器提供,即JavaScript代碼需要運(yùn)行在瀏覽器中。JavaScript代碼中常見(jiàn)的控制輸出方式有以下三種:
? 輸出到頁(yè)面
document.write()
? 彈出框顯示alert()
? 控制臺(tái)輸出console.log()
/*01 彈出對(duì)話框提示*/
alert("喜歡我就點(diǎn)我吧!");
alert("小姐姐你好,我是阿貍~");
alert("拜拜 >.< ");
/*02 直接向在網(wǎng)頁(yè)中輸出內(nèi)容*/
document.write("蟬鳴的夏季,剛好遇見(jiàn)你。");
document.write("<h1>遇見(jiàn)</h1>");
/*03 控制臺(tái)打印輸出*/
console.log(123);
console.log("文頂頂");
直接量
說(shuō)明
直接量(literal
)指的是程序中直接使用的數(shù)據(jù)值。
當(dāng)一個(gè)值(數(shù)字、字符串等)直接出現(xiàn)在JavaScript程序中時(shí),我們稱(chēng)之為直接量
。
JavaScript語(yǔ)言中直接量(字面量)有很多,包括數(shù)字直接量、字符串直接量、數(shù)組直接量、對(duì)象直接量以及正則表達(dá)式直接量等等,下面簡(jiǎn)單給出一些直接量的示例。
null; //空
18; //數(shù)字
19.3; //小數(shù)
"wendingding"; //字符串文本
true; //布爾值
false; //布爾值
/abc/gi; //正則表達(dá)式直接量
變量基礎(chǔ)
定義
變量是編程語(yǔ)言中能夠存儲(chǔ)計(jì)算結(jié)果或表示值的抽象概念。
使用
在JavaScript語(yǔ)言中 變量需要先聲明再使用。
聲明
使用 var
關(guān)鍵字來(lái)聲明變量,如果省略var關(guān)鍵字那么該變量默認(rèn)成為全局變量。
作用
記錄特定的內(nèi)容,并通過(guò)變量名來(lái)訪問(wèn)它們。
備注
JavaScript變量是無(wú)類(lèi)型的(untype
),任何變量都可以被賦予任何類(lèi)型的值。
原理
當(dāng)使用var關(guān)鍵字聲明變量時(shí),計(jì)算機(jī)會(huì)從內(nèi)存中分配儲(chǔ)存空間來(lái)存放不同類(lèi)型的內(nèi)容。
/*01 先聲明兩個(gè)變量,然后再輸出變量的值到控制臺(tái)*/
var age = 18;
var name = "wendingding";
console.log(age);
console.log(name);
age = 20;
console.log(age); //變量的值可以被修改
/*02 可以一次性聲明多個(gè)變量*/
var address = "北京市",className = "H5";
console.log(address,className); //北京市 H5
語(yǔ)法說(shuō)明
var name_1 [ = value1][,...,name_n [ = value_n]]]
/*聲明示例*/
var i;
var a = '<strong></strong>';
var p,q;
var x = 2,y = 3,z;
/*示例說(shuō)明
* JavaScript中的=和數(shù)學(xué)中的=不一樣,在JavaScript中=是賦值運(yùn)算符。
* var a = '<strong></strong>'; 這句話分成兩個(gè)部分。
* 左值 :在等號(hào)左側(cè),是變量名(同時(shí)被賦值)
* 右值 :在等號(hào)右側(cè),是存放進(jìn)變量中的東西(給變量賦值)
* 備注 :使用var關(guān)鍵字多次聲明同一個(gè)變量是無(wú)所謂的(正確、無(wú)意義也不報(bào)錯(cuò))。
* */
命名規(guī)范
標(biāo)識(shí)符 標(biāo)識(shí)符(identifier
)指的是JavaScript代碼中變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。標(biāo)識(shí)符(變量)在命名的時(shí)候并不能隨心所欲,也有對(duì)應(yīng)的規(guī)則和要求。下面列出具體的命名規(guī)范:
① 標(biāo)識(shí)符可以使用下劃線、字母、數(shù)字和$符號(hào)。
② 標(biāo)識(shí)符不能以數(shù)字開(kāi)頭。
③ 標(biāo)識(shí)符區(qū)分大小寫(xiě)(區(qū)別于HTML)。
④ 標(biāo)識(shí)符不能使用JavaScript的關(guān)鍵字和保留字。
/*01 常見(jiàn)(合法)的標(biāo)識(shí)符命名方式*/
/*純字母*/
var age = 18;
var name = "wendingding";
var stuAge = 21;
var stuName = "寧夏";
/*字母、數(shù)字、下劃線、$的組合*/
var num1 = 1.5;
var num2 = 200;
var num$ = num1 + num2;
var stu_Score = 99;
/*02 錯(cuò)誤的命名演示*/
var if = 123; //錯(cuò)誤:使用關(guān)鍵字
var super = "哈哈哈" //錯(cuò)誤:使用保留字
var 2age = 123; //錯(cuò)誤:數(shù)字開(kāi)頭
var stu-address = "北京市"; //錯(cuò)誤:使用了非法的-
命名風(fēng)格
JavaScript語(yǔ)言常用的標(biāo)識(shí)符命名風(fēng)格是駝峰標(biāo)識(shí)法(camel-case)
,即標(biāo)識(shí)符的名稱(chēng)由多個(gè)單詞組合的時(shí)候,每個(gè)單詞的首字母大寫(xiě)以區(qū)分。駝峰標(biāo)識(shí)又可以分成大駝峰標(biāo)識(shí)和小駝峰標(biāo)識(shí),它們的區(qū)別在于整個(gè)標(biāo)識(shí)符的首字母需要大寫(xiě)。
小駝峰標(biāo)識(shí) var wenDingDing = "神秘人";
大駝峰標(biāo)識(shí) var WenDingDing = "神秘人";
當(dāng)然,在寫(xiě)代碼的時(shí)候給標(biāo)識(shí)符命名并非一定要使用駝峰標(biāo)識(shí),這只是一種建議的風(fēng)格,譬如有的開(kāi)發(fā)者就喜歡用下劃線來(lái)連接單詞,類(lèi)似于wen_ding_ding、stu_Name這樣。類(lèi)似的還有匈牙利命名法等,但在JavaScript編程中不建議使用。
JavaScript規(guī)定的關(guān)鍵字
關(guān)鍵字通常用于執(zhí)行特定的操作。
JavaScript規(guī)定的保留字
保留字是給語(yǔ)言未來(lái)發(fā)展而預(yù)留的。
在編程語(yǔ)言中,能夠表示并操作的值的類(lèi)型被稱(chēng)為數(shù)據(jù)類(lèi)型(
type
),能夠支持多種數(shù)據(jù)類(lèi)型是每一門(mén)編程語(yǔ)言的基本特征。在編寫(xiě)程序的時(shí)候,如果我們需要將某個(gè)(些)值保存起來(lái)以備將來(lái)使用時(shí),就會(huì)將該 值賦值
給一個(gè)變量
(將值保存到變量中)。
JavaScript語(yǔ)言的數(shù)據(jù)類(lèi)型可以簡(jiǎn)單的分成基本(簡(jiǎn)單)類(lèi)型
和復(fù)雜(復(fù)合)類(lèi)型
。
基本類(lèi)型主要包括:字符串(string)
、數(shù)值(number)
、布爾值(boolean)
、Null
和undefined
五種。其中Null類(lèi)型有一個(gè)值,即null表示為空,而undefined類(lèi)型也只有一個(gè)對(duì)應(yīng)值undefined,表示變量未定義(即聲明變量后未給變量賦值)。
復(fù)雜類(lèi)型主要是對(duì)象類(lèi)型,包括Object對(duì)象、Function函數(shù)、RegExp正則等,這里不做具體的展開(kāi)。
typeof關(guān)鍵字
如果我們需要判斷變量的類(lèi)型,那么可以使用 typeof 關(guān)鍵字(操作符)。
語(yǔ)法
typeof 變量 | typeof(變量)
結(jié)果
typeof 關(guān)鍵字執(zhí)行后的結(jié)果總是為一個(gè)string類(lèi)型的字符串。
/*多種類(lèi)型的變量*/
var age = 18; //數(shù)值類(lèi)型
var name = "寧夏"; //字符串類(lèi)型
var isFun = true; //布爾類(lèi)型值
var a; //未定義
var obj = {id:1,desc:"描述信息"}; //Object類(lèi)型
function fn() {
console.log("我是fn函數(shù)");
}
console.log(typeof age); //number
console.log(typeof name); //string
console.log(typeof isFun); //boolean
console.log(typeof a); //undefined
console.log(typeof obj); //object
/*typeof的兩種使用方式*/
console.log(typeof fn); //function
console.log(typeof(fn)); //function
obj = null;
console.log(typeof obj); //object
注意
對(duì)null執(zhí)行typeof計(jì)算的結(jié)果為object,其實(shí)這被認(rèn)為是JavaScript這門(mén)語(yǔ)言的一個(gè)設(shè)計(jì)錯(cuò)誤。
字符串類(lèi)型
定義
由〇個(gè)或多個(gè)16位Unicode字符組成的字符序列。
表示
字符串可以由雙引號(hào)或單引號(hào)表示。
操作
可以通過(guò)length屬性來(lái)獲取字符串的長(zhǎng)度,且多個(gè)字符串之間可以通過(guò) + 來(lái)進(jìn)行拼接。
var str1 = "Hi ~";
var str2 = "Wendingding!";
var str3 = str1 + " " +str2; /*字符串的拼接 */
console.log(str3); /*輸出結(jié)果:Hi ~ Wendingding!*/
console.log(str3.length); /*輸出結(jié)果:17 */
注意
JavaScript中的字符串是不可變的,這也就意味著要改變某個(gè)變量保存的字符串,那么需要先銷(xiāo)毀原來(lái)的字符串然后再用另外一個(gè)包含新值的字符串來(lái)填充該變量。
var test = 'Hi ! ';
test = test + 'Nice to meet u ~';
console.log(test); //Hi ! Nice to meet u ~
/*描述上述代碼的內(nèi)部執(zhí)行細(xì)節(jié)
* 說(shuō)明:上述示例代碼中 test變量的值最開(kāi)始時(shí)為Hi !,而后變成了Hi ! Nice to meet u ~
* 但這并不意味著字符串是可變的,要想理解這一點(diǎn)需要把變量和字符串區(qū)分開(kāi)來(lái)。
* 上述第二行代碼的實(shí)現(xiàn)過(guò)程為(整個(gè)過(guò)程在瀏覽器后臺(tái)處理):
* [1] 先創(chuàng)建一個(gè)能容納21位字符的新字符串。
* [2] 在新創(chuàng)建的字符串中填充Hi ! 和 Nice to meet u ~內(nèi)容。
* [3] 銷(xiāo)毀原先的Hi ! 和 Nice to meet u ~ 字符串,因?yàn)樗鼈儧](méi)用了。
*/
布爾類(lèi)型
說(shuō)明
布爾類(lèi)型用來(lái)表示正確和錯(cuò)誤兩種狀態(tài)(同燈泡有開(kāi)和關(guān)兩種狀態(tài)一樣)。
取值
布爾類(lèi)型(boolean)只有兩個(gè)值,分別是true和false。
注意
布爾類(lèi)型常用于條件表達(dá)式,布爾類(lèi)型的值和字符串以及數(shù)值等可以相互轉(zhuǎn)換。
undefined類(lèi)型
undefined類(lèi)型的值也只有一個(gè),那就是undefined
。我們?cè)谑褂胿ar來(lái)聲明變量,但是沒(méi)有對(duì)該變量進(jìn)行初始化的時(shí)候,變量的值就為undefined,表示未定義。
Null類(lèi)型
Null類(lèi)型的值只有一個(gè),那就是null(關(guān)鍵字)
,通常表示空對(duì)象指針。
注意 ① typeof null 的結(jié)果為 object 而非 null。
注意 ② 實(shí)際上,undefined的值派生自null,因此ECMA-262規(guī)定它們的相等性測(cè)試需要返回true。
/*01 布爾類(lèi)型值*/
var boolA = true;
var boolB = false;
/*02 聲明變量但未賦值(未定義)*/
var test;
/*03 設(shè)置變量的值為null*/
var boolA = null;
console.log(boolA); //null 表示空對(duì)象
console.log(test); //undefined 未定義
/*04 測(cè)試undefined和null*/
console.log(undefined == null); //true
數(shù)值類(lèi)型
定義
數(shù)值簡(jiǎn)單說(shuō)就是數(shù)字,在JavaScript語(yǔ)言中數(shù)值類(lèi)型包含整數(shù)和浮點(diǎn)數(shù)(小數(shù))。
小數(shù)
浮點(diǎn)數(shù)就是小數(shù),數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),小數(shù)點(diǎn)后面必須至少有一位數(shù)字。
備注
實(shí)際上JavaScript內(nèi)部并不直接區(qū)分整數(shù)值和浮點(diǎn)數(shù)值,其所有數(shù)字均用浮點(diǎn)數(shù)值表示。
/*01 數(shù)值的兩種類(lèi)型*/
var num1 = 123; /*整型-數(shù)據(jù)1*/
var num2 = 4.0075e7; /*整型-數(shù)據(jù)2 科學(xué)計(jì)數(shù)發(fā)*/
/*浮點(diǎn)數(shù)特點(diǎn):數(shù)值中必須包含一個(gè)小數(shù)點(diǎn),小數(shù)點(diǎn)后面必須至少有一位數(shù)字。*/
var floatNum1 = 8.26; /*浮點(diǎn)型-數(shù)據(jù)1*/
var floatNum2 = 1.1; /*浮點(diǎn)型-數(shù)據(jù)2*/
var floatNum3 = 0.5; /*浮點(diǎn)型-數(shù)據(jù)3*/
var floatNum4 = .8; /*浮點(diǎn)型-數(shù)據(jù)4-不建議*/
var floatNum5 = 3.2e-4;/*浮點(diǎn)型-數(shù)據(jù)4 科學(xué)計(jì)數(shù)法*/
/*02 整數(shù)和浮點(diǎn)數(shù)的默認(rèn)轉(zhuǎn)換*/
var intNum1 = 10.0; /*整數(shù),解析為10*/
var intNum2 = 2.; /*整數(shù),解析為2*/
/* 03 浮點(diǎn)數(shù)注意點(diǎn)
* 001 默認(rèn),當(dāng)小數(shù)點(diǎn)后面超過(guò)6個(gè)0,則以科學(xué)計(jì)數(shù)法的方式來(lái)表示。
* 002 浮點(diǎn)數(shù)值的最高精度為17位小數(shù),但算術(shù)運(yùn)算時(shí)其精度不如整數(shù)。
* 003 JavaScript使用基于IEEE754數(shù)值的浮點(diǎn)格式表示,計(jì)算因此存在舍入誤差問(wèn)題。
*/
進(jìn)制
JavaScript中的數(shù)值類(lèi)型支持多種進(jìn)制,包括二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制等。
說(shuō)明
在進(jìn)行算術(shù)運(yùn)算時(shí),所有八進(jìn)制、十六進(jìn)制的數(shù)據(jù)最終都會(huì)轉(zhuǎn)換為十進(jìn)制的數(shù)據(jù)。
特點(diǎn)
八進(jìn)制的特點(diǎn)是數(shù)字以 0
開(kāi)頭,十六進(jìn)制則以 0x
或 0X
開(kāi)頭。
補(bǔ)充
實(shí)際上ECMAScript并不支持八進(jìn)制直接量,且嚴(yán)格模式下八進(jìn)制直接量被禁止,因此不建議用。十六進(jìn)制值是 0 ~ 9之間的數(shù)字和a(A) ~ f(F)之間的字母 構(gòu)成,字母對(duì)應(yīng)的數(shù)字為10~15。此外,我們還可以通過(guò)調(diào)用toString
方法傳遞參數(shù)的方式來(lái)實(shí)現(xiàn)進(jìn)制的轉(zhuǎn)換。
/*進(jìn)制的轉(zhuǎn)換 通過(guò)toString方法*/
var num1 = 17;
console.log(num1); //默認(rèn)以十進(jìn)制的方式打印(數(shù)字) 17
console.log(num1.toString()); //默認(rèn)以十進(jìn)制的方式打印(字符串)
console.log(num1.toString(2)); //設(shè)置以二進(jìn)制的方式打印(字符串) 10001
console.log(num1.toString(8)); //設(shè)置以八進(jìn)制的方式打印(字符串) 21
console.log(num1.toString(16)); //設(shè)置是十六進(jìn)制的方式打印(字符串)11
/*二進(jìn)制、八進(jìn)制、16進(jìn)制的數(shù)據(jù)*/
console.log(070); //8進(jìn)制的數(shù)據(jù) 對(duì)應(yīng)的十進(jìn)制值為56
console.log(0x11); //16進(jìn)制的數(shù)據(jù) 對(duì)應(yīng)的十進(jìn)制數(shù)值為17
NaN
全稱(chēng)Not a Number
(非數(shù)值),NaN用于表示本來(lái)要返回?cái)?shù)值的操作數(shù)而實(shí)際未返回的情況。
① 任何涉及NaN的操作都會(huì)返回NaN。
② NaN與任何值都不相等,包括NaN自身。
說(shuō)明 上面列出了NaN的兩個(gè)特點(diǎn),針對(duì)NaN的這兩個(gè)特點(diǎn),ECMAScript提供了isNaN() 函數(shù)。isNaN()函數(shù)接收一個(gè)參數(shù),該參數(shù)可以是任何類(lèi)型的,該函數(shù)在執(zhí)行的時(shí)候會(huì)嘗試把參數(shù)轉(zhuǎn)換為數(shù)值,如果參數(shù)不能被轉(zhuǎn)換為數(shù)值(轉(zhuǎn)換失敗),那么返回true,否則返回false。
console.log(isNaN(NaN)); //true
console.log(isNaN(10)); //false
console.log(isNaN("20.3")); //false
console.log(isNaN("5red")); //true 無(wú)法轉(zhuǎn)換為數(shù)值
console.log(isNaN(true)); //false
console.log(isNaN("red")); //true 無(wú)法轉(zhuǎn)換為數(shù)值
二進(jìn)制浮點(diǎn)數(shù)的誤差問(wèn)題 JavaScript在使用數(shù)字(實(shí)數(shù))的時(shí)候,常常只是真實(shí)值的一個(gè)近似表示。原因就在于JavaScript采用的是IEEE-754浮點(diǎn)數(shù)表示法(這是一種二進(jìn)制浮點(diǎn)數(shù)表示法),這種表示法可以精確地表示分?jǐn)?shù),比如1/2、1/8和1/1024等,而我們開(kāi)發(fā)中常用的反而都是十進(jìn)制分?jǐn)?shù),比如1/10、1/100等,神奇的地方就在于這種表示法無(wú)法精確的表示類(lèi)似于0.1 、0.2和0.3這種簡(jiǎn)單的數(shù)字。正是因?yàn)樯厦娴脑?,所以JavaScript語(yǔ)言中才會(huì)存在奇葩的 0.1 + 0.2 == 0.3 不成立的問(wèn)題。
在JavaScript的基本數(shù)據(jù)類(lèi)型中,字符串、數(shù)值以及其他類(lèi)型之間是可以相互轉(zhuǎn)換的,而這種轉(zhuǎn)換大概又可以細(xì)分成兩種,其一是在進(jìn)行算術(shù)運(yùn)算時(shí)默認(rèn)會(huì)執(zhí)行的自動(dòng)轉(zhuǎn)換
,其二就是強(qiáng)制轉(zhuǎn)換
了。
類(lèi)型間的強(qiáng)制轉(zhuǎn)換
強(qiáng)制類(lèi)型轉(zhuǎn)換需要用到一些特定的函數(shù),這些函數(shù)可以是Number()
、Bumber()
、String()
也可以是parseInt()
、parseFloat()
、toString()
等,下面將通過(guò)代碼來(lái)演示它們的具體使用。
/*01 Number(構(gòu)造)函數(shù)把其它類(lèi)型轉(zhuǎn)換為數(shù)值*/
console.log(Number(null)); //0
console.log(Number(undefined)); //NaN
console.log(Number("miaoXia")); //NaN
console.log(Number("18blue")); //NaN
console.log(Number("18")); //18
console.log(Number(true)); //1
console.log(Number(false)); //0
/*02-1 String函數(shù)用于把其它類(lèi)型轉(zhuǎn)換為字符串*/
console.log(String(null)); //"null"
console.log(String(undefined)); //"undefined"
console.log(String(123)); //"123"
console.log(String(21.5)); //"21.5"
console.log(String(-0)); //"0"
console.log(String(true)); //"true"
console.log(String(false)); //"false"
/*02-2 toString函數(shù)
* a、其實(shí)其它類(lèi)型的值直接調(diào)用toString方法也能強(qiáng)轉(zhuǎn)為字符串
* b、toString方法可以接收一個(gè)參數(shù),該參數(shù)用于表示轉(zhuǎn)換時(shí)的進(jìn)制數(shù)
* c、如果toString方法的參數(shù)缺省,那么默認(rèn)采用的十進(jìn)制
* d、null和undefined值無(wú)法調(diào)用toString方法
* */
console.log((123).toString()); //"123"
console.log(true.toString()); //"true"
console.log(false.toString()); //"false"
console.log(NaN.toString()); //"NaN"
/*03 Boolean函數(shù)用于將其它類(lèi)型轉(zhuǎn)換為字符串*/
console.log(Boolean(null)); //false
console.log(Boolean(undefined));//false
console.log(Boolean("Nice")); //true
console.log(Boolean("")); //false
console.log(Boolean(" ")); //true
console.log(Boolean(123)); //true
console.log(Boolean(0)); //fasle
console.log(Boolean(NaN)); //fasle
在上面的代碼示例中Number函數(shù)用于將其他類(lèi)型的數(shù)據(jù)轉(zhuǎn)換成數(shù)字,而parseInt()
和parseFloat()
函數(shù)相對(duì)于Number()函數(shù)而言更加靈活。
parseInt()
函數(shù)用于解析整數(shù),如果字符串前綴是0x或0X,則將會(huì)被解析為十六進(jìn)制數(shù)。解析規(guī)則為:跳過(guò)任意數(shù)量的前導(dǎo)空格,盡可能解析更多數(shù)值字符,并忽略數(shù)字后面的內(nèi)容,如果第一個(gè)非空格字符是非法的數(shù)字直接量,將最終返回NaN。
/*parseInt()基本使用*/
console.log(parseInt(" 123")); //123 忽略前面的N個(gè)空格
console.log(parseInt("123")); //123
console.log(parseInt("123.59")); //123 僅解析為整數(shù)
console.log(parseInt("-13.14")); //-13
console.log(parseInt("826 Birthday"));//826
console.log(parseInt("Birthday826")) //NaN
console.log(parseInt("0.1")) //0
console.log(parseInt(".1")) //NaN 整數(shù)不能以.開(kāi)頭
console.log(parseInt("0xff")) //255 以十六進(jìn)制來(lái)解析
console.log(parseInt("071")); //71 十進(jìn)制處理(非八進(jìn)制)
parseInt()
被定義為declare function parseInt(s: string, radix?: number): number;
該函數(shù)的第一個(gè)參數(shù)為字符串,它還可以接收第二個(gè)參數(shù)用于指定數(shù)字轉(zhuǎn)換的進(jìn)制基數(shù),合法的取值范圍是2~36。
console.log(parseInt("111",2)); // 7 = 1 * 2 * 2 + 1 * 2 + 1
console.log(parseInt("aa",16)); //170 = 10 * 16 + 10
console.log(parseInt("076",8)); //62 = 7 * 8 + 6
console.log(parseInt("077",10)); //77
parseFloat()
函數(shù)用于解析浮點(diǎn)數(shù)。解析規(guī)則為:跳過(guò)任意數(shù)量的前導(dǎo)空格,檢索純數(shù)字字符串后面第一個(gè).后的不為數(shù)字的字符,并對(duì)之前所有的結(jié)果進(jìn)行返回,如果第一個(gè)非空格字符是非法的數(shù)字直接量,將最終返回NaN,如果沒(méi)有.則以整數(shù)解析的方式處理。
/*parseFloat()基本使用*/
console.log(parseFloat(" 123")); //123
console.log(parseFloat(" 123.55")); //123.55
console.log(parseFloat(" 8.26 Birthday")); //8.26
console.log(parseFloat(" Birthday 8.26")); //NaN
console.log(parseFloat("0.1")); //0.1
console.log(parseFloat(".1")); //0.1
console.log(parseFloat("0xff")); //0
console.log(parseFloat("abc 12.5")); //NaN
console.log(parseFloat("$12.5")); //NaN
本文摘自 :https://www.cnblogs.com/