摘要:你不知道的基本包裝類型聲明本文的大部分內(nèi)容參考自高級(jí)程序設(shè)計(jì)第三版中文版,中間夾雜一些自己閱讀這部分內(nèi)容時(shí)的思路。而且,上面的步驟同樣適用于類型的類型對(duì)應(yīng)的布爾值和數(shù)字值。
JavaScript 你不知道的基本包裝類型
聲明:本文的大部分內(nèi)容參考自《JavaScript 高級(jí)程序設(shè)計(jì)(第三版)》(中文版 P.118),中間夾雜一些自己閱讀這部分內(nèi)容時(shí)的思路。
JavaScript 中共有 6 種基本數(shù)據(jù)類型:Undefined、Null、Boolean、Number、String、Symbol (new in ES 6) !
舉例子入門基本數(shù)據(jù)類型的值不是對(duì)象,因而從邏輯上講它們不應(yīng)該有方法或者屬性,然而事實(shí)并不是我們所想的那樣,看法寶:
var str = "hello world"; str.length; // 11 str.toUpperCase(); // HELLO WORLD
你對(duì)上面的現(xiàn)象有疑問嗎?沒有的話,可以關(guān)掉這個(gè)頁面了。
引入基本包裝類型為了便于操作基本數(shù)據(jù)類型的值,JavaScript 中的原始數(shù)據(jù)類型的值會(huì)在后臺(tái)隱式地被包裝為對(duì)象,從而引出了基本包裝類型(primitive wrapper type)這個(gè)概念。
【書中原話】每當(dāng)讀取一個(gè)基本類型的值的時(shí)候,后臺(tái)就創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型的對(duì)象,從而讓我們能夠調(diào)用一些方法來操作這些數(shù)據(jù)。
這也是為什么書中會(huì)提到這句話,ECMAScript 還提供了3個(gè)特殊的引用類型:Boolean、Number、String。哦,不對(duì)了,現(xiàn)在不是又出現(xiàn)了一種新的數(shù)據(jù)類型嗎?所以,這句話應(yīng)該改為:ECMAScript 還提供了4個(gè)特殊的引用類型:Boolean、Number、String、Symbol。
除了 null 和 undefined,所有的原始值都有等價(jià)的、由對(duì)象包裝原始值的形式表達(dá),取而代之,null 和 undefined 常被當(dāng)作一個(gè)全局對(duì)象的全局屬性來使用。
window.null; // undefined window.undefined; // undefined null == undefined; // true null === undefined; // false繼續(xù)剛開始的那個(gè)例子
為了方便,就把前面的代碼直接挪過來了。
var str = "hello world"; str.length; // 11 str.toUpperCase(); // HELLO WORLD
我們看到的代碼是上面的樣子,其實(shí)后臺(tái)會(huì)自動(dòng)完成下列的處理:
執(zhí)行到第二行時(shí):
創(chuàng)建 String 類型的一個(gè)實(shí)例;
在實(shí)例上調(diào)用指定的屬性;
銷毀這個(gè)實(shí)例;
執(zhí)行到第三行時(shí):
創(chuàng)建 String 類型的一個(gè)實(shí)例;
在實(shí)例上調(diào)用指定的方法;
銷毀這個(gè)實(shí)例;
可以將上面的步驟想象成下列 ECMAScript 代碼:
// 執(zhí)行到第二行時(shí) var str = new String("hello world"); str.length; str = null; // 執(zhí)行到第三行時(shí) var str = new String("hello world"); str.toUpperCase(); str = null;
經(jīng)過此番處理,基本的字符串值就變得跟對(duì)象一樣啦。而且,上面的步驟同樣適用于 Boolean 類型的 Number 類型對(duì)應(yīng)的布爾值和數(shù)字值。
嘿嘿,啰嗦了這么多,搞懂了嗎?
引用類型與基本包裝類型的區(qū)別引用類型與基本包裝類型的主要區(qū)別就是對(duì)象的生存期。
使用 new 操作符創(chuàng)建的引用類型的實(shí)例,在執(zhí)行流離開當(dāng)前作用域之前,會(huì)一直保存在堆內(nèi)存中。而后臺(tái)自動(dòng)創(chuàng)建的基本包裝類型的對(duì)象,則只存在一行代碼的執(zhí)行瞬間,然后立即被銷毀。這意味著我們不能為基本類型的值添加屬性和方法。
看了上面的原理,再來看例子:
var str = "some text"; str.color = "red"; console.log(str.color); // undefined
在此,第二行表面上看是為 str 添加了 color 屬性,但是仔細(xì)回想上面的后臺(tái)執(zhí)行的那 3 個(gè)步驟,會(huì)發(fā)現(xiàn),第二行創(chuàng)建的 String 對(duì)象在添加了 color 屬性后,被銷毀了。執(zhí)行到第三行時(shí),第三行代碼又創(chuàng)建了自己的 String 對(duì)象,然而這個(gè)對(duì)象沒有 color 屬性。一切都顯得那么清晰。
為了與上面的例子形成對(duì)比,我們顯式地創(chuàng)建基本包裝類型的對(duì)象,代碼如下:
var str = new String("some text"); str.color = "red"; console.log(str.color); // red
書中有警告:除非絕對(duì)必要,否則不要顯式地創(chuàng)建基本包裝類型的對(duì)象,因?yàn)檫@種做法很容易讓人分不清自己是在處理基本類型還是引用類型的值。
var value = "25"; var number = Number(value); // 轉(zhuǎn)型函數(shù) console.log(number); // 25 var obj = new Number(value); // 構(gòu)造函數(shù) console.log(typeof obj); // object console.log(obj); // Number {[[PrimitiveValue]]: 25}Boolean 引用類型
書中很嚴(yán)肅地說:理解基本類型的布爾值與 Boolean 對(duì)象之間的區(qū)別非常重要------當(dāng)然,我們的建議是永遠(yuǎn)不要使用 Boolean 對(duì)象。
Number 引用類型吐槽一下,segmentfault 好像不讓上傳本地的無聊表情包,所以只好外鏈過來了。喔草,我剛剛說了什么。。。
【MDN】傳送門---Number
var num = 1.2345678; num.toFixed(2); // 1.23 num.toPrecision(2); // 1.2 num.toExponential(2); // 1.23e+0String 引用類型
【MDN】傳送門---String
這個(gè)家伙的方法就很多了。
charAt()
concat()
slice()
indexOf()
trim()
toUpperCase()
toLowerCase()
match()
search()
replace()
.........
自己進(jìn)門里面探索去吧!
Symbol 引用類型 (ES 6)【MDN】傳送門---Symbol
額,這個(gè)還沒怎么用過呢。但是這里還是有一點(diǎn)需要注意下:
var sym = new Symbol(); // TypeError: Symbol is not a constructor
為什么會(huì)這樣呢?這是因?yàn)?strong>圍繞原始數(shù)據(jù)類型創(chuàng)建一個(gè)顯式包裝器對(duì)象從 ECMAScript 6 開始不再被支持。 然而,現(xiàn)有的原始包裝器對(duì)象,如 new Boolean、new String 以及 new Number 因?yàn)檫z留原因仍可被創(chuàng)建。
好了,就這樣結(jié)束吧!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/80279.html
摘要:就像我寫書的過程一樣,每個(gè)開發(fā)者在學(xué)習(xí)函數(shù)式編程的旅程中都會(huì)經(jīng)歷這個(gè)部分。類型在函數(shù)式編程中有一個(gè)巨大的興趣領(lǐng)域類型論,本書基本上完全遠(yuǎn)離了該領(lǐng)域。在函數(shù)式編程中,像這樣涵蓋是很普遍的。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個(gè)流淌著滬江血液的純粹工程:認(rèn)真,是 HTML...
摘要:詞法熟悉語法的開發(fā)者,箭頭函數(shù)在涉及綁定時(shí)的行為和普通函數(shù)的行為完全不一致。被忽略的作為的綁定對(duì)象傳入,使用的是默認(rèn)綁定規(guī)則。使用內(nèi)置遍歷數(shù)組返回迭代器函數(shù)普通對(duì)象不含有,無法使用,可以進(jìn)行改造,個(gè)人博客地址 this詞法 熟悉ES6語法的開發(fā)者,箭頭函數(shù)在涉及this綁定時(shí)的行為和普通函數(shù)的行為完全不一致。跟普通this綁定規(guī)則不一樣,它使用了當(dāng)前的詞法作用域覆蓋了this本來的值。...
摘要:強(qiáng)制類型轉(zhuǎn)換本章介紹了的數(shù)據(jù)類型之間的轉(zhuǎn)換即強(qiáng)制類型轉(zhuǎn)換包括顯式和隱式。強(qiáng)制類型轉(zhuǎn)換常常為人詬病但實(shí)際上很多時(shí)候它們是非常有用的。隱式強(qiáng)制類型轉(zhuǎn)換則沒有那么明顯是其他操作的副作用。在處理強(qiáng)制類型轉(zhuǎn)換的時(shí)候要十分小心尤其是隱式強(qiáng)制類型轉(zhuǎn)換。 前言 《你不知道的 javascript》是一個(gè)前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開發(fā)者迎難而上,深入語言內(nèi)部,弄清楚JavaSc...
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸耍虼宋闹兄豢炊?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:如果是聲明中的第一個(gè)詞,那么就是一個(gè)函數(shù)聲明,否則就是一個(gè)函數(shù)表達(dá)式。給函數(shù)表達(dá)式指定一個(gè)函數(shù)名可以有效的解決以上問題。始終給函數(shù)表達(dá)式命名是一個(gè)最佳實(shí)踐。也有開發(fā)者干脆關(guān)閉了靜態(tài)檢查工具對(duì)重復(fù)變量名的檢查。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡(jiǎn)單易用的語言,又是一門具有許多復(fù)雜微妙技術(shù)的語言,即使是經(jīng)驗(yàn)豐富的 Ja...
閱讀 4276·2021-10-13 09:39
閱讀 482·2021-09-06 15:02
閱讀 3229·2019-08-30 15:53
閱讀 1040·2019-08-30 13:04
閱讀 2029·2019-08-30 11:27
閱讀 2010·2019-08-26 13:51
閱讀 2092·2019-08-26 11:33
閱讀 2902·2019-08-26 10:36