當(dāng)前位置:首頁(yè) > IT技術(shù) > 編程語(yǔ)言 > 正文

javaScript系列 [16]-語(yǔ)言基礎(chǔ)
2022-01-01 23:15:40

本文將介紹javaScript最基礎(chǔ)的知識(shí)點(diǎn),包括但不限于JavaScript的簡(jiǎn)單介紹、歷史、引入方式、變量、標(biāo)識(shí)符命名規(guī)范、數(shù)據(jù)類(lèi)型以及操作符等內(nèi)容。
**JavaScript簡(jiǎn)介**

概述 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文件 布蘭登·艾克博客

**JavaScript初體驗(yàn)**

在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ù)留的。

**數(shù)據(jù)類(lèi)型**

在編程語(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)Nullundefined五種。其中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)制則以 0x0X 開(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)題。

**類(lèi)型的轉(zhuǎ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/

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >