夏知更關注
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 矩...