摘要:所以無論還是都會進行類型轉換,唯一的區別,就是會置否而不會。這時候,肯定會有人問,假如說我有其他的數據類型呢,又不是數字又不是字符串,比如說數組啊,對象啊,布爾值啥的,那么如果是引用數據類型,則先轉為基本數據類型,再進行比較。
上一章主要講了轉換到數字,字符串和布爾類型的一些知識點,那么這一講接著上面的繼續講。
思考下面這個問題:
console.log(+"123"); // 123 console.log(-"123"); // -123 console.log(+"abc"); // NaN console.log(-"abc"); // NaN
+這個很容易理解,就是把字符串轉成了數字,而-這個呢,除了把字符串轉為數字以外,還會吧這個數字加否。所以無論+還是-都會進行類型轉換,唯一的區別,就是-會置否而+不會。
那么+除了當作一元運算符外,還有一個更廣為人知的就是作為加法運算符。
那么加法運算符的話,實際上是有兩種可能性的,一種是字符串的拼接,另一種就是做運算。接下來咱們就對這方面詳細的講解一下。
先說結論,如果在+的其中有一個操作數是字符串或者可以轉為字符串的話,那么就進行字符串拼接。
反之,如果倆都是數字的話,則進行加法運算。
這時候,肯定會有人問,假如說我有其他的數據類型呢,又不是數字又不是字符串,比如說數組啊,對象啊,布爾值啥的,
那么如果是引用數據類型,則先轉為基本數據類型,再進行比較。
如果是布爾呢,如果加法的另一邊是數字的話,那么他就會轉為數字,如果是字符串的話,就直接拼接啦.
上面說了一大堆的理論的東西,想必大家看著也累了。來上例子。
console.log(true + 11); // 12 console.log(true + false); // 1 console.log(true + "11"); // "true11"
這個很明顯可以看出,如果操作數是數字的話,或者說,操作數都是字符串的話,那么布爾值會先轉為數字,再進行拼接操作,如果有一個操作數是字符串的話,那就不轉啦,直接拼接。
那么如果是對象類型,它是先轉為基本數據類型,怎么轉呢,其實就是先調用valueOf,如果valueOf不存在,或者返回的不是基本數據類型,就調用toString,如果toString也沒有或者是返回的不是基本數據類型呢,那估計就直接報錯了,看例子。
var obj = { valueOf() { return [2, 3]; }, toString() { return "sss"; } } var obj1 = { valueOf() { return 111; }, toString() { return "abc"; } } var obj2 = { valueOf() { return []; }, toString() { return { abc: "liuhaitao", } } } console.log(obj + 1); // "sss1" console.log(obj1 + 1); // 112 console.log(obj2 + 1); // "Cannot convert object to primitive value"
那么下面一個例子就很容易理解了。
console.log([1].valueOf()); // [1] console.log([1] + [2]); // 12
因為數組的valueOf的值依然為數組,所以他們轉的時候,就會調用toString,所以就轉成了字符串啦,倆字符串進行拼接,得到最終結果
減法運算符(-)
很顯然,減法運算符就是做減法的,他很單純,就只是做減法,但是呢,這個有一個知識點,就是,減法里的操作數,如果不是數字的話,那么會先轉為數字類型的。
console.log("123" - 0); // 123 console.log([3] - [1]); // 2 console.log({valueOf() { return 3}} - {valueOf() { return 2}}); // 1
這個很明顯,第一個和第二個的結果都是轉為了數字再進行運算的,那第三個呢,其實這個就是對象的轉化方式,如果有valueOf的話,會先執行valueOf找出基本類型值,沒有或者不是基本類型值就找toString,最后呢,吧基本類型值轉為數字再進行減法運算 。
好了,加法和減法都說完了,那么乘法和除法呢,其實和減法類似,都是轉為數字這樣的。
console.log("123" * 0); // 0 console.log([3] * [1]); // 3 console.log({valueOf() { return 3}} * {valueOf() { return 2}}); // 6
想看乘法和除法其他的細節和本文關系不是太大,所以就不細講了,詳情請查閱文檔ecma文檔:
https://www.ecma-internationa...
https://www.ecma-internationa...
還有本節最后一部分,就是有關于邏輯與(&&)和邏輯或(||)
為啥要特地介紹他倆呢,因為他倆的語法和其他語言的語法特性似乎有那么一些區別。來看代碼
var a = 42; var b = "abc"; var c = null; console.log(a || b); // 42 console.log(a && b); // "abc" console.log(c || b); // "abc" console.log(c && b); // null
這一塊可以看出,他和其他語言的不同之處在于,他的運算的結果,并不是true和false,而是具體的值,也就是說
||符號的時候,如果第一個操作數是true,則返回第一個操作數,如果是false返回第二個,
&&相反,如果第一個操作數是true,則返回第二個操作數,如果是false則返回第一個。
那這個有啥用呢?
其實可以利用這個的特性簡化我們的代碼,比如說
function exec () { console.log("exec"); } true && exec(); // exec var a = undefined; var b = a || 10; console.log(b); // 10
這個代表了應用的兩個方面,&&可以做函數執行的前置判斷,后面那個呢,可以做缺省時的默認值,你可以仔細觀察一下,在一些壓縮代碼工具,壓縮完后的代碼,很多都把if 條件判斷改成了&&,這次知道原因了吧。
參考書籍《你不知道的Javascript中卷》
參考文章:https://codeburst.io/javascri...
本文轉載自http://www.lht.ren/article/6/
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/100583.html
摘要:一返回值調用外部方法獲取的值需要對類型做判斷,因為我們對方法返回的值是有期望值類型,但是卻不能保證這個接口返回的值一直是同一個類型。 19年目標:消滅英語!我新開了一個公眾號記錄一個程序員學英語的歷程 有提升英語訴求的小伙伴可以關注公眾號:csenglish 程序員學英語,每天花10分鐘交作業,跟我一起學英語吧 javascript作為一門動態類型語言,具有很高的動態靈活性,當定義函數...
摘要:抽象相等和嚴格相等。首先,也是如果有對象的話,會把對象轉為基本類型值,在進行比較。 這一節,應該算是強制類型轉換的最后一個小節了,這一部分呢,主要會講比較操作中遇到的強制類型轉換。 抽象相等(==)和嚴格相等(===)。 簡單且粗略的來說,抽象相等和嚴格相等的區別就是抽象相等在比較的時候,如果比較的兩個數類型不同,會先進行類型轉換再比較,而嚴格類型呢,比較簡單粗暴一些,直接返回fals...
摘要:轉換為字符串規則如下圖代碼大致就是普通其他基本類型轉為字符串的話,就直接轉為其值的字符串表達形式,如果是基本類型的封裝對象,會先拆封,然后再轉為字符串,如果是普通對象,則會調用其內部的值,如果是極大數和級小數,將會進行一些轉化,具體規 轉換為字符串規則如下圖代碼: console.log(String(undefined)); // undefined console.log(Str...
摘要:前綴規范每個局部變量都需要有一個類型前綴,按照類型可以分為表示字符串。例如,表示以上未涉及到的其他對象,例如,表示全局變量,例如,是一種區分大小寫的語言。布爾值與字符串相加將布爾值強制轉換為字符串。 基本概念 javascript是一門解釋型的語言,瀏覽器充當解釋器。js執行時,在同一個作用域內是先解釋再執行。解釋的時候會編譯function和var這兩個關鍵詞定義的變量,編譯完成后從...
摘要:實際上,我們通常認為是自有類型的唯一成員。比較運算符的操作數可能是任意類型。結果只有,例得到操作值等價的布爾值真值為,假值為等同于,經常稱為強制轉換。結果返回布爾值的用法是中唯一一個不等于任何值的包括它自己。 說起 js 類型轉換,都是頭疼吧,暈暈的,但是不行啊,這東西很重要滴! 基礎知識 JavaScript的數據類型分為六種,分別為null, undefined, boolean,...
閱讀 2637·2023-04-26 02:17
閱讀 1610·2021-11-24 09:39
閱讀 1070·2021-11-18 13:13
閱讀 2598·2021-09-02 15:11
閱讀 2770·2019-08-30 15:48
閱讀 3406·2019-08-30 14:00
閱讀 2431·2019-08-29 13:43
閱讀 658·2019-08-29 13:07