摘要:包裝對(duì)象即,與數(shù)值字符串布爾值相對(duì)應(yīng)的三個(gè)原生對(duì)象。顯示類型轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換即,顯示調(diào)用函數(shù)進(jìn)行類型轉(zhuǎn)換。返回對(duì)象的字符串?dāng)?shù)值或布爾值表示,通常與返回的值相同。
一、類型與包裝對(duì)象 1. 類型
原始類型:
number
string
boolean
null
undefined
Symbol
對(duì)象類型:
Object
Array
Function
原始類型(基本類型)和對(duì)象類型(引用類型)的區(qū)別:
原始類型不能修改值,對(duì)象類型可以。
分析:原始類型存儲(chǔ)在棧內(nèi)存中,對(duì)象類型存儲(chǔ)在堆內(nèi)存中。原始類型的修改都是重新賦值。
即,聲明一個(gè)原始類型,var a = 2;那么會(huì)在棧內(nèi)存中開(kāi)辟一塊內(nèi)存用于存儲(chǔ)原始類型a,當(dāng)重新賦值a = 234的時(shí)候,會(huì)重新開(kāi)辟一塊棧內(nèi)存用于存儲(chǔ)重新賦值的原始類型a,2則被垃圾回收機(jī)制回收。
至于對(duì)象類型,棧內(nèi)存中存的是對(duì)象數(shù)據(jù)在堆內(nèi)存中的首地址,也就是該數(shù)據(jù)的引用。在訪問(wèn)變量的時(shí)候就會(huì)去堆內(nèi)存中找引用對(duì)象的值,修改的時(shí)候也是修改堆內(nèi)存中的值。
原始類型沒(méi)有屬性和方法,對(duì)象類型可以有
null和undefined的區(qū)別:
undefined表示一個(gè)未被賦值的棧內(nèi)存的空間,null表示棧空間的引用沒(méi)有指向一個(gè)地址
進(jìn)行顯示類型轉(zhuǎn)換時(shí),null為0,undefined為NaN
typeof(null) === "object"
typeof(undefined) ==="undefined"
包裝對(duì)象-by阮一峰/W3cschool(2019.1.4)
JS語(yǔ)言:“一切皆對(duì)象”,數(shù)組和函數(shù)本質(zhì)上是對(duì)象,三種原始數(shù)據(jù)類型的值(數(shù)值、字符串、布爾值
)在一定條件下、也會(huì)自動(dòng)轉(zhuǎn)為對(duì)象、這就是原始類型的“包裝對(duì)象”。
包裝對(duì)象:即,與數(shù)值、字符串、布爾值相對(duì)應(yīng)的Number、String、Boolean三個(gè)原生對(duì)象。三個(gè)原生對(duì)象可以把原始類型的值變成(包裝成)對(duì)象。
var num = new Number(123); var str = new String("abc"); var bool = new Boolean(true);
例如:
var str = "test";//通過(guò)字符串字面量定義的字符串值不是對(duì)象 str.length //4 str.slice(0,1) //"t" var a = 7; a.toString() //"7"
str是原始類型string的變量,進(jìn)行屬性和調(diào)用方法的操作時(shí),js會(huì)通過(guò)new String()構(gòu)建一個(gè)包裝對(duì)象(臨時(shí)的),這個(gè)包裝對(duì)象再進(jìn)行屬性和方法的訪問(wèn),訪問(wèn)結(jié)束后,js會(huì)銷毀該包裝對(duì)象,所以只能讀不能改。null和undefined沒(méi)有構(gòu)造函數(shù),所以也沒(méi)有包裝對(duì)象,如果訪問(wèn)其屬性和方法將會(huì)跑出異常。
補(bǔ)充:toString()方法是Number對(duì)象的方法,把數(shù)字轉(zhuǎn)換成字符串。
JS是弱類型,無(wú)論什么類型都是通過(guò)var來(lái)聲明。
https://www.jb51.net/article/...
一定為false的值:
0或+0、-0,NaN //數(shù)值 "" //空字符串值 false //false布爾值 undefined null
if (a && b)的正確理解方式是:a && b進(jìn)行表達(dá)式求值后,然后再轉(zhuǎn)換為Boolean類型。
☆ 顯示類型轉(zhuǎn)換(強(qiáng)制轉(zhuǎn)換)
即,顯示調(diào)用String();Number();Boolean()函數(shù)進(jìn)行類型轉(zhuǎn)換。
var a = [9,8]//數(shù)組 String(a)//"9,8" var a = 123 String(a) // "123" Boolean(a) // true var b = "123a" Number(b) // NaN Boolean(b) // true //引用類型顯示轉(zhuǎn)換為原始類型 var a = ["9"] Number(a) // 9 String(a) // "9" var b = { c: "this is a time", toString: function(){ return 5 } } Number(b) // 5 String(b) // "5"
☆ 隱式轉(zhuǎn)換(自動(dòng)轉(zhuǎn)換,用的比較多)原始類型的類型轉(zhuǎn)換,引用類型的轉(zhuǎn)換。
通過(guò)運(yùn)算符進(jìn)行轉(zhuǎn)換,例如:== + -
注意:===運(yùn)算符,是類型和數(shù)值都一樣,才能返回true
以==為例:
首先,null和undefined==其他類型都為false。
null == undefined只能跟自己和對(duì)方==返回true,其他情況是false;
可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換:
var a = null String(a) a==null //強(qiáng)制類型轉(zhuǎn)換,并不會(huì)影響a本身的值,只是在運(yùn)算的時(shí)候不同
然后,原始類型之間的轉(zhuǎn)換,都是以構(gòu)造函數(shù)進(jìn)行轉(zhuǎn)換,即將==兩邊的值都轉(zhuǎn)換成Number再進(jìn)行比較
引用類型轉(zhuǎn)換為原始類型過(guò)程:
1.先調(diào)用valueOf()方法,如果返回原始類型,則結(jié)束,否則執(zhí)行下一步
2.接著調(diào)用toString()方法,得到初步原始類型(初步原始類型一定是一個(gè)非空字符串)
3.將得到的初步原始類型轉(zhuǎn)換為目標(biāo)原始類型
所有引?用類型的最頂層的proto對(duì)象(可以理解為基類),都為Object的prototype,其必包含toString方法,該方法返回?cái)?shù)據(jù)類型字符串,轉(zhuǎn)換為boolean為true,所以所有的對(duì)象都為true。
var a = {}, b = [] if(a) {} if(b) {} // 不能通過(guò)這個(gè)?方式判定對(duì)象和數(shù)組為空,因?yàn)榭諗?shù)組或者空對(duì)象轉(zhuǎn)換成boolean值,都為true
原始類型的轉(zhuǎn)換:
“123” == false //false “123” == true //false
分析:true轉(zhuǎn)換為1了,false轉(zhuǎn)換成了0;“123”轉(zhuǎn)換成了123.
==符號(hào)會(huì)把兩邊都會(huì)類型轉(zhuǎn)換成Number,再進(jìn)行對(duì)比
var obj = {a:"123"} console.dir() obj.valueOf
☆ 拓展:
object類型具有valueOf()和toString()方法。valueOf()返回對(duì)象的字符串、數(shù)值或布爾值表示,通常與toString()返回的值相同。toString()返回對(duì)象的字符串表示。但是?。。。?shí)際上:
拿數(shù)組為例,toString方法返回的是由數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)由逗號(hào)分隔的字符串;valueOf方法返回的還是一個(gè)數(shù)組。
☆ ==與===
== 判斷相等時(shí),如果兩邊類型不同時(shí),會(huì)進(jìn)行類型轉(zhuǎn)換
===(絕對(duì)等于號(hào)) 判斷相等時(shí),不進(jìn)行類型轉(zhuǎn)換,類型不同,其值?定不絕對(duì)等于
當(dāng)兩邊都為引用類型時(shí),== 和 === 都是判斷兩邊是否指向同?個(gè)數(shù)據(jù),是則為true,否則為
false
[] == [] // false {} == {} // false var a = b = {} a == b // true a === b // true
☆經(jīng)典面試題:設(shè)計(jì)一個(gè)函數(shù),讓a既等于1又等于2又等于3。
考的是類型轉(zhuǎn)換,原始類型肯定是不可以的。
題目:a為何值時(shí),下面表達(dá)式為true if(a == 1 && a == 2 && a == 3){ // } 答案: var a = { b: 0, toString: function(){ return ++this.b } }
原理:
4.類型判斷1)typeof運(yùn)算符
typeof 1 // ‘number’ typeof NaN // "number" typeof {} // "Object" typeof null // "Object" typeof undefined // "undefined" var a = function(){} typeof a // "function"
缺點(diǎn):typeof只能判斷原始類型和函數(shù),不能判斷引用類型和null,它們都返回"object".
2)instanceof
使用方法:對(duì)象 instanceof 構(gòu)造方法
[] instanceof Array // true [] instanceof Object // true var b = {} b instanceof Object // true var a = function(){} a instanceof Function // true
原理:instanceof運(yùn)算符檢測(cè)左邊對(duì)象的原型鏈上是否有右邊構(gòu)造函數(shù)的prototype對(duì)象。
缺點(diǎn):
只能用來(lái)判斷對(duì)象;
不能跨iframe使用,因?yàn)椴煌琲frame其window不同.
3)constructor
[].constructor === Array // true "123".constructor === String // true function Fn(){ } var f = new Fn() f.constructor === Fn // true
原理:構(gòu)造函數(shù)的prototype對(duì)象指向構(gòu)造函數(shù)本身,創(chuàng)建新對(duì)象后,新對(duì)象繼承prototype對(duì)象,因此新對(duì)象的constructor指向了構(gòu)造函數(shù)。
缺點(diǎn):不能用來(lái)判斷null、undefined;
prototype對(duì)象可被重寫,constructor會(huì)丟失。
4)toString——最通用的方法
toString是Object的原型?方法,默認(rèn)返回當(dāng)前對(duì)象的類型,對(duì)所有情況都可以判斷。
Object.prototype.toString.call("1234") // ["Object String"] Object.prototype.toString.call([]) // ["Object Array"] Object.prototype.toString.call({}) // ["Object Object"] Object.prototype.toString.call(null) // ["Object Null"] Object.prototype.toString.call(undefined) // ["Object Undefined"]
5)其他判斷方法
Array.isArray([]) // true isNaN(NaN) // true
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100680.html
摘要:從最開(kāi)始的到封裝后的都在試圖解決異步編程過(guò)程中的問(wèn)題。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。異步編程入門的全稱是前端經(jīng)典面試題從輸入到頁(yè)面加載發(fā)生了什么這是一篇開(kāi)發(fā)的科普類文章,涉及到優(yōu)化等多個(gè)方面。 TypeScript 入門教程 從 JavaScript 程序員的角度總結(jié)思考,循序漸進(jìn)的理解 TypeScript。 網(wǎng)絡(luò)基礎(chǔ)知識(shí)之 HTTP 協(xié)議 詳細(xì)介紹 HTT...
摘要:詳解十大常用設(shè)計(jì)模式力薦深度好文深入理解大設(shè)計(jì)模式收集各種疑難雜癥的問(wèn)題集錦關(guān)于,工作和學(xué)習(xí)過(guò)程中遇到過(guò)許多問(wèn)題,也解答過(guò)許多別人的問(wèn)題。介紹了的內(nèi)存管理。 延遲加載 (Lazyload) 三種實(shí)現(xiàn)方式 延遲加載也稱為惰性加載,即在長(zhǎng)網(wǎng)頁(yè)中延遲加載圖像。用戶滾動(dòng)到它們之前,視口外的圖像不會(huì)加載。本文詳細(xì)介紹了三種延遲加載的實(shí)現(xiàn)方式。 詳解 Javascript十大常用設(shè)計(jì)模式 力薦~ ...
摘要:關(guān)鍵字計(jì)算為當(dāng)前執(zhí)行上下文的屬性的值。毫無(wú)疑問(wèn)它將指向了這個(gè)前置的對(duì)象。構(gòu)造函數(shù)也是同理。嚴(yán)格模式無(wú)論調(diào)用位置,只取顯式給定的上下文綁定的,通過(guò)方法傳入的第一參數(shù),否則是。其實(shí)并不屬于特殊規(guī)則,是由于各種事件監(jiān)聽(tīng)定義方式本身造成的。 this 是 JavaScript 中非常重要且使用最廣的一個(gè)關(guān)鍵字,它的值指向了一個(gè)對(duì)象的引用。這個(gè)引用的結(jié)果非常容易引起開(kāi)發(fā)者的誤判,所以必須對(duì)這個(gè)關(guān)...
摘要:作者今年大三,在春招過(guò)程中參加了多家大公司的面試后,拿到了騰訊的前端實(shí)習(xí),在這里做一些總結(jié),希望給還未參加過(guò)實(shí)習(xí)面試的同學(xué)一些幫助。在之后的面試時(shí)就更加從容一些了。 作者今年大三,在春招過(guò)程中參加了多家大公司的面試后,拿到了騰訊的前端實(shí)習(xí) offer,在這里做一些總結(jié),希望給還未參加過(guò)實(shí)習(xí)面試的同學(xué)一些幫助。 一、簡(jiǎn)歷的準(zhǔn)備 簡(jiǎn)歷制作是很重要的一個(gè)環(huán)節(jié),一份好的簡(jiǎn)歷會(huì)給面試官留下很不錯(cuò)...
摘要:作者陳大魚頭如果不希望職業(yè)生涯過(guò)早結(jié)束,持續(xù)學(xué)習(xí)對(duì)于開(kāi)發(fā)者來(lái)說(shuō)是必不可少的。最近前端面試之道的作者為了讓一些人能在這塊地方記錄自己學(xué)習(xí)到的內(nèi)容而建立起了一個(gè)學(xué)習(xí)倉(cāng)庫(kù)。例子如下我們首先定義一個(gè)文件叫,一個(gè)文件叫。 作者:陳大魚頭 github: KRISACHAN 如果不希望職業(yè)生涯過(guò)早結(jié)束,持續(xù)學(xué)習(xí)對(duì)于開(kāi)發(fā)者來(lái)說(shuō)是必不可少的。 最近《前端面試之道》的作者為了讓一些人能在這塊地方記...
閱讀 3188·2021-11-19 09:40
閱讀 3681·2021-11-16 11:52
閱讀 3007·2021-11-11 16:55
閱讀 3217·2019-08-30 15:55
閱讀 1210·2019-08-30 13:08
閱讀 1684·2019-08-29 17:03
閱讀 3044·2019-08-29 16:19
閱讀 2608·2019-08-29 13:43