成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript中關(guān)于相等符號(hào)的隱形轉(zhuǎn)換

gself / 2241人閱讀

摘要:如果兩個(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í)基于<>總結(jié):

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 valueOf

valueOf函數(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.12
Number

有3個(gè)函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Numbe可以用于任何數(shù)據(jù)類型,parseIntparseFloat專門用于把字符串轉(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
// 空: 0
parseInt

可解析一個(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": 70
parseFloat

函數(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

相關(guān)文章

  • 一些搞死人基礎(chǔ)題 --- (不定時(shí)更新)

    摘要:檢查當(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...

    idisfkj 評(píng)論0 收藏0
  • JavaScript 操作符(二)

    摘要:布爾操作符邏輯非將操作數(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; // ...

    lemanli 評(píng)論0 收藏0
  • 掌握 Javascript 類型轉(zhuǎn)換:隱式轉(zhuǎn)換救救孩子

    摘要:看下面的代碼和會(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ì)...

    weapon 評(píng)論0 收藏0
  • '=='操作符小動(dòng)作

    摘要:相等操作符會(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è)是...

    PAMPANG 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

gself

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<