這篇文章主要介紹“JavaScript如何實現(xiàn)基礎(chǔ)類型、對象一樣有屬性和方法”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“JavaScript如何實現(xiàn)基礎(chǔ)類型、對象一樣有屬性和方法”文章能幫助大家解決問題。
公司主營業(yè)務(wù):網(wǎng)站制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出欒川免費做網(wǎng)站回饋大家。
在其他面向?qū)ο蟮木幊陶Z言中,例如Java
、C++
,屬性是對象的獨有概念,基礎(chǔ)類型就是基礎(chǔ)類型,是不存在屬性方法概念的。
沒錯,又是JavaScript
的餿主意,其引擎允許我們像操作對象一樣使用屬性方法操作基礎(chǔ)類型的數(shù)據(jù)。
在講解這個奇怪的特性之前,我們要先明確基礎(chǔ)類型和對象類型之間的差別是什么?
何為基礎(chǔ)類型
JavaScript
基礎(chǔ)類型中的中一種值;
JavaScript
中存在7
種基礎(chǔ)類型,分別是:String
、Number
、Boolean
、BigInt
、Symbol
、null
和undefined
;
何為對象類型
一個數(shù)據(jù)包,使用{ }
創(chuàng)建,能存儲多個值;
JavaScript
還有其他類型的對象,例如函數(shù);
面向?qū)ο笾袝婕埃雽ο蟮囊粋€關(guān)鍵特性是封裝,它可以把各種亂七八糟的數(shù)據(jù)、方法統(tǒng)一的存儲在一個對象中,從而降低使用的復(fù)雜性。
例如:
let user = { name : "xiaoming", hello() { console.log(`你好,我是${this.name}`); }}user.hello();
我們把對象user
的屬性和方法封裝成了一個對象,這樣在使用的時候就非常簡單,我們只需要使用obj.attr
的方式就能調(diào)用方法或者屬性。
但是,這么做是由額外的開銷的(面向?qū)ο笥蓄~外的開銷),這也是面向?qū)ο蟮恼Z言C++
相比于C
慢的地方。
基礎(chǔ)類型作為對象使用存在兩個難以調(diào)和的問題:
我們希望對基礎(chǔ)類型的操作可以像使用對象一樣,例如"abc".toUpperCase()
;
對象有額外開銷,我們又希望保持基礎(chǔ)類型的簡單、高效特性;
JavaScript
解決以上問題的方式相當(dāng)?shù)摹昂拖∧唷保?/p>
基礎(chǔ)類型就是基礎(chǔ)類型,提供獨立的、單個的值;
允許訪問String
、Number
、Boolean
和Symbol
類型的方法和屬性;
為了保證理論的完整,在使用基礎(chǔ)類型的方法和屬性時,先將其包裝成對象,隨后在銷毀;
以上規(guī)則的意思是,基礎(chǔ)類型仍然是基礎(chǔ)類型,但是呢,如果我們想訪問基礎(chǔ)類型的方法和屬性,就會把基礎(chǔ)類型包裝成對象(對象包裝器),等訪問完了再銷毀。講真,聽起來多少有點扯。
舉個例子:
let name = "Trump";console.log(name.toUpperCase());//訪問基礎(chǔ)類型的方法
以上代碼的執(zhí)行結(jié)果如下:
看起好像也沒什么大問題,但是,其中發(fā)生了很多事情,我們需要知道以下幾點:
name
是個字符串基礎(chǔ)類型,它本身沒啥特別的地方;
在訪問name
屬性方法的時候,創(chuàng)建了一個包含字符串值的特殊對象,這個對象有toUpperCase
方法;
調(diào)用特殊對象的方法toUpperCase
返回一個新的字符串;
特殊對象用完即銷毀;
變量本身的值并沒有發(fā)生改變,如下:
雖然解決方法充滿了妥協(xié)(餿主意),但是,結(jié)果還是好的,達成的成就如下:
基礎(chǔ)類型保持了本身的簡單、高效;
基礎(chǔ)類型通過特殊對象擁有了屬性和方法;
保持了理論的完整,即只有對象才有屬性和方法;
理論上雖然如此,但實際上JavaScript
引擎高度優(yōu)化了這個過程,我懷疑它根本就沒有創(chuàng)建額外的對象。只是在口頭上表示自己遵循了規(guī)范,好像真的搞了個臨時對象一樣。
本文只是簡單的介紹基礎(chǔ)類型方法的概念,并不對各種方法進行講解,伴隨著教程不斷深入,會逐步涉及大量的方法。這里只簡單的列舉基礎(chǔ)類型常用的一些方法和屬性。
不同的基礎(chǔ)類型,擁有不同的屬性方法,以下分類列舉:
length
屬性,返回字符串長度
console.log("abc".length);
以上代碼結(jié)果如下:
indexOf(ch)
方法,返回字符串中第一個字符ch
的下標(biāo)
console.log("abc".indexOf('b'));console.log("abc".indexOf('d'));
代碼執(zhí)行結(jié)果如下:
當(dāng)字符存在于字符串返回下標(biāo)(從0
開始計),如果找不到就返回-1
。
concat(str)
方法,拼接兩個字符串
let str1 = "hello ";let str2 = "world!";console.log(str1.concat(str2));console.log(str1);console.log(str2);
代碼執(zhí)行結(jié)果如下:
replace(str1,str2)
方法,使用str2
替換str1
let str = "javascript";console.log(str.replace('java','996'));console.log(str);
代碼執(zhí)行結(jié)果如下:
toFixed(num)
方法,四舍五入小數(shù)到指定精度
console.log(9.3333333.toFixed(3));console.log(9.3333333.toFixed(0));
代碼執(zhí)行結(jié)果如下:
toString()
方法,轉(zhuǎn)數(shù)字為字符串
3.14.toString();//轉(zhuǎn)為'3.14'console.log((8).toString(2));//轉(zhuǎn)為二進制'1000'console.log((9).toString(2));//轉(zhuǎn)為二進制'1001'console.log((996).toString(16));//轉(zhuǎn)為16進制字符串'3e4'
代碼執(zhí)行結(jié)果如下:
toExponential()
方法,轉(zhuǎn)為指數(shù)計數(shù)法
console.log(3.1415926.toExponential());console.log(3.1415926.toExponential(2));console.log(3.1415926.toExponential(3));
代碼執(zhí)行結(jié)果如下:
后繼章節(jié)會展示更多的方法,這里就不過的贅述。
和Java
一樣,JavaScript
可以通過new
操作符,顯式的為基礎(chǔ)類型創(chuàng)建“對象包裝器”,這種做法是極其不推薦的,這里提出,僅為了知識的完整性。
這種做法存在問題,舉例如下:
let num = new Number(0);console.log(typeof num);console.log(typeof 0);
代碼執(zhí)行結(jié)果如下:
亦或者,在判斷中會出現(xiàn)混淆:
let zero = new Number(0);if (zero) { // zero 為 true,因為它是一個對象 console.log('true');}
代碼執(zhí)行結(jié)果如下:
同時,大家不要忘了,不帶 new
(關(guān)鍵字)的 String/Number/Boolean
函數(shù)可以將一個值轉(zhuǎn)換為相應(yīng)的類型:轉(zhuǎn)成字符串、數(shù)字或布爾值(原始類型)。
例如:
console.log(typeof Number('123'));
注意:
null
和undefined
兩種類型沒有任何方法
關(guān)于“JavaScript如何實現(xiàn)基礎(chǔ)類型、對象一樣有屬性和方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。