摘要:是最特殊的類(lèi)型,表示沒(méi)有意義的數(shù),例如。十六進(jìn)制數(shù)八進(jìn)制數(shù)十進(jìn)制數(shù)十六進(jìn)制數(shù)對(duì)于部分情況,和存在分歧。例如,表示希臘字符關(guān)于字符串的轉(zhuǎn)換,其實(shí)核心就是函數(shù),如果是數(shù)字型,還可以添加參數(shù),使之變?yōu)槎M(jìn)制八進(jìn)制十進(jìn)制十六進(jìn)制數(shù)。
雖然目前已經(jīng)算是ES6的時(shí)代,然是ES5的尾巴仍在眾多框架中出現(xiàn),JS我雖然通過(guò)視頻等方式學(xué)習(xí),曾經(jīng)做過(guò)項(xiàng)目,但是仍對(duì)部分細(xì)節(jié)和原理不了解,通過(guò)閱讀這本書(shū),希望能對(duì)ES5有更加完整的了解。
為什么我要選擇這個(gè)做專(zhuān)題數(shù)據(jù)類(lèi)型相信對(duì)JS有所了解的人都不陌生,但是具體的細(xì)節(jié)我還是想做好筆記,方便復(fù)查,有時(shí)候,這種細(xì)節(jié)問(wèn)題出bug你要是不知道是根本無(wú)法排除的。另外,面試的時(shí)候很可能遇到。
數(shù)據(jù)類(lèi)型 簡(jiǎn)單數(shù)據(jù)類(lèi)型ES5中有5中簡(jiǎn)單數(shù)據(jù)類(lèi)型,Undefined, Null, Boolean, Number, String.
Undefined類(lèi)型一種特殊的數(shù)據(jù)類(lèi)型,只有一個(gè)值undefined。
var message; alert(message==undefined); // true
已經(jīng)聲明但是沒(méi)有初始化的變量默認(rèn)都是Undefined類(lèi)型的。但是需要強(qiáng)調(diào)的是,Undefined類(lèi)型的默認(rèn)是在已經(jīng)聲明的前提下,未聲明的變量是直接報(bào)錯(cuò)而并非Undefined。
var message; // var news; // news未聲明 alert(message==undefined); // true alert(news==undefined); // 報(bào)錯(cuò)Null類(lèi)型
Null類(lèi)型同樣很特殊,只有一種值,那就是null,他更像是一個(gè)空指針,所以其typeof會(huì)顯示為object類(lèi)型。另外,當(dāng)不清楚變量的初始值時(shí),將變量初始為null更加合適,這樣一來(lái),只要直接檢查 null 值就可以知道相應(yīng)的變量是否已經(jīng)保存了一個(gè)對(duì)象的引用。
if (car!=null){ // some possible operation }
還需要注意的是,Null類(lèi)型和Undefined類(lèi)型的相等操作符運(yùn)算返回值為“true”。
Boolean類(lèi)型布爾型只有兩個(gè)值,true和false,他不是簡(jiǎn)單的1和0的對(duì)應(yīng)關(guān)系,而是真假,但是,簡(jiǎn)便地,數(shù)據(jù)類(lèi)型的轉(zhuǎn)換會(huì)十分靈活,如下面所示。
數(shù)據(jù)類(lèi)型 | 轉(zhuǎn)換為T(mén)rue | 轉(zhuǎn)換為False |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非0數(shù)值,包括無(wú)窮大 | 0和NaN |
Object | 任何對(duì)象 | null |
Undefined | n/a | undefined |
Number類(lèi)型還能細(xì)分整數(shù)和浮點(diǎn)數(shù)值。
// 整數(shù) var intNum=55; // 八進(jìn)制 var octalNum1=070; var octalNum2=079; var octalNum3=08; // 十六進(jìn)制 var hexNum1=0xA; var hexNum2=0x1f; // 浮點(diǎn)數(shù) var floatNum1=1.1; var floatNum2=10.; // 會(huì)解析為整數(shù) var floatNum3=3.14e10; // 科學(xué)計(jì)數(shù)法
js在計(jì)算中存在精度問(wèn)題的內(nèi)容我多帶帶寫(xiě)一篇文章解釋?zhuān)墙鉀QJS浮點(diǎn)數(shù)精度問(wèn)題。由于精度問(wèn)題的復(fù)雜性,自己變成解決成本太高,有人已經(jīng)組件化實(shí)現(xiàn)了。Big.js
計(jì)算機(jī)中的數(shù)值是存在范圍的,最小值精度表示為Number.MIN_VALUE,值為5e-325,最大值表示為Number.MAX_VALUE,值為1.7976931348623157e+308。超過(guò)最大值會(huì)被解析為Infinity,小于最小值精度-Infinity。
NaN是最特殊的類(lèi)型,表示沒(méi)有意義的數(shù),例如10/0。而且有下面的特殊規(guī)則。
alert(NaN == NaN); //false alert(isNaN(NaN)); //true alert(isNaN(10)); //false( 10 是一個(gè)數(shù)值) alert(isNaN("10")); //false(可以被轉(zhuǎn)換成數(shù)值 10) alert(isNaN("blue")); //true(不能轉(zhuǎn)換成數(shù)值) alert(isNaN(true)); //false(可以被轉(zhuǎn)換成數(shù)值 1)
數(shù)值轉(zhuǎn)換成其他類(lèi)型規(guī)則和案例如下:
如果是 Boolean 值, true 和 false 將分別被轉(zhuǎn)換為 1 和 0。
如果是數(shù)字值,只是簡(jiǎn)單的傳入和返回。
如果是 null 值,返回 0。
如果是 undefined,返回 NaN。
如果是字符串,遵循下列規(guī)則:
如果字符串中只包含數(shù)字(包括前面帶正號(hào)或負(fù)號(hào)的情況),則將其轉(zhuǎn)換為十進(jìn)制數(shù)值,即"1"
會(huì)變成 1, "123"會(huì)變成 123,而"011"會(huì)變成 11(注意:前導(dǎo)的零被忽略了);
如果字符串中包含有效的浮點(diǎn)格式,如"1.1",則將其轉(zhuǎn)換為對(duì)應(yīng)的浮點(diǎn)數(shù)值(同樣,也會(huì)忽略前導(dǎo)零);
如果字符串中包含有效的十六進(jìn)制格式,例如"0xf",則將其轉(zhuǎn)換為相同大小的十進(jìn)制整數(shù)值;
如果字符串是空的(不包含任何字符),則將其轉(zhuǎn)換為 0;
如果字符串中包含除上述格式之外的字符,則將其轉(zhuǎn)換為 NaN。
如果是對(duì)象,則調(diào)用對(duì)象的 valueOf()方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值。如果轉(zhuǎn)換的結(jié)果是 NaN,則調(diào)用對(duì)象的toString()方法,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值。
var num1 = Number("Hello world!"); //NaN var num2 = Number(""); //0 var num3 = Number("000011"); //11 var num4 = Number(true); //1
由于Number()比較復(fù)雜,處理整數(shù)的時(shí)候parseInt()函數(shù),規(guī)則不用多說(shuō),直接看例子。
var num1 = parseInt("1234blue"); // 1234 var num2 = parseInt(""); // NaN var num3 = parseInt("0xA"); // 10(十六進(jìn)制數(shù)) var num4 = parseInt(22.5); // 22 var num5 = parseInt("070"); // 56(八進(jìn)制數(shù)) var num6 = parseInt("70"); // 70(十進(jìn)制數(shù)) var num7 = parseInt("0xf"); // 15(十六進(jìn)制數(shù))
對(duì)于部分情況,ES3和ES5存在分歧。
//ECMAScript 3 認(rèn)為是 56(八進(jìn)制), ECMAScript 5 認(rèn)為是 70(十進(jìn)制) var num = parseInt("070"); alert(num)
為了防止上述問(wèn)題,這個(gè)函數(shù)有了雙參數(shù)形式。雙參數(shù)形式的主要目的其實(shí)是規(guī)定解析的進(jìn)制。
var num = parseInt("0xAF", 16); //175 var num1 = parseInt("AF", 16); //175 var num2 = parseInt("AF"); //NaN var num1 = parseInt("10", 2); //2 (按二進(jìn)制解析) var num2 = parseInt("10", 8); //8 (按八進(jìn)制解析) var num3 = parseInt("10", 10); //10 (按十進(jìn)制解析) var num4 = parseInt("10", 16); //16 (按十六進(jìn)制解析)
類(lèi)似地,還有parseFloat()函數(shù)。下面是詳細(xì)的例子。主要是要看清楚其解析機(jī)制。
var num1 = parseFloat("1234blue"); //1234 (整數(shù)) var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.34.5"); //22.34 var num5 = parseFloat("0908.5"); //908.5 var num6 = parseFloat("3.125e7"); //31250000String類(lèi)型
字符串相信都比較熟悉,此處首先是先強(qiáng)調(diào)一點(diǎn),JS對(duì)單雙引號(hào)括起來(lái)的字符串沒(méi)有區(qū)別,但是必須匹配。
下面是常見(jiàn)的轉(zhuǎn)義字符:
轉(zhuǎn)義字符 | 含 義 |
---|---|
n | 換行 |
t | 制表 |
b | 空格 |
r | 回車(chē) |
f | 進(jìn)紙 |
斜杠 | |
" | 單引號(hào)("),在用單引號(hào)表示的字符串中使用。例如: "He said, "hey."" |
" | 雙引號(hào)("),在用雙引號(hào)表示的字符串中使用。例如: "He said, "hey."" |
xnn | 以十六進(jìn)制代碼nn表示的一個(gè)字符(其中n為0~F)。例如, x41表示"A" |
unnnn | 以十六進(jìn)制代碼nnnn表示的一個(gè)Unicode字符(其中n為0~F)。例如, u03a3表示希臘字符Σ |
關(guān)于字符串的轉(zhuǎn)換,其實(shí)核心就是toString()函數(shù),如果是數(shù)字型,還可以添加參數(shù),使之變?yōu)槎M(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制數(shù)。
var num = 10; alert(num.toString()); // "10" alert(num.toString(2)); // "1010" alert(num.toString(8)); // "12" alert(num.toString(10)); // "10" alert(num.toString(16)); // "a"
而對(duì)其他類(lèi)型,存在一些特殊情況:
var value1 = 10; var value2 = true; var value3 = null; var value4; alert(String(value1)); // "10" alert(String(value2)); // "true" alert(String(value3)); // "null" alert(String(value4)); // "undefined"Object類(lèi)型
object同樣屬于一種數(shù)據(jù)類(lèi)型,但是屬于復(fù)雜數(shù)據(jù)類(lèi)型,在這本書(shū)里面專(zhuān)門(mén)有專(zhuān)題講解,此處先不贅述。
下面是我的個(gè)人公眾號(hào),技術(shù)方面的內(nèi)容以及非技術(shù)方面內(nèi)容都會(huì)在此展示。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82099.html
摘要:作用域鏈的用途,是保證對(duì)執(zhí)行環(huán)境有權(quán)訪問(wèn)的所有變量和函數(shù)的有序訪問(wèn)。這樣,一直延續(xù)到全局執(zhí)行環(huán)境全局執(zhí)行環(huán)境的變量對(duì)象始終都是作用域鏈中的最后一個(gè)對(duì)象。如果在局部環(huán)境中沒(méi)有找到該變量名,則繼續(xù)沿作用域鏈向上搜索。 【JavaScript.ES5】執(zhí)行環(huán)境和作用域 參考文獻(xiàn): Nicholas C.Zakas 《JavaScript》高級(jí)程序設(shè)計(jì) 僅為個(gè)人學(xué)習(xí)參考文獻(xiàn)的內(nèi)容記錄的筆記。存...
showImg(http://img3.douban.com/lpic/s8958650.jpg); 0x00 javascript組成 ECMAScript(-265)核心語(yǔ)言部分 DOM文檔對(duì)象模型(DOM1、2、3) BOM瀏覽器對(duì)象模型(提供與瀏覽器交互的接口和方法) 0x01 async 異步加載 執(zhí)行順序不定 charset defer 延遲加載,立即下載腳本但不執(zhí)行 src ...
摘要:高程讀書(shū)筆記第六章理解對(duì)象創(chuàng)建自定義對(duì)象的方式有創(chuàng)建一個(gè)實(shí)例,然后為它添加屬性和方法。創(chuàng)建了自定義的構(gòu)造函數(shù)之后,其原型對(duì)象默認(rèn)只會(huì)取得屬性至于其他方法都是從繼承而來(lái)的。 JS高程讀書(shū)筆記--第六章 理解對(duì)象 創(chuàng)建自定義對(duì)象的方式有創(chuàng)建一個(gè)Object實(shí)例,然后為它添加屬性和方法。還可用創(chuàng)建對(duì)象字面量的方式 屬性類(lèi)型 ECMAScript在定義只有內(nèi)部采用的特性時(shí),描述了屬性的各種特征...
摘要:在同一個(gè)塊內(nèi),不允許用重復(fù)聲明變量。中為新增了塊級(jí)作用域。自帶遍歷器的對(duì)象有數(shù)組字符串類(lèi)數(shù)組對(duì)象對(duì)象的對(duì)象等和結(jié)構(gòu)對(duì)象。返回一個(gè)遍歷器,使遍歷數(shù)組的鍵值對(duì)鍵名鍵值。 目錄 1.語(yǔ)法 2.類(lèi)型、值和變量 3.表達(dá)式和運(yùn)算符 4.語(yǔ)句 5.數(shù)組 6.對(duì)象 7.函數(shù) 8.全局屬性和方法 9.詞法作用域、作用域鏈、閉包 10.原型鏈、繼承機(jī)制 11.this的理解 12.ES5新特性 13.E...
摘要:主要知識(shí)點(diǎn)有對(duì)象類(lèi)別屬性速記法方法簡(jiǎn)寫(xiě)需計(jì)算屬性名方法方法可允許重復(fù)的屬性自有屬性的枚舉順序方法引用方法定義深入理解筆記目錄對(duì)象類(lèi)別普通對(duì)象擁有對(duì)象所有默認(rèn)的內(nèi)部行為。奇異對(duì)象其內(nèi)部行為在某些方面有別于默認(rèn)行為。所有的標(biāo)準(zhǔn)對(duì)象都是內(nèi)置對(duì)象。 主要知識(shí)點(diǎn)有對(duì)象類(lèi)別、屬性速記法、方法簡(jiǎn)寫(xiě)、需計(jì)算屬性名、Object.is()方法、Object.assign()方法、可允許重復(fù)的屬性、自有屬...
閱讀 1719·2023-04-26 02:30
閱讀 1049·2021-11-10 11:36
閱讀 1396·2021-10-08 10:14
閱讀 3522·2021-09-28 09:35
閱讀 1562·2021-08-23 09:47
閱讀 2561·2019-08-30 15:56
閱讀 1482·2019-08-30 15:44
閱讀 1774·2019-08-30 13:59