JS紅寶書(shū)之第三章(三)數(shù)據(jù)類(lèi)型(二)

Number

數(shù)值種類(lèi)

正數(shù) 與 浮點(diǎn)數(shù)(區(qū)別在一浮點(diǎn)數(shù)內(nèi)存空間更大)

console.log('1 為整數(shù)');
console.log('1.2 為浮點(diǎn)數(shù)');

// 浮點(diǎn)數(shù)保存數(shù)值不精確原因:無(wú)法使用二進(jìn)制來(lái)精確表示小數(shù)
console.log(0.1 + 0.2 !== 0.3); //  true

// 保存浮點(diǎn)數(shù)占用內(nèi)存空間是整數(shù)的二倍醉拓,ECMAScript 會(huì)不遺余力的將浮點(diǎn)數(shù)轉(zhuǎn)為整數(shù)
console.log(1.0); // 1

進(jìn)制

  • 十進(jìn)制 (默認(rèn))由 0123456789 組成
  • 八進(jìn)制 (0開(kāi)頭) 由 01234567 組成
  • 十六進(jìn)制 (0x開(kāi)頭) 由 0123456789ABCDEF 組成
console.log(070); // 56
console.log(078); // 78 以0開(kāi)頭履磨,但后面數(shù)值超過(guò)八進(jìn)制所含數(shù)字范圍(0~7)按照10進(jìn)制解析
console.log(0xA); // 10

數(shù)值范圍

// 最小/大值
console.log(Number.MIN_VALUE); // 5e-324
console.log(Number.MAX_VALUE); // 1.7976931348623157e+308
// 無(wú)窮值
console.log(Number.POSITIVE_INFINITY);// Infinity
console.log(Number.NEGATIVE_INFINITY);// -Infinity

其他類(lèi)型轉(zhuǎn)為數(shù)字方式一:Number類(lèi)型轉(zhuǎn)換

字符串轉(zhuǎn)數(shù)字規(guī)則:除代表正負(fù)的符號(hào)外,字符串中只要含有除第一個(gè).之外的其他非數(shù)字字符储笑,轉(zhuǎn)換結(jié)果就是 NaN

引用數(shù)據(jù)類(lèi)型轉(zhuǎn)換過(guò)程
  1. 調(diào)用 valueOf()
  2. 調(diào)用 toString()
  3. 使用 Number() 對(duì)基本類(lèi)型的轉(zhuǎn)換規(guī)則
// -------------- Number()基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換 --------------
console.log(Number(true)); // 1
console.log(Number(false)); // 0
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
console.log(Number('')); // 0
console.log(Number('12')); // 12
console.log(Number('+1.2')); // 1.2
console.log(Number('-1.2')); // -1.2
console.log(Number('qw')); // NaN

// -------------- Number()引用數(shù)據(jù)類(lèi)型轉(zhuǎn)換 ---------------
var arr = [];
console.log('Number(arr) => ', Number(arr));
// 0. [] => []
// 1. [] => ''
// 2. '' => 0
console.log('Number([12]) => ', Number([12]));
// 0. [12] => [12]
// 1. [12] => '12'
// 2. '12' => 12
console.log('Number([12,23]) => ', Number([12,23]));
// 0. [12,23] => [12,23]
// 1. [12,23] => '12,23'
// 2. '12,23' => NaN
console.log('Number({name: 12}) => ', Number({name: 12}));
// 0. {name: 12} => {name: 12}
// 1. {name: 12} => '[object Object]'
// 2. '[object Object]' => NaN
console.log('Number(function(){}) => ', Number(function(){}));
// 0. function(){} => f (){}
// 1. f (){} => 'function(){}'
// 2. 'function(){}' => NaN
console.log('Number(function test(i){return i}) => ', Number(function test(i){return i}));
// 0. function test(i){return i} => ? test(i){return i}
// 1. ? test(i){return i} => 'function test(i){return i}'
// 2. 'function test(i){return i}' => NaN
引用數(shù)據(jù)類(lèi)型轉(zhuǎn)數(shù)字詳解(可跳過(guò))
  • 重寫(xiě) valueOf()
/**
 * 只重寫(xiě) valueOf()方法
 * 結(jié)果表明會(huì)調(diào)用 valueOf()方法
 */
 var temp = {name: 12};
 console.log('重寫(xiě) temp.valueOf() 前=> ', temp.valueOf());
 // temp.valueOf = function(){return '12'}; // 第一次
 temp.valueOf = function(){return '1.2.1'}; // 第二次

 // console.log('isNaN(temp.valueOf()) => ', isNaN(temp.valueOf()));
 console.log('重寫(xiě) temp.valueOf() 后=> ', temp.valueOf());
 console.log('Number(temp) => ', Number(temp)); // 第一次 12  第二次 NaN    
  • 重寫(xiě) toString()

/**
 * 只重寫(xiě) toString()方法
 * 結(jié)果表明不論是在原型上定義還是在對(duì)象上定義都會(huì)調(diào)用 toString()方法
 */
 var temp = {name: 12};
 console.log('重寫(xiě) temp.toString() 前=> ', temp.toString());

 // temp.toString = function(i){return 2}; // 第一次
 temp.toString = function(i){return '2..'}; // 第二次
 // temp.__proto__.toString = function(j){return 2};
 // temp.__proto__.toString = function(j){return '2..'};
 console.log('重寫(xiě) temp.toString() 后=> ', temp.toString());
 console.log('Number(temp) => ', Number(temp)); // 第一次 2  第二次 NaN
  • 同時(shí)重寫(xiě) valueOf() 和 toString()
    • valueOf() 的結(jié)果是引用數(shù)據(jù)類(lèi)型本身
    • toString() 通常是字符串包裹引用數(shù)據(jù)類(lèi)型本身
  • 不重寫(xiě) valueOf() 方法,會(huì)調(diào)用原型上的 valueOf() 方法蚂会,得到引用類(lèi)型勾效,由于是引用類(lèi)型茸苇,所以調(diào)用 toString(),得到結(jié)果
  • 不重寫(xiě) toString() 得到 12
  • 重寫(xiě) temp._proto_.toString 得到 3
  • 在上述基礎(chǔ)上 重寫(xiě) temp.toString 得到 2
  • 重寫(xiě) valueOf() 方法各吨,返回基本數(shù)據(jù)類(lèi)型枝笨,得到 13,即不走 toString()
  • 重寫(xiě) valueOf() 方法揭蜒,返回 [] / {} / function(){}横浑,得到 2,即走了 toString()屉更,而且是對(duì)象私有的 toString()
/**
 * 引用數(shù)據(jù)類(lèi)型轉(zhuǎn)為數(shù)字類(lèi)型時(shí)伪嫁,Number() 的轉(zhuǎn)化規(guī)則是:
 *    先調(diào)用 valueOf(),如果 valueOf() 返回的是基本數(shù)據(jù)類(lèi)型偶垮,則按照基本數(shù)據(jù)類(lèi)型轉(zhuǎn)為 Number()規(guī)則轉(zhuǎn)換并返回。
 *  如果 valueOf() 返回引用數(shù)據(jù)類(lèi)型,則會(huì)去調(diào)用該引用數(shù)據(jù)類(lèi)型的 toString()方法得到結(jié)果似舵,結(jié)果再按照基本數(shù)據(jù)
 *  類(lèi)型轉(zhuǎn)為 Number() 規(guī)則進(jìn)行轉(zhuǎn)換脚猾。若重寫(xiě) toString,使其返回引用類(lèi)型會(huì)報(bào)錯(cuò)
 */
// var temp = {name: 12};
var temp = [12];
console.log('重寫(xiě) temp.valueOf() 前=> ', temp.valueOf());
// valueOf 返回結(jié)果是基本數(shù)據(jù)類(lèi)型砚哗,就不會(huì)再走 toString()
temp.valueOf = function(){return '13..'};
// valueOf 返回結(jié)果是引用數(shù)據(jù)類(lèi)型龙助,就會(huì)走 toString()
// temp.valueOf = function(){return []};
// temp.valueOf = function(){return {}};
// temp.valueOf = function(){return function(){}};

// console.log('isNaN(temp.valueOf()) => ', isNaN(temp.valueOf()));
console.log('前 temp.toString() => ', temp.toString());

// temp.toString = function(i){return 2};
// temp.toString = function(i){return []}; // Cannot convert object to primitive value
temp.__proto__.toString = function(j){return 3};
console.log('后 temp.valueOf() => ', temp.valueOf());
console.log('后 temp.toString() => ', temp.toString());
console.log('Number(temp) => ', Number(temp));

其他類(lèi)型轉(zhuǎn)為數(shù)字方式二:parseInt()、parseFloat()

按照字符串從左到右查找蛛芥,從左到右依次查找有效數(shù)字提鸟,直到遇到一個(gè)非有效數(shù)字停止查找(不管后方是否還有,都不再查找)把找到的當(dāng)做數(shù)字返回仅淑,(傳遞的值一定是字符串称勋,不是字符串的轉(zhuǎn)換成字符串然后繼續(xù)執(zhí)行查找)

// parseInt 轉(zhuǎn)化成一個(gè) int 數(shù)字
console.log('parseInt() ==>', parseInt()); // NaN
console.log('parseInt(+1) ==>', parseInt(+1)); // NaN
console.log('parseInt(-1) ==>', parseInt(-1)); // NaN
console.log('parseInt("  12.3") ==>', parseInt('  12.3')); // 排除空格 12
console.log('parseInt("  12.9ADS") ==>', parseInt('  12.9ADS')); // 讀到其他字符結(jié)束 12

console.log('parseInt(070) ==>', parseInt(070)); // 八進(jìn)制 56
console.log('parseInt(0xA) ==>', parseInt(0xA)); // 十六進(jìn)制 10

// 按照指定進(jìn)制解析
console.log('parseInt("10", 2) ==>', parseInt('10', 2)); // 2
console.log('parseInt("10", 8) ==>', parseInt('10', 8)); // 8
console.log('parseInt("10", 10) ==>', parseInt('10', 10)); // 10
console.log('parseInt("10", 16) ==>', parseInt('10', 16)); // 16

// 轉(zhuǎn)換 Float類(lèi)型 (1.只支持十進(jìn)制 2.是整數(shù)會(huì)返回整數(shù),而不是浮點(diǎn)數(shù))
console.log('parseFloat("10.2ab") ==>', parseFloat("10.2ab")); // 10.2
console.log('parseFloat("0xA") ==>', parseFloat("0xA")); // 0
console.log('parseFloat("10.0") ==>', parseFloat("10.0")); // 10
console.log('parseFloat("1.234e3") ==>', parseFloat("1.234e3")); // 1.234
Number() 與 parsexxx()
  • 處理機(jī)制不同
    • Number() 走 V8 引擎設(shè)定的規(guī)則
    • parseInt()/parseFloat() 走自己寫(xiě)的方法 (先轉(zhuǎn)成字符串涯竟,然后一位一位的查找)

其他類(lèi)型轉(zhuǎn)為數(shù)字方式三:隱式轉(zhuǎn)換

利用算術(shù)運(yùn)算符轉(zhuǎn)換為數(shù)字

'12' - 0; // 12
['14'] - 5; // 9
1 * '3'; // 3
'3' / 1; // 1

NaN(Not a Number)

這個(gè)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)未返回?cái)?shù)值的情況(這樣就不會(huì)報(bào)錯(cuò)了)

isNaN()
  • 來(lái)源:
// 由于 NaN 不等于 NaN,所以不能通過(guò)等于 NaN 判斷一個(gè)數(shù)是不是有效數(shù)字
console.log('NaN == NaN => ', NaN == NaN); // false
  • 規(guī)則
    • 如果是數(shù)字赡鲜,直接返回 false
    • 如果不是 isNaN() 將采用 Number() 函數(shù)轉(zhuǎn)換規(guī)則進(jìn)行轉(zhuǎn)換
console.log('isNaN(12) => ', isNaN(12)); // 本身就是數(shù)字
console.log('isNaN(NaN) => ', isNaN(NaN)); // 本身就不是數(shù)字
console.log('isNaN(\'12\') => ', isNaN('12')); // 字符串 可以轉(zhuǎn)為數(shù)字
console.log('isNaN(\'12qw\') => ', isNaN('12qw')); // 字符串 不能轉(zhuǎn)為數(shù)字
console.log('isNaN(null) => ', isNaN(null)); // null 可以轉(zhuǎn)數(shù)字
console.log('isNaN(undefined) => ', isNaN(undefined)); // undefined 轉(zhuǎn)為 NaN
// isNaN() 轉(zhuǎn)換引用類(lèi)型過(guò)程 同 Number() 
// 1.調(diào)用 valueOf()
// 2.調(diào)用 toString()
// 3.使用 Number() 對(duì)基本類(lèi)型的轉(zhuǎn)換規(guī)則
console.log('isNaN([\'+12.23\']) => ', isNaN(['+12.23']));
// 0. ['+12.23'] => ['+12.23']
// 1. ['+12.23'] => '+12.23'
// 2. isNaN('+12.23') => isNaN(12.23) => false
console.log('isNaN([12, 23]) => ', isNaN([12, 23]));
// 0. [12, 23] => [12, 23]
// 1. [12, 23] => '12, 23'
// 2. isNaN('12, 23') => true
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庐船,隨后出現(xiàn)的幾起案子银酬,更是在濱河造成了極大的恐慌,老刑警劉巖筐钟,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩瞪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡篓冲,警方通過(guò)查閱死者的電腦和手機(jī)李破,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纹因,“玉大人喷屋,你說(shuō)我怎么就攤上這事〔t恰!?“怎么了屯曹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惊畏。 經(jīng)常有香客問(wèn)我恶耽,道長(zhǎng),這世上最難降的妖魔是什么颜启? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任偷俭,我火速辦了婚禮,結(jié)果婚禮上缰盏,老公的妹妹穿的比我還像新娘涌萤。我一直安慰自己淹遵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布负溪。 她就那樣靜靜地躺著透揣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪川抡。 梳的紋絲不亂的頭發(fā)上辐真,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音崖堤,去河邊找鬼侍咱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛密幔,可吹牛的內(nèi)容都是我干的楔脯。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼老玛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淤年!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蜡豹,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤麸粮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后镜廉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弄诲,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年娇唯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了齐遵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塔插,死狀恐怖梗摇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情想许,我是刑警寧澤伶授,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站流纹,受9級(jí)特大地震影響糜烹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漱凝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一疮蹦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茸炒,春花似錦愕乎、人聲如沸阵苇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慎玖。三九已至,卻和暖如春笛粘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背湿硝。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工薪前, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人关斜。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓示括,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親痢畜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垛膝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容