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