摘要:在上面代碼中調用方法返回的是自身方法字符串,因此和都成立。我們還可以對的方法進行重寫加減規則為先求兩側表達式原始值若其中一個為字符串,返回字符串合并兩側表達式轉化為數字類型進行運算還有一些特殊情況
先看一段代碼,執行結果有些奇怪,a>=b同時a<=b但是a!=b。
var a = function() {}; var b = function() {}; a == b // false a != b // true a >= b // true a <= b // true
這涉及到js中操作符引起的類型轉換。
全等于(==)ES規范中==的判斷流程為:
1.ReturnIfAbrupt(x)
2.ReturnIfAbrupt(y)
3.如果Type(x)與 Type(y)相同,返回x===y
4.如果x為null,y為undefined,返回true
5.如果x為undefined,y為null,返回true
6.如果Type(x)是Number,Type(y)是String,返回x == ToNumber(y)
7.如果Type(x)是String,Type(y)是Number,返回ToNumber(x) == y
8.如果Type(x)是Boolean,返回ToNumber(x) == y
9.如果Type(y)是Boolean,返回x == ToNumber(y)
10.如果Type(x)是String、Number或者Symbol,Type(y)是Object,返回x == ToPrimitive(y)
11.如果Type(x)是Object,Type(y)是String、Number或者Symbol,返回ToPrimitive(x)==y
12.返回false
ReturnIfAbrupt判斷參數是否正常值,如有報錯,中斷執行;Type函數相當于typeOf操作符結果;ToPrimitive返回參數的原始值,在全等于操作符中返回對象依次嘗試調用valueOf或者toString方法的結果,直到結果為非對象
總結一下就是:
1、如果兩側參數類型相同,使用嚴格等于比較;
2、null與undefined兩兩相等;
3、若有布爾類型則轉化為數字;
4、字符串和數字比較時把字符串轉化為數字,進入1;
5、Object類型與Number、String、Symbol類型比較時,使用Object對象的原始值進行比較
6、其他情況返回false
在上面代碼中a和b的類型都是“function”,應使用嚴格等于進行比較,它們有不同的引用并不是同一個值,所以結果為false
大于、小于(>、<)大于、小于首先使用valueOf方法對左右表達式求原始值,再進行比較。在上面代碼中a、b調用valueOf方法返回的是自身方法字符串,因此>=和<=都成立。
我們還可以對a、b的valueOf方法進行重寫
a.valueOf=function(){return 1;} b.valueOf=function(){return 2;} a > b // false a < b // true加、減(+、-)
規則為:
1、先求兩側表達式原始值
2、若其中一個為字符串,返回字符串合并
3、兩側表達式轉化為數字類型進行運算
還有一些特殊情況:
Infinity-Infinity // NaN Infinity+Infinity // Infinity -Infinity+(-Infinity) // -Infinity +0+0 // +0 +0+(-0) // +0 -0+(-0) // -0 +5+(-5) // +0
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105448.html
摘要:即在這個隱式強制類型轉換中,即不會等于也不會等于。按照正常人類的腦回路,應該是將先轉換為布爾值,然后再將兩個布爾值對比。為什么和就可以避開操作符的坑呢它們進行強制類型轉換時的轉換規則又是怎樣的。 在js中,類型轉換是一個被非常多人詬病的地方。新手看了會發矇,老手看了會頭疼。 類型轉換,又成為強制類型轉換,主要區分為顯式強制類型轉換和隱式強制類型轉換 按我理解,類型轉換的意思就很明顯,就...
摘要:看下面的代碼和會對操作數執行條件判斷,如果操作數不是布爾值,會先執行類型轉換后再執行條件判斷。大家記住這個規則布爾值如果與其他類型進行抽象比較,會先用將布爾值轉換為數字再比較。 在上一篇中我們聊過了 JS 類型轉換的規則和我發現的一些常見書籍中關于類型轉換的一些小錯誤,當碰到顯示類型轉換的時候大家可以按照這些規則去拆解出答案。但 JS 中存在一些很隱晦的隱式類型轉換,這一篇就來談下我對...
摘要:我們首先了解一下中有關類型轉換的知識。新增類型拋出異常從列表可以明顯看到少了一個類型轉換為的規則。這里要強調一點第二個表達式沒有涉及到強制類型轉換。如果文中有錯誤或者有某些強制轉換的情形沒有涉及到請及時留言告知,我會修改并補充進去。 javascript是一門非常奇特的語言,它有時候奇特的會讓人懷疑人生。比如讓我們看一下下面的一些奇葩例子: false == 0 ...
摘要:隱式強制類型轉換指的是那些隱藏的強制類型轉換,副作用也不是很明顯,事實上,只要自己覺得不夠明顯的強制類型轉換都可以算作隱式強制類型轉換,接下來,此文將會介紹幾種常見的隱式類型轉換。 隱式強制類型轉換指的是那些隱藏的強制類型轉換,副作用也不是很明顯,事實上,只要自己覺得不夠明顯的強制類型轉換都可以算作隱式強制類型轉換,接下來,此文將會介紹幾種常見的隱式類型轉換。 加法操作符 轉換規則: ...
摘要:如何讓根據拆箱轉換,以及的隱式轉換,可以如下寫為什么計算機中所有的數據都是以二進制存儲的,所以在計算機計算時要把數據先轉換成二進制進行計算,然后把計算結果轉換成十進制。會存在精度丟失問題和的二進制都是以無線循環的小數的二進制的二進制 本想著記筆記里,但是筆記里沒有分類,還是以文章的形式,當個人總結吧,這一篇就當作JS基礎篇的記錄吧,有修改的和新增的持續更新~ 關于JS的一些小技巧 1:...
摘要:可以將其他類型轉成字符串函數可以將任意類型的值轉為布爾值。提示空數組空對象轉換為布爾型也是。 在JS中數據類型轉換有兩種 相關資料參閱 官方ecma-5規范阮一峰老師類型轉換規范對相等==定義 強制類型轉換Number() Number函數將字符串轉為數值,要比parseInt函數嚴格很多,只要有一個字符是非數字(空格、+、-除外),那么就會被轉為NaN。 showImg(http...
閱讀 1776·2021-11-11 11:02
閱讀 1679·2021-09-22 15:55
閱讀 2484·2021-09-22 15:18
閱讀 3488·2019-08-29 11:26
閱讀 3743·2019-08-26 13:43
閱讀 2646·2019-08-26 13:32
閱讀 897·2019-08-26 10:55
閱讀 965·2019-08-26 10:27