JS加法運算全解析

2021-10-06 13:05:32 字數 3970 閱讀 8197

夏知更關注

0.0592018.08.14 21:22:11字數 2,554閱讀 3,879

終極命題:

在js中:+、+{}、{}+、{}+{}的結果分別是什麼?

一、js中的型別

二、js中的加法運算

1、使用toprimitive運算轉換左右運算元為原始資料型別(primitive)。

2、在轉換後,如果其中乙個運算元出現原始資料型別是「字串」型別值時,則另一運算元強制轉換為字串,然後做字串的連線運算。

3、在其他情況時,所有運算元都會轉換為原始資料型別的「數字」型別值,然後作數字的相加。

三、toprimitive內部運算

加號運算子只能用於原始資料型別,對於物件型別的值,需要進行資料轉換。在ecmascript中,有乙個抽象的toprimitive運算,用於將物件轉換為原始資料型別,在物件的加法、關係比較或值相等比較的運算中,都會用到。

關於toprimitive的說明語法:

toprimitive(input, preferredtype?)
input代表代入的值,preferredtype可以是數字(number)或字串(string)其中一種,表示需要優先轉換的原始型別。但如果沒有提供這個值也就是預設情況,則會設定轉換的hint值為"default"。這個首選的轉換原始型別的指示(hint值),是在作內部轉換時由js視情況自動加上的,一般情況就是預設值。

而在js的object原型的設計中,有兩個方法,valueof與tostring,在物件的資料型別轉換過程中會根據傳入的值調整被呼叫的順序。

其中比較特殊的是date物件和symbol物件,他們覆蓋了原來的preferredtype行為,date物件預設首選型別是string。

四、valueof()和tostring()

valueof()和tostring()是object上的兩個方法,但是在js中,可能會根據object之間的差異,返回值有所不同。

利用object中的tostring來進行各種不同物件的判斷語法:

object.prototype.tostring.call()

"[object array]"

object.prototype.tostring.call(new date)

"[object date]"

需要配合call,才能得到正確的物件型別值。

五、number、string、boolean包裝物件

js的包裝物件是必須使用new關鍵字進行物件例項化的,直接使用number()、string()與boolean()三個強制轉換函式的用法。例如new number(123),而number('123')則是強制轉換其他型別為數字型別的函式。

六、從例項中理解

/**

* 運算元其一為字串(string)

*/console.log('12'+1); // 121

console.log('abc'+'def'); // abcdef

console.log('1'+true); //1true

console.log('1'+undefined); //1undefined

console.log('1'+null); //1null

運算元其一為字串,字串的拼接運算。

/**

* 運算元其一為數字(number)

*/console.log(1+1); // 2

console.log(1+'def'); // 1def

console.log(1+true); //2

console.log(1+undefined); //nan

console.log(1+null); //1

1+'def'為運算元其一為字串情況,其餘為在沒有字串情況下,運算元其一為數字,做型別轉換後相加。

/**

* 數字(number)/字串(string)以外的原始型別相加

*/console.log(true+true); // 2

console.log(true+null); // 1

console.log(true+undefined); //nan

console.log(undefined+null); //nan

console.log(undefined+undefined); //nan

console.log(null+null); //0

當數字與字串以外的,其他原始資料型別直接使用加號運算時,就是轉為數字再運算,這與字串完全無關。

console.log( + );        //""
兩個陣列相加,左右運算元先呼叫valueof(),返回陣列本身,呼叫tostring(),返回原始資料型別,即空字串,作連線操作,得到乙個空字串。

console.log({} + {});        //"[object object][object object]"
兩個物件相加,左右運算元先呼叫valueof(),返回物件本身,呼叫tostring(),返回原始資料型別,即物件字串[object object],作連線操作,得到字串[object object][object object]

console.log({}+{})得到的這樣的結果,但是,在有些瀏覽器例如firefox、edge控制台直接輸入{}+{},會得到nan,因為瀏覽器會把{} + {}直譯為相當於+{}語句,因為它們會認為以花括號開頭(,把整個語句認為是個+{}的語句,也就是相當於強制求出數字值的number({})函式呼叫運算,相當於number("[object object]")運算,最後得出的是nan。如果加上圓括號({}) + {},則可以避免這樣的問題。

console.log({} + );        //"[object object]"
空物件和空陣列相加,左右運算元先呼叫valueof(),返回物件陣列本身,呼叫tostring(),返回原始資料型別,即物件字串[object object]和"",作連線操作,得到字串[object object]

直接console.log得到的都是一樣的值,但是直接在瀏覽器控制台輸入:

> {} + 

0> + {}

"[object object]"

{} + 相當於+語句,也就是相當於強制求出數字值的number()運算,相當於number("")運算,最後得出的是0數字。

console.log(1 + (new date()));       //"1tue aug 14 2018 21:18:24 gmt+0800 (中國標準時間)"
date物件首選型別string,先呼叫tostring(),得到字串做字串連線運算。

要得出date物件中的valueof返回值,需要使用一元加號(+),來強制轉換它為數字型別,例如以下的**:

console.log(+new date());

1534298171747

console.log(+);     // 0

console.log(+{}); // nan

console.log(+null); //0

console.log(+true); //1

console.log(+undefined); //nan

一元加號運算時,唯一的運算元相當於強制求出數字值的number()運算。

大數運算 加法

include include include void add const char a,const char b,char c if carry 0 result result length carry 0 while result length 0 c result result length...

大數運算 加法

究竟為什麼要用大數加法呢。我們來看下資料 bool型為布林型,佔1個位元組,取值0或1。bool型為int型,一般認為佔4個位元組,取值true false error。sbyte型為有符號8位整數,佔1個位元組,取值範圍在128 127之間。bytet型為無符號16位整數,佔2個位元組,取值範圍在...

矩陣加法運算

將稀疏矩陣a的非零元以行序為主序的順序存於一維陣列v中,並用二維陣列b表示a中的相應元素是否為零元素,例如 150 0220 6009 000 矩陣a left begin 15 0 0 22 0 6 0 0 9 0 0 0 end right tag 150 9 0 60 0 00 2 200 矩...