摘要:如果兩個操作數都指向同一個對象,則相等操作符返回否則返回不同類型對比詳細分析如下對象先轉換為字符串,還不滿足比較條件的話再繼續轉換為數字與布爾值進行比較時,布爾值直接轉換為數字比較。與布爾值進行比較時,布爾值直接轉換為數字。
前言
全文知識基于<
ECMAScript提供兩組操作符: 相等和不相等(先轉換再比較),全等和不全等(僅比較而不轉換)
相等(==)和不相等(!=)這兩個操作符都會先轉換操作數(通常稱為強制轉型),然后再比較它們的相等性。
操作符A | 操作符B | 比較相等性之前操作 |
---|---|---|
布爾值 | 非布爾值 | 將布爾值轉換為數值--false轉換為0,而true轉換為1 |
字符串 | 數值 | 將字符串調用Number() 轉換為數值 |
對象 | 非對象 | 先調用valueOf方法返回對象的原始值, 再調用 toString 轉換為字符串與基本類型進行比較 |
這兩個操作符在進行比較時則要遵循下列規則。
1, null和undefined是相等的,undefined和undefined是相等的,null和null也是相等的
2, 要比較相等性之前,不能將null和undefined轉換成其他任何值。
3, 如果有一個操作數是NaN則相等操作符返回false,而不相等操作符返回true。(即使兩個操作數都是NaN,相等操作符也返回false因為按照規則NaN不等于NaN。)
4, 如果兩個操作數都是對象,則比較它們是不是同一個對象。如果兩個操作數都指向同一個對象,則相等操作符返回true;否則返回false
不同類型對比詳細分析如下
1, 對象(先轉換為字符串,還不滿足比較條件的話再繼續轉換為數字)
①與布爾值進行比較時,布爾值直接轉換為數字比較。 ②與數字進行比較時,轉換為數字進行比較。 ③與字符串進行比較時,轉換為字符串進行比較。
2, 字符串(字符串轉換成數字)
①與數字進行比較時,二者比較。 ②與布爾值進行比較時,布爾值直接轉換為數字。
3, 布爾值和數字進行比較時,布爾轉換為數字,二者比較。
4, 函數和任何類型比都是轉換成字符串,包括NaN
console.log([1] == true) console.log([1] == 1) console.log([1] == "1") console.log("1" == 1) console.log("1" == true) console.log(true == 1) function fn() { return 20; } console.log(fn + 10) console.log(fn + NaN) console.log(fn + true) console.log(fn + undefined) // true // true // true // true // true // true // function fn() { // return 20; // }10 // function fn() { // return 20; // }NaN // function fn() { // return 20; // }true // function fn() { // return 20; // }undefined全等(===)和不全等(!==)
它只在兩個操作數未經轉換就相等的情況下返回true,說完!!
轉換API valueOfvalueOf函數用于返回指定對象的原始值。JavaScript的許多內置對象都重寫了該函數,以實現更適合自身的功能需要。因此,不同類型對象的valueOf方法的返回值和返回值類型均可能不同。
類型 | 返回 |
---|---|
Array | 數組實例對象 |
Number | 數字 |
Boolean | 布爾值 |
Object | 對象本身 |
String | 字符串 |
Date | 以毫秒數存儲的時間值,從 UTC 1970年 1月 1日午夜開始計算類似(1491470005274) |
Function | 函數本身 |
null | 沒有這個方法拋出異常 TypeError |
undefined | 沒有這個方法拋出異常 TypeError |
console.log("[1,2,3]: " + [1, 2, 3].valueOf()) console.log("123: " + (123).valueOf()) console.log("true: " + true.valueOf()) console.log("{abc:123}: ", ({ abc: 123 }).valueOf()) console.log(""123": " + "123".valueOf()) console.log("new Date(): " + new Date().valueOf()) console.log("function abc(){}: " + function abc() { }.valueOf()) console.log("null: " + null.valueOf()) console.log("undefined: " + undefined.valueOf()) // [1,2,3]: 1,2,3 // 123: 123 // true: true // {abc:123}: { abc: 123 } // "123": 123 // new Date(): 1564555551129 // function abc(){}: function abc() { } // TypeError報錯 // TypeError報錯toString
把一個邏輯值轉換為字符串,并返回結果。JavaScript的許多內置對象都重寫了該函數,以實現更適合自身的功能需要。
類型 | 返回 |
---|---|
Array | 將 Array 的每個元素轉換為字符串,并用逗號作為分隔符進行拼接 |
Number | 字符串格式,還可返回以指定進制表示的字符串 |
Boolean | "true"或者"false" |
Object | "[object Object]" |
String | 原值.(包括空字符) |
Date | 日期的文本表示類似("Thu Apr 06 2017 15:48:59 GMT+0800 (中國標準時間)") |
Function | "function 函數名稱() { [native code] }" |
null | 沒有這個方法拋出異常 TypeError |
undefined | 沒有這個方法拋出異常 TypeError |
console.log("[1,2,3]: " + [1, 2, 3].toString()) console.log("123: " + (123).toString()) console.log("true: " + true.toString()) console.log("{abc:123}: ", { abc: 123 }.toString()) console.log(""123": " + "123".toString()) console.log("new Date(): " + new Date().toString()) console.log("function abc(){}: " + function abc() { }.toString()) console.log("null: " + null.toString())//報錯 console.log("undefined: " + undefined.toString())//報錯 // [1,2,3]: 1,2,3 // 123: 123 // true: true // {abc:123}: [object Object] // "123": 123 // new Date(): Wed Jul 31 2019 14:52:49 GMT+0800 (GMT+08:00) // function abc(){}: function abc() { } // TypeError報錯 // TypeError報錯String
能夠將任何類型的值轉換為字符串遵循下列轉換規則:
1, 如果值有 toString() 方法,則調用該方法(沒有參數)并返回相應的結果;
2, 如果值是 null ,則返回 "null" ;
3, 如果值是 undefined ,則返回 "undefined" 。
console.log("null: " + String(null)) console.log("undefined: " + String(undefined)) console.log(""123.12": " + String("123.12")) // null: null // undefined: undefined // "123.12": 123.12Number
有3個函數可以把非數值轉換為數值:Numbe可以用于任何數據類型,parseInt和parseFloat專門用于把字符串轉換成數值。這3個函數對于同樣的輸入會有返回不同的結果。由于Number()函數在轉換字符串時比較復雜而且不夠合理,因此在處理整數的時候更常用的是parseInt函數。
1, 如果是Boolean值,true和false將分別被轉換為1和0。
2, 如果是數字值,只是簡單的傳入和返回。
3, 如果是null值,返回0。
4, 如果是undefined,返回NaN。
5, 如果是對象,則調用對象的valueOf()方法,然后依照前面的規則轉換返回的值。如果轉換的結果是NaN,則調用對象的toString()方法,然后再次依照前面的規則轉換返回的字符串值。
6, 如果是字符串,遵循下列規則:
①如果字符串中只包含數字(包括前面帶正負號的情況,前導的零被忽略了); ②如果字符串中包含有效的浮點格式,如"1.1",則將其轉換為對應的浮點數值(同樣,也會忽略前導零); ③如果字符串中包含有效的十六進制格式,例如"0xf",則將其轉換為相同大小的十進制整數值; ④如果字符串是空的(不包含任何字符),則將其轉換為0; ⑤如果字符串中包含除上述格式之外的字符,則將其轉換為NaN。
7, 如果是 Date 對象,Number() 返回從 1970 年 1 月 1 日至今的毫秒數。(原文沒有,我在方法api看到的)
8, 如果是空字符返回0
console.log("true: " + Number(true)) console.log("1.23: " + Number("01.23")) console.log("null: " + Number(null)) console.log("undefined: " + Number(undefined)) console.log("{}: " + Number({}))//轉成字符串是空的,然后轉換為0; console.log("{abc:123}: " + Number({ abc: 123 })) console.log(""123": " + Number("0123")) console.log("0xf: " + Number(0xf)) console.log(""": " + Number("")) console.log(""abc": " + Number("abc")) console.log("空: " + Number()) // true: 1 // 1.23: 1.23 // null: 0 // undefined: NaN // {}: NaN // {abc:123}: NaN // "123": 123 // 0xf: 15 // "": 0 // "abc": NaN // 空: 0parseInt
可解析一個字符串,并返回一個整數。轉換規則如下。
1, 它會忽略字符串前面的空格,直至找到第一個非空格字符,同樣忽略結尾的空格。
2, 如果第一個非空格字符不是數字字符(可帶正負號),parseInt()就會返回NaN;(parseInt()對空字符返回NaN,Number()對空字符返回0)。
3, 如果第一個非空格字符是數字字符,parseInt()會繼續解析第二個字符,直到解析完所有后續字符或者遇到了一個非數字字符。(包括小數點也不是有效的數字字符)。
4, 如果字符串中的第一個非空格字符是數字字符,parseInt()也能夠識別出各種整數格式(即前面討論的十進制、八進制和十六進制數)。
①如果字符串以"0x"開頭且后跟數字字符,就會將其當作一個十六進制整數; ②如果字符串以"0"開頭且后跟數字字符,則會將其當作一個八進制數來解析。(ECMAScript 3 認為是(八進制),ECMAScript 5 認為是(十進制))
console.log("" 123": " + parseInt(" 123")) console.log("" -123": " + parseInt(" -123")) console.log("" -a123": " + parseInt(" -a123")) console.log(""abc123": " + parseInt("abc123")) console.log(""123.12": " + parseInt("123.12")) console.log(""0xf": " + parseInt("0xf")) console.log(""070": " + parseInt("070")) // " 123": 123 // " -123": -123 // " -a123": NaN // "abc123": NaN // "123.12": 123 // "0xf": 15 // "070": 70parseFloat
函數可解析一個字符串,并返回一個浮點數。parseInt()和parseFloat()函數的轉換規則類似,區別如下。
1, 能夠解析有效的浮點數字字符
2, 由于 parseFloat() 只解析十進制值,它始終都會忽略前導的零
console.log("" 123": " + parseFloat(" 123")) console.log(""abc123": " + parseFloat("abc123")) console.log(""123.001: " + parseFloat("123.001")) console.log(""0xf": " + parseFloat("0xf")) console.log(""070": " + parseFloat("070")) console.log(""73.125e7": " + parseFloat("3.125e7")) // " 123": 123 // "abc123": NaN // "123.001: 123.001 // "0xf": 0 // "070": 70 // "73.125e7": 31250000
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106226.html
摘要:檢查當前上下文中的參數,建立該對象下的屬性與屬性值。檢查當前上下文的函數聲明,也就是使用關鍵字聲明的函數。數據類型跟布爾值比較回顧下前面說的要點然后有幾個應該要知道的隱形轉換和不能轉換成其他任何值。 前言 2018/04/27 新增六,講解淺拷貝和深拷貝的區別并簡單實現, 七,原生JS操作DOM?2018/04/30 新增八,解決計算精度問題,例如0.1+0.2?2018/05/0...
摘要:布爾操作符邏輯非將操作數任何數據類型轉換為一個布爾值,并求反。除和以外的任何類型,此操作都會返回任何非空的類型,此操作都會返回連續使用兩個可達到函數同樣的效果。 布爾操作符 邏輯非(!) 將操作數(任何數據類型)轉換為一個布爾值,并求反。 !null; // true !undefined; // true !true; // false !false; // true !0; // ...
摘要:看下面的代碼和會對操作數執行條件判斷,如果操作數不是布爾值,會先執行類型轉換后再執行條件判斷。大家記住這個規則布爾值如果與其他類型進行抽象比較,會先用將布爾值轉換為數字再比較。 在上一篇中我們聊過了 JS 類型轉換的規則和我發現的一些常見書籍中關于類型轉換的一些小錯誤,當碰到顯示類型轉換的時候大家可以按照這些規則去拆解出答案。但 JS 中存在一些很隱晦的隱式類型轉換,這一篇就來談下我對...
摘要:相等操作符會有一個隱形的轉換,這個隱形的轉化會導致結果很奇怪。 [0] == true; // false [] == ![]; // true 相等操作符會有一個隱形的轉換,這個隱形的轉化會導致結果很奇怪。下面是隱形轉換的基本規則: 其中一個值是boolean值:兩個值都轉為數字,false轉為0,true轉為1 其中一個值是字符串,另一個是數字:都轉為數字再對比 其中一個是...
閱讀 3448·2023-04-26 00:39
閱讀 4039·2021-09-22 10:02
閱讀 2532·2021-08-09 13:46
閱讀 1098·2019-08-29 18:40
閱讀 1444·2019-08-29 18:33
閱讀 773·2019-08-29 17:14
閱讀 1513·2019-08-29 12:40
閱讀 2970·2019-08-28 18:07