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