Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
JavaScript中,NaN代表"Not a Number",即非數字,是一個特殊的值,用于表示某些數學運算的結果未定義或不可表示。NaN是JavaScript中唯一一個與自身不相等的值,也就是說,`NaN === NaN`的結果為`false`。
NaN常常在嘗試進行無法返回有效數字值的數學運算時出現。例如,當你嘗試將一個字符串(除非它是一個可以解析為數字的字符串)轉換為數字時,JavaScript會返回NaN。
let num = Number("hello");
console.log(num); // 輸出 NaN
此外,除以0或者某些無法得出有效結果的數學函數(例如Math.sqrt(-1))也會返回NaN。
let num1 = 10 / 0;
let num2 = Math.sqrt(-1);
console.log(num1); // 輸出 NaN
console.log(num2); // 輸出 NaN`
雖然NaN表示一個非數字的值,但它本身其實是一個數字類型。可以使用`typeof`運算符來驗證這一點:
let num = Number("hello");
console.log(typeof num); // 輸出 "number"`
由于NaN的特殊性,我們不能直接使用等于(==)或全等(===)運算符來檢查一個值是否為NaN。我們需要使用`isNaN()`函數來進行這個檢查。但需要注意的是,`isNaN()`函數不僅會在值為NaN時返回`true`,還會在值為`undefined`時返回`true`。為了避免這種情況,我們可以使用`Number.isNaN()`函數,這個函數只有在參數是NaN時才會返回`true`。
let num1 = NaN;
let num2 = undefined;
console.log(isNaN(num1)); // 輸出 true
console.log(isNaN(num2)); // 輸出 true
console.log(Number.isNaN(num1)); // 輸出 true
console.log(Number.isNaN(num2)); // 輸出 false`
雖然NaN在某些情況下可能會讓人感到困惑,但理解它的行為和如何在JavaScript中處理它是非常重要的。這可以幫助我們避免一些常見的編程錯誤,并更準確地控制我們的代碼的行為。
?
avaScript 中的數字類型包含整數和浮點數:
const integer = 4;
const float = 1.5;
typeof integer; // => 'number'
typeof float; // => 'number'
復制代碼
另外還有 2 個特殊的數字值:Infinity(比其他任何數字都大的數字)和 NaN(表示“Not A Number”概念):
const infinite = Infinity;
const faulty = NaN;
typeof infinite; // => 'number'
typeof faulty; // => 'number'
復制代碼
雖然直接使用 NaN 的情況很少見,但在對數字進行無效的操作后卻會令人驚訝地出現。
讓我們仔細看看 NaN 特殊值:如何檢查變量是否具有 NaN,并了解怎樣創建“Not A Number”值。
JavaScript 中的數字類型是所有數字值的集合,包括 “Not A Number”,正無窮和負無窮。
可以使用特殊表達式 NaN 、全局對象或 Number 函數的屬性來訪問“Not A Number”:
typeof NaN; // => 'number'
typeof window.NaN; // => 'number'
typeof Number.NaN; // => 'number'
復制代碼
盡管具有數字類型,但“Not A Number”是不代表實數的值。NaN 可用于表示錯誤的數字運算。
例如,將數字與 undefined 相乘不是有效操作,因此結果為 NaN:
1 * undefined; // => NaN
復制代碼
同樣嘗試解析無效的數字字符串(如 'Joker')也會導致 NaN:
parseInt('Joker', 10); // => NaN
復制代碼
NaN有趣的特性是,即使使用 NaN 本身,它也不等于任何值:
NaN === NaN; // => false
復制代碼
此行為對于檢測變量是否為 NaN 非常有用:
const someNumber = NaN;
if (someNumber !== someNumber) { console.log('Is NaN');
} else {
console.log('Is Not NaN');
}
// logs "Is NaN"
復制代碼
僅當 someNumber 是 NaN 時,someNumber !== someNumber 表達式才是 true。因此,以上代碼片段輸出到控制臺的結果是 "Is NaN"。
JavaScript 通過內置函數來檢測 NaN:isNaN() 和 Number.isNaN():
isNaN(NaN); // => true
isNaN(1); // => false
Number.isNaN(NaN); // => true
Number.isNaN(1); // => false
復制代碼
這些函數之間的區別在于,Number.isNaN() 不會將其參數轉換為數字:
isNaN('Joker12'); // => true
Number.isNaN('Joker12'); // => false
復制代碼
isNaN('Joker12') 將參數 'Joker12' 轉換為數字,即 NaN。因此該函數返回 true 。
另一方面,Number.isNaN('Joker12') 會檢查參數是否為 NaN 而不進行轉換。該函數返回 false ,因為'Joker12' 不等于 NaN。
在 JavaScript 中,你可以將字符串形式的數字轉換為數字。
例如你可以輕松地將字符串 '1.5' 轉換為浮點數 1.5:
const numberString = '1.5';
const number = parseFloat(numberString);
number; // => 1.5
復制代碼
當字符串不能被轉換為數字時,解析函數返回 NaN :表示解析失敗。這里有些例子:
parseFloat('Joker12.5'); // => NaN
parseInt('Joker12', 10); // => NaN
Number('Joker12'); // => NaN
復制代碼
解析數字時,最好先確認解析結果是否為 NaN :
let inputToParse = 'Invalid10';
let number;
number = parseInt(inputToParse, 10);
if (isNaN(number)) { number = 0;
}
number; // => 0
復制代碼
解析 inputToParse 失敗,因此 parseInt(inputToParse, 10)返回 NaN。條件 if (isNaN(number)) 為 true,并且將 number 賦值為 0。
把 undefined 用作加法、乘法等算術運算中的操作數會生成 NaN。
例如:
function getFontSize(style) {
return style.fontSize;
}
const fontSize = getFontSize({ size: 16 }) * 2;
const doubledFontSize = fontSize * 2;
doubledFontSize; // => NaN
復制代碼
getFontSize() 是從樣式對象訪問 fontSize 屬性的函數。調用 getFontSize({ size: 16 }) 時,結果是undefined(在 { size: 16 } 對象中不存在 fontSize 屬性)。
fontSize * 2 被評估為 undefined * 2,結果為 NaN。
當把缺少的屬性或返回 undefined 的函數用作算術運算中的值時,將生成 “Not A Number”。
防止 NaN 的好方法是確保 undefined 不會進行算術運算,需要隨時檢查。
當算數運算的操作數為 NaN 時,也會生成NaN 值:
1 + NaN; // => NaN
2 * NaN; // => NaN
復制代碼
NaN 遍及算術運算:
let invalidNumber = 1 * undefined;
let result = 1;
result += invalidNumber; // appendresult *= 2; // duplicate
result++; // increment
result; // => NaN
復制代碼
在將 invalidNumber 值(具有 'NaN')附加到 result之后,會破壞對 result 變量的操作。
當算術運算采用不確定形式時,將會產生 NaN 值。
0/0 和 Infinity/Infinity 這樣的的除法運算:
0 / 0; // => NaN
Infinity / Infinity; // => NaN
復制代碼
0 和 Infinity 的乘法運算:
0 * Infinity; // => NaN
復制代碼
帶有不同符號的 Infinity 的加法:
-Infinity + Infinity; // => NaN
復制代碼
負數的平方根:
Math.pow(-2, 0.5); // => NaN
(-2) ** 0.5; // => NaN
復制代碼
或負數的對數:
Math.log2(-2); // => NaN
復制代碼
JavaScript 中用 NaN 表示的的“Not A Number”概念對于表示錯誤的數字運算很有用。
即使是 NaN 本身也不等于任何值。檢查變量是否包含 NaN 的建議方法是使用 Number.isNaN(value)。
將字符串形式的數字轉換為數字類型失敗時,可能會導致顯示“Not A Number”。檢查 parseInt()、parseFloat() 或 Number() 是否返回了 NaN 是個好主意。
undefined 或 NaN 作為算術運算中的操作數通常會導致 NaN。正確處理 undefined(為缺少的屬性提供默認值)是防止這種情況的好方法。
數學函數的不確定形式或無效參數也會導致 “Not A Number”。但是這些情況很少發生。 這是我的務實建議:出現了 NaN?趕快檢查是否存在 undefined!
作者:前端先鋒
鏈接:https://juejin.cn/post/6844904047787376654
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
言
在javascript中最有趣的數據莫過于NaN,對于大部分小猿們剛接觸到這個概念的時候表情應該是這樣的。本篇博客就來給各位客官介紹下NaN的知識點。
這個NaN到底如何產生的,結合本猿開發和查找資料總結以下兩種情況
var num = Number('千峰')
console.log(num) // NaN
var num = '千峰' * '大前端'
console.log(num) // NaN
var x = Math.sqrt(-1)
console.log(x)
console.log(NaN+1) // NaN
console.log(NaN*1) // NaN
console.log(NaN/1) // NaN
// ...
本猿針對于幾種可能會混淆情況比較,發現結果都是false
console.log(NaN === 0) // false
console.log(NaN === '') // false
console.log(NaN === undefined) // false
console.log(NaN === null) // false
難道是我用了全等,抱著試一試態度我又換成了==,結果也是false
console.log(NaN == 0) // false
console.log(NaN == '') // false
console.log(NaN == undefined) // false
console.log(NaN == null) // false
經過我反復測試,得出的結果是NaN和任何數據比較的結果都是false,但是感覺好像還有什么遺漏
名偵探柯南上身的我發現還有一種情況沒有考慮
console.log(NaN === NaN) // false
console.log(NaN == NaN) // false
console.log(isNaN(NaN)) // true
*請認真填寫需求信息,我們會在24小時內與您取得聯系。