鍍金池/ 問答/HTML/ javascript數(shù)值轉(zhuǎn)換問題

javascript數(shù)值轉(zhuǎn)換問題

clipboard.png

clipboard.png

js高級程序設(shè)計第三版
關(guān)于數(shù)值轉(zhuǎn)換的描述

clipboard.png

如果是NaN不行應(yīng)該執(zhí)行toString么 怎么會打印出NaN?

回答
編輯回答
撥弦
博主對這句話理解有偏差

number類型轉(zhuǎn)換

前面的規(guī)則說明了,如果是對象則調(diào)用ValueOf()方法,這時候調(diào)用valueOf()方法已經(jīng)返回'abc',然后再依照前面的規(guī)則,規(guī)則第五條,所以返回NAN

前面的規(guī)則

另外,命理難說 回答地很詳細!

2017年11月21日 06:27
編輯回答
卟乖

我的理解是這樣,希望對你有所幫助!

基本上,所有JS數(shù)據(jù)類型都擁有valueOf和toString這兩個方法,null除外。
  • 示例代碼
var box = {
        valueOf: function() {
            return 1;
        },
        toString: function() {
            return "toString";
        }
    };
console.log(Number(box)); //1
console.log(String(box)); //toString
*    當(dāng)使用`Number`時,調(diào)用的其實是其內(nèi)部的`valueOf`方法,返回一個`1`,這樣`Number`本身也要對返回值進行一次檢查,如果你返回的不是`number`類型的,當(dāng)然檢測出來就是`NaN`,當(dāng)然這個方法也可以重寫
*    使用`String`也是同上理解,不過不會出現(xiàn)`NaN`而已。
2017年7月6日 00:20
編輯回答
吃藕丑

轉(zhuǎn)換規(guī)則如下:

  1. 如果valueOf存在,且返回“基本類型”數(shù)據(jù),返回valueOf的結(jié)果。
  2. 如果toString存在,且返回“基本類型”數(shù)據(jù),返回toString的結(jié)果。
  3. 報錯。

綜上所訴

var box = {
  valueOf() {
    console.log('調(diào)用了valueOf');
    return 'abc';
  },
  toString() {
    console.log('調(diào)用了toString');
    return '123';
  },
};
console.log(Number(box));

以上就只調(diào)用了valueOf,因為valueOf返回的是基本類型數(shù)據(jù)。


var box = {
  valueOf() {
    console.log('調(diào)用了valueOf');
    return {};
  },
  toString() {
    console.log('調(diào)用了toString');
    return '123';
  },
};
console.log(Number(box));

以上兩個方法都調(diào)用了,因為valueOf返回的不是基本類型,所以在調(diào)用一次toString


同理 你可以在測試一下兩個方法返回的都是復(fù)雜類型數(shù)據(jù)的時候結(jié)果是什么

2017年7月20日 00:29
編輯回答
笑浮塵
var box = {
  valueOf() {
    return 'abc';
  },
  toString() {
    return '1233';
  },
};
console.log(Number(box));

==>

var box = {
  valueOf() {
    return 'abc';
  },
  toString() {
    return '1233';
  },
};
var boxValue=Number(box);
console.log(boxValue);

Number作為普通函數(shù)調(diào)用時,將執(zhí)行類型轉(zhuǎn)換
轉(zhuǎn)換規(guī)則,先調(diào)用對象的valueOf方法,如果能返回一個基本類型(原始類型),那么返回這個原始類型,再根據(jù)原始類型到number類型的轉(zhuǎn)換規(guī)則執(zhí)行轉(zhuǎn)換,不能轉(zhuǎn)換成數(shù)字,那么返回NaN。
如果valueOf不能不能返回基本類型,那么轉(zhuǎn)而去調(diào)用toString方法,如果這個方法能返回原始類型,再根據(jù)原始類型到number類型的轉(zhuǎn)換規(guī)則執(zhí)行轉(zhuǎn)換,不能轉(zhuǎn)換成數(shù)字,那么拋出類型錯誤
Uncaught TypeError: Cannot convert object to primitive value

var box = {
  valueOf() {
    return {};
  },
  toString() {
    return {};
  },
};
var boxValue=Number(box);//Uncaught TypeError: Cannot convert object to primitive value
console.log(boxValue);
2018年9月23日 19:20