JS類型和類型判斷和類型轉換

js類型:

JavaScript中的數據類型大致分為,基本數據類型與引用數據類型

在ECMAscript數據類型有基本類型和引用類型,基本類型有Undefined、Null、Boolean、Number、String,引用類型有Object,所有的的值將會是6種的其中之一

ECMA里面有很多原生的引用類型,就是查文檔的時候看見的那些:Function、Number (是對于原始類型Number的引用類型)、String(是對于原始類型String的引用類型)、Date、Array、Boolean(…)、Math、RegExp等等

在程序運行的時候,整塊內存可以劃分為常量池(存放基本類型的值)、棧(存放變量)、很大的堆(存放對象)、運行時環境(函數運行時)?

var a = 1;

var c = a;

c=2

?console.log(a); //輸出1,a是基本類型,當執行c=a時是值傳遞創建了另一個變量c

var obj1 = new Object();

obj1.value =1

var obj2 = obj1

obj2.value=2

console.log(obj1.value) //輸出2,obj1是引用類型,當執行?obj2 = obj1是指針傳遞

類型判斷:

==和===:

==是值相等,===是值和類型都相等

typeof():返回類型

instanceof:?object?instanceof?constructor?

類型轉換:

強制類型轉換:

通過手動進行類型轉換,Javascript提供了以下轉型函數:

轉換為數值類型:Number(mix)、parseInt(string,radix)、parseFloat(string)轉換為字符串類型:toString(radix)、String(mix)轉換為布爾類型:Boolean(mix)

1、Number(mix)函數,可以將任意類型的參數mix轉換為數值類型。其規則為:

(1)如果是布爾值,true和false分別被轉換為1和0(2)如果是數字值,返回本身。(3)如果是null,返回0.(4)如果是undefined,返回NaN。(5)如果是字符串,遵循以下規則:1、如果字符串中只包含數字,則將其轉換為十進制(忽略前導0)2、如果字符串中包含有效的浮點格式,將其轉換為浮點數值(忽略前導0)3、如果是空字符串,將其轉換為04、如果字符串中包含非以上格式,則將其轉換為NaN(6)如果是對象,則調用對象的valueOf()方法,然后依據前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,再次依照前面的規則轉換返回的字符串值。

下表列出了對象的valueOf()的返回值:

對象返回值

Array數組的元素被轉換為字符串,這些字符串由逗號分隔,連接在一起。其操作與 Array.toString 和 Array.join 方法相同。

BooleanBoolean 值。

Date存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC。

Function函數本身。

Number數字值。

Object對象本身。這是默認情況。

String字符串值。

下面提供幾個例子,你能寫出它的正確結果嗎:

Number(“hello CSSer!”);

Number(“0×8″);

Number(“”);

Number(“020dd”);

Number(“070″);

Number(true);

2、parseInt(string, radix)函數,將字符串轉換為整數類型的數值。它也有一定的規則:

(1)忽略字符串前面的空格,直至找到第一個非空字符(2)如果第一個字符不是數字符號或者負號,返回NaN(3)如果第一個字符是數字,則繼續解析直至字符串解析完畢或者遇到一個非數字符號為止(4)如果上步解析的結果以0開頭,則將其當作八進制來解析;如果以x開頭,則將其當作十六進制來解析(5)如果指定radix參數,則以radix為基數進行解析

小測驗:

parseInt(“hello CSSer!”);

Number(“0×8″);

parseInt(“”);

parseInt(“020dd”);

parseInt(“070″);

parseInt(“22.5″);

3、parseFloat(string)函數,將字符串轉換為浮點數類型的數值。

它的規則與parseInt基本相同,但也有點區別:字符串中第一個小數點符號是有效的,另外parseFloat會忽略所有前導0,如果字符串包含一個可解析為整數的數,則返回整數值而不是浮點數值。

4、toString(radix)方法。除undefined和null之外的所有類型的值都具有toString()方法,其作用是返回對象的字符串表示。

對象操作

Array將 Array 的元素轉換為字符串。結果字符串由逗號分隔,且連接起來。

Boolean如果 Boolean 值是 true,則返回 “true”。否則,返回 “false”。

Date返回日期的文字表示法。

Error返回一個包含相關錯誤信息的字符串。

Function返回如下格式的字符串,其中 functionname 是被調用 toString 方法函數的名稱:function functionname( ) { [native code] }

Number返回數字的文字表示。

String返回 String 對象的值。

默認返回 “[object objectname]”,其中 objectname 是對象類型的名稱。

5、String(mix)函數,將任何類型的值轉換為字符串,其規則為:

(1)如果有toString()方法,則調用該方法(不傳遞radix參數)并返回結果(2)如果是null,返回”null”(3)如果是undefined,返回”undefined”

6、Boolean(mix)函數,將任何類型的值轉換為布爾值。

以下值會被轉換為false:false、”"、0、NaN、null、undefined,其余任何值都會被轉換為true。

隱式轉換:

在某些情況下,即使我們不提供顯示轉換,Javascript也會進行自動類型轉換,主要情況有:

1、 用于檢測是否為非數值的函數:isNaN(mix)

isNaN()函數,經測試發現,該函數會嘗試將參數值用Number()進行轉換,如果結果為“非數值”則返回true,否則返回false。

2、遞增遞減操作符(包括前置和后置)、一元正負符號操作符

這些操作符適用于任何數據類型的值,針對不同類型的值,該操作符遵循以下規則(經過對比發現,其規則與Number()規則基本相同):? ? (1)如果是包含有效數字字符的字符串,先將其轉換為數字值(轉換規則同Number()),在執行加減1的操作,字符串變量變為數值變量。? ? (2)如果是不包含有效數字字符的字符串,將變量的值設置為NaN,字符串變量變成數值變量。? ? (3)如果是布爾值false,先將其轉換為0再執行加減1的操作,布爾值變量編程數值變量。? ? (4)如果是布爾值true,先將其轉換為1再執行加減1的操作,布爾值變量變成數值變量。? ? (5)如果是浮點數值,執行加減1的操作。? ? (6)如果是對象,先調用對象的valueOf()方法,然后對該返回值應用前面的規則。如果結果是NaN,則調用toString()方法后再應用前面的規則。對象變量變成數值變量。

小測驗:

分別對以下類型的值執行后置遞增操作,結果是什么?

“2″, ”02dd”, ”", false, 22.5, +”", -false, +new Date()

3、 加法運算操作符

加號運算操作符在Javascript也用于字符串連接符,所以加號操作符的規則分兩種情況:

如果兩個操作值都是數值,其規則為:

(1)如果一個操作數為NaN,則結果為NaN

(2)如果是Infinity+Infinity,結果是Infinity

(3)如果是-Infinity+(-Infinity),結果是-Infinity

(4)如果是Infinity+(-Infinity),結果是NaN

(5)如果是+0+(+0),結果為+0

(6)如果是(-0)+(-0),結果為-0

(7)如果是(+0)+(-0),結果為+0

如果有一個操作值為字符串,則:

如果兩個操作值都是字符串,則將它們拼接起來

如果只有一個操作值為字符串,則將另外操作值轉換為字符串,然后拼接起來

如果一個操作數是對象、數值或者布爾值,則調用toString()方法取得字符串值,然后再應用前面的字符串規則。對于undefined和null,分別調用String()顯式轉換為字符串。

可以看出,加法運算中,如果有一個操作值為字符串類型,則將另一個操作值轉換為字符串,最后連接起來。

4、 乘除、減號運算符、取模運算符

這些操作符針對的是運算,所以他們具有共同性:如果操作值之一不是數值,則被隱式調用Number()函數進行轉換。具體每一種運算的詳細規則請參考ECMAScript中的定義。

5、 邏輯操作符(!、&&、||)

邏輯非(!)操作符首先通過Boolean()函數將它的操作值轉換為布爾值,然后求反。

一、邏輯與(&&)操作符,如果一個操作值不是布爾值時,遵循以下規則進行轉換:

(1)如果第一個操作數經Boolean()轉換后為true,則返回第二個操作值,否則返回第一個值(不是Boolean()轉換后的值)

(2)如果有一個操作值為null,返回null

(3)如果有一個操作值為NaN,返回NaN

(4)如果有一個操作值為undefined,返回undefined

邏輯或(||)操作符,如果一個操作值不是布爾值,遵循以下規則:

(1)如果第一個操作值經Boolean()轉換后為false,則返回第二個操作值,否則返回第一個操作值(不是Boolean()轉換后的值)

(2)對于undefined、null和NaN的處理規則與邏輯與(&&)相同

6、 關系操作符(<, >, <=, >=)

與上述操作符一樣,關系操作符的操作值也可以是任意類型的,所以使用非數值類型參與比較時也需要系統進行隱式類型轉換:

(1)如果兩個操作值都是數值,則進行數值比較

(2)如果兩個操作值都是字符串,則比較字符串對應的字符編碼值

(3)如果只有一個操作值是數值,則將另一個操作值轉換為數值,進行數值比較

(4)如果一個操作數是對象,則調用valueOf()方法(如果對象沒有valueOf()方法則調用toString()方法),得到的結果按照前面的規則執行比較

(5)如果一個操作值是布爾值,則將其轉換為數值,再進行比較

注:NaN是非常特殊的值,它不和任何類型的值相等,包括它自己,同時它與任何類型的值比較大小時都返回false。

7、 相等操作符(==)

相等操作符會對操作值進行隱式轉換后進行比較:

(1)如果一個操作值為布爾值,則在比較之前先將其轉換為數值

(2)如果一個操作值為字符串,另一個操作值為數值,則通過Number()函數將字符串轉換為數值

(3)如果一個操作值是對象,另一個不是,則調用對象的valueOf()方法,得到的結果按照前面的規則進行比較

(4)null與undefined是相等的

(5)如果一個操作值為NaN,則相等比較返回false

(6)如果兩個操作值都是對象,則比較它們是不是指向同一個對象

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370