摘要:返回對(duì)象的字符串?dāng)?shù)值或布爾值表示。引用類型構(gòu)造函數(shù)本身就是一個(gè)函數(shù),只不過該函數(shù)是出于創(chuàng)建新對(duì)象的目的而定義的。類型創(chuàng)建對(duì)象創(chuàng)建示例的方法有兩種第一種是使用操作符后跟構(gòu)造函數(shù)。第二種是使用對(duì)象字面量表示法與是等價(jià)的。
1. 基本概念 1.1 數(shù)據(jù)類型 (1)typeof操作符
console.log(typeof null); // “object”
用typeof操作符去監(jiān)測(cè)null,得到的類型是object。
原因是null被認(rèn)為是一個(gè)空的對(duì)象引用。
function func(){ // do something } console.log(typeof func); // "function"
function雖然不是6大數(shù)據(jù)類型中的一種,但卻可以被typeof操作符監(jiān)測(cè)出來。
原因是函數(shù)在ECMAScript中是對(duì)象,但函數(shù)確實(shí)有一些特殊的屬性,所以需要用typeof來區(qū)分。
var message; console.log(message); // undefined console.log(answer); // 報(bào)錯(cuò) console.log(typeof message); // undefined console.log(typeof answer); // undefined
聲明后未初始化的變量默認(rèn)值為undefined,想獲得一個(gè)未聲明的變量會(huì)報(bào)錯(cuò),這很好理解。
但是用typeof操作符監(jiān)測(cè)聲明后未初始化的變量和一個(gè)未聲明的變量都會(huì)得到undefined。雖然這兩種變量從技術(shù)角度看有本質(zhì)區(qū)別,但實(shí)際上也不可能對(duì)它們做任何操作。
所以在聲明變量的時(shí)候顯式地初始化是一個(gè)好的選擇,這樣監(jiān)測(cè)出undefined就知道是未聲明的變量了。
null表示的是一個(gè)空對(duì)象指針,所以如果一個(gè)變量在之后準(zhǔn)備保存對(duì)象,那么初始化的值為null是最合理的。這樣只要檢查null值就知道是否已經(jīng)保存了一個(gè)對(duì)象的引用了。
console.log(undefined == null); // true
用相等操作符(=)去比較undefined和null會(huì)得到true的結(jié)果。
原因是undefined實(shí)際上是派生自null。[ 這句話我覺得不用理解, 語(yǔ)言就是這么設(shè)計(jì)的。 ]
ECMAScript中所有的值都有與2個(gè)boolean值對(duì)應(yīng)的值:
數(shù)據(jù)類型 | 轉(zhuǎn)換為true | 轉(zhuǎn)換為false |
---|---|---|
Boolean | true | false |
String | 任何非空字符 | 空字符 |
Number | 任何非零數(shù)字值 | 0和NaN |
Object | 任何對(duì)象 | null |
Undefined | n/a(不適用) | undefined |
var floatNum1 = 1.; // 解析為1 var floatNum2 = 10.0; // 解析為10
由于保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,因此ECMAScript會(huì)不失時(shí)機(jī)地將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值。
如果小數(shù)點(diǎn)后面沒有跟任何數(shù)字,那么這個(gè)數(shù)值就可以作為整數(shù)值來保存。
console.log(0.1 + 0.2); // 0.30000000000000004
浮點(diǎn)數(shù)計(jì)算不精確。
基于IEEE754數(shù)值浮點(diǎn)計(jì)算產(chǎn)生誤差,原因是計(jì)算機(jī)會(huì)先把0.1和0.2轉(zhuǎn)化為二進(jìn)制,再把相加的結(jié)果轉(zhuǎn)化為十進(jìn)制。在兩次轉(zhuǎn)化中產(chǎn)生了誤差。
由于內(nèi)存的限制,ECMAScript并不能保存世界上所有的數(shù)值。最小數(shù)值為5e-324,保存在Number.MIN_VALUE中;最大數(shù)值為1.7976931348623157e+308,保存在Number.MAX_VALUE中。如果某次計(jì)算的結(jié)果得到了一個(gè)超出JavaScript數(shù)值范圍的值,那么這個(gè)數(shù)值將被自動(dòng)轉(zhuǎn)換成特殊的infinity具體來說,如果這個(gè)數(shù)值是負(fù)數(shù),則會(huì)被轉(zhuǎn)換成-infinity(負(fù)無窮),如果這個(gè)數(shù)值是正數(shù),則會(huì)被轉(zhuǎn)換成Infinity (正無窮)。
可使用isFinite()函數(shù)來確定一個(gè)數(shù)值是不是又窮的。
console.log(NaN == NaN); // false
NaN,即非數(shù)值(Not a Number)是一個(gè)特殊的數(shù)值,這個(gè)數(shù)值用于表示一個(gè)本來要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)拋出錯(cuò)誤了)。
NaN本身有兩個(gè)非同尋常的特點(diǎn):
首先,任何涉及NaN的操作(例如NaN/10)都會(huì)返冋NaN,這個(gè)特點(diǎn)在多步計(jì)算中有可能導(dǎo)致問題。
其次,NaN與任何值都不相等,包括NaN本身。
這里我們探討一個(gè)問題就是任何數(shù)據(jù)除以0只會(huì)返回2種結(jié)果:1個(gè)是NaN,一個(gè)是Infinity。
下面看幾個(gè)例子:
console.log(0/0); // NaN console.log(true/0); // Infinity console.log(false/0); // NaN console.log("2222"/0); // Infinity console.log(-1/0); // -Inifinity console.log(undefined/0); // NaN console.log(null/0); // NaN
從這幾個(gè)例子中可以歸納出幾個(gè)結(jié)論:
0/0和NaN/0 會(huì)得到NaN (例子中false會(huì)轉(zhuǎn)化為0,undefined會(huì)轉(zhuǎn)化成NaN,null會(huì)轉(zhuǎn)化為0, 對(duì)象會(huì)轉(zhuǎn)化為NaN[示例中未舉出])
其他任何轉(zhuǎn)化為數(shù)字不為0的值除以0 都會(huì)得到Infinity (正值就是Infinity,負(fù)值則為-Infinity)
可用isNaN()函數(shù)來判斷這個(gè)參數(shù)是否“不是數(shù)值”。如果這個(gè)值不能被轉(zhuǎn)化成數(shù)值,則返回true。
console.log(isNaN(NaN)); // true console.log(isNaN(10)); // false console.log(isNaN("10")); // false console.log(isNaN("blue")); // true console.log(isNaN(true)); // false
盡管有點(diǎn)兒不可思議,但isNaN()確實(shí)也適用于對(duì)象。在基于對(duì)象調(diào)用isNaN()函數(shù)時(shí),會(huì)首先調(diào)用對(duì)象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值。如果不能,則基于這個(gè)返回值再調(diào)用toString()方法,再測(cè)試返回值。
有3個(gè)方法可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()、parseInt()、parseFloat()
Number()方法轉(zhuǎn)換規(guī)則:
布爾值:true轉(zhuǎn)換為1, false轉(zhuǎn)換為0
數(shù)字值:簡(jiǎn)單的傳入傳出
undefined:轉(zhuǎn)換為NaN
null: 轉(zhuǎn)換為0
字符串:如果只包含數(shù)字,則會(huì)去掉最前面的0轉(zhuǎn)換為十進(jìn)制;如果字符串包含有效的十六進(jìn)制數(shù),則轉(zhuǎn)換為等值的十進(jìn)制;空字符串轉(zhuǎn)換為0;如包含上述格式以外的字符,轉(zhuǎn)換為NaN
對(duì)象:會(huì)首先調(diào)用對(duì)象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值。如果不能,則基于這個(gè)返回值再調(diào)用toString()方法,再測(cè)試返回值。
[ 搞懂這個(gè)規(guī)則再結(jié)合NaN的計(jì)算規(guī)則就可以完全理解任何數(shù)值/0的結(jié)果 ]
parseInt()計(jì)算規(guī)則:
這個(gè)方法有第二個(gè)參數(shù),是指定進(jìn)制規(guī)則的。不傳默認(rèn)為十進(jìn)制。
parseInt()函數(shù)在轉(zhuǎn)換字符串時(shí),更多的是看其是否符合數(shù)值模式。它會(huì)忽略字符串前面的空格,直至找到第一個(gè)非空格字符。如果第一個(gè)字符不是數(shù)字字符或者負(fù)號(hào),parseInt()就會(huì)返冋NaN;也就是說,用parseInt()轉(zhuǎn)換空字符串會(huì)返回NaN(Number()對(duì)空字符返回0)。如果第一個(gè)字符是數(shù)字字符,parseInt()會(huì)繼續(xù)解析第二個(gè)字符,直到解析完所有后續(xù)字符或者遇到了一個(gè)非數(shù)字字符。
parseFloat()計(jì)算規(guī)則:
這個(gè)方法只解析十進(jìn)制。
parseFloat()也是從第一個(gè)字符開始解析每個(gè)字符。而且也是一直解析到字符串末尾,或者解析到遇見一個(gè)無效的浮點(diǎn)數(shù)字字符為止。也就是說,字符串中的第一個(gè)小數(shù)點(diǎn)是有效的,而第二個(gè)小數(shù)點(diǎn)就是無效的了,因此它后面的字符申將被忽略。
有2個(gè)方法可以把非字符串轉(zhuǎn)換為字符串:toString()、String()
除了undefined和null都可以使用toString()方法,這個(gè)方法接受一個(gè)參數(shù),可以指定進(jìn)制規(guī)則。如果可能是undefined或者null,可以用String()方法。
(7)Object對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合。對(duì)象可以通過執(zhí)行new操作符后跟要?jiǎng)?chuàng)建的對(duì)象類型的名稱來創(chuàng)建。
var o = new Object()
Object的每個(gè)實(shí)例都具有下列屬性和方法:
Constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)。對(duì)于前面的例子而言,構(gòu)造函數(shù)(constructor)就是Object()。
hasOwnProperty(propertyName):用于檢查給定的域性在當(dāng)前對(duì)象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中,作為參數(shù)的屬性名(propertyName)必須以字符串形式指定(例如:o.hasOwnProperty ("name") )。
isProtocypeOf(object):用于檢査傳人的對(duì)象是否是另一個(gè)對(duì)象的原型。
propertylsEnumerable(propertyName):用于檢查給定的屬性是否能夠使用for-in語(yǔ)句來枚舉。與hasOwnProperty ()方法一樣,作為參數(shù)的域性名必須以字符串形式指定。
toLocaleString():返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)。
toString():返回對(duì)象的字符串表示。
valueOf():返回對(duì)象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同。
2. 引用類型構(gòu)造函數(shù)本身就是一個(gè)函數(shù),只不過該函數(shù)是出于創(chuàng)建新對(duì)象的目的而定義的。
var person = new Object();2.1 Object類型 (1)創(chuàng)建對(duì)象
創(chuàng)建Object示例的方法有兩種:
第一種是使用new操作符后跟Object構(gòu)造函數(shù)。
var person = new Object();
第二種是使用對(duì)象字面量表示法:
var person = { name: "Peggy7", age: 25 }
var person = {}與var person = new Object()是等價(jià)的。
(2)訪問對(duì)象的屬性訪問對(duì)象屬性可以用點(diǎn)表示法和方括號(hào)表示法。
person.name person["name"]
兩者看上去沒有區(qū)別,但方括號(hào)表示法可以通過變量的訪問屬性,如果屬性名中包含會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤的字符,或者屬性名使用的是關(guān)鍵字或保留字,也可以使用方括號(hào)表示法。通常,除非使用變量來訪問屬性,否則建議使用點(diǎn)表示法。
2.2 Array類型 (1)創(chuàng)建數(shù)組創(chuàng)建數(shù)字也有兩種方法:
第一種是使用new操作符后跟Array構(gòu)造函數(shù)。
var colors = new Array(3); var colors2 = new Array("red", "blue", "green");
如果傳入的是數(shù)值則表示創(chuàng)建一個(gè)長(zhǎng)度為該數(shù)值的數(shù)組,也可直接傳遞數(shù)組中要保存的項(xiàng)。
第二種是使用數(shù)組字面量表示法:
var colors = ["red", "blue", "green"];
數(shù)組的length屬性不光是只讀的。
(2)監(jiān)測(cè)數(shù)組Array.isArray()方法可以準(zhǔn)確的監(jiān)測(cè)出一個(gè)值是否是數(shù)組。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/110281.html
摘要:前言一直混跡社區(qū)突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點(diǎn)混亂所以將前端主流技術(shù)做了一個(gè)書簽整理不求最多最全但求最實(shí)用。 前言 一直混跡社區(qū),突然發(fā)現(xiàn)自己收藏了不少好文但是管理起來有點(diǎn)混亂; 所以將前端主流技術(shù)做了一個(gè)書簽整理,不求最多最全,但求最實(shí)用。 書簽源碼 書簽導(dǎo)入瀏覽器效果截圖showImg(https://segmentfault.com/img/bVbg41b?w=107...
摘要:文末評(píng)論送書,學(xué)委會(huì)用這個(gè)抽獎(jiǎng)程序來進(jìn)行嚴(yán)格抽獎(jiǎng),周六晚上點(diǎn)整定時(shí)抽獎(jiǎng)并視頻公布出來,敬請(qǐng)期待。本文講的函數(shù)值傳遞問題,是寫程序經(jīng)常遇到,特別的是動(dòng)態(tài)參數(shù)在高級(jí)框架中使用很廣泛。 ...
摘要:引用類型對(duì)象傳入最小數(shù)和最大數(shù)可返回隨機(jī)數(shù),定義數(shù)組,調(diào)用可以返回隨機(jī)數(shù)組項(xiàng)從中抽取一個(gè)幸運(yùn)項(xiàng)水杯茶杯電腦電源線數(shù)據(jù)線華為恒大冰泉衛(wèi)生紙面向?qū)ο罄斫鈱?duì)象要修改屬性的特性,必須要用是否能修改屬性的值默認(rèn)不能從對(duì)象刪除屬性默認(rèn)讀取屬 引用類型 -Math對(duì)象 Math.min( )、Math.max( )、Math.ceil( )、Math.floor( )、Math.round( )、M...
摘要:只能在不同的時(shí)候選用不同的假設(shè)和不同的理論來解釋問題,許來西的文章講到科學(xué)一定程度上通過放棄一貫性換取了實(shí)用性,放棄自洽性換取了它洽性。然而遺憾的是本身只提供了模塊和洋蔥模型的最小封裝。 在寫干貨之前,我想先探(qiang)討(diao)兩個(gè)問題,模式的局限性?模式有什么用? 最近看到一篇文章對(duì)我啟發(fā)很大,許來西在知乎的回答《哲學(xué)和科學(xué)有什么關(guān)聯(lián)?》,全篇較長(zhǎng),這里摘錄我要引出的一點(diǎn):...
閱讀 3957·2021-09-22 10:02
閱讀 3377·2019-08-30 15:52
閱讀 3071·2019-08-30 12:51
閱讀 768·2019-08-30 11:08
閱讀 2070·2019-08-29 15:18
閱讀 3114·2019-08-29 12:13
閱讀 3605·2019-08-29 11:29
閱讀 1880·2019-08-29 11:13