成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 中的 null undefined NaN 及 && 與 ||

Chao / 3043人閱讀

摘要:提示函數(shù)通常用于檢測和的結(jié)果,以判斷它們表示的是否是合法的數(shù)字。與運算多個布爾類型相與,若其中存在一個及以上的,則結(jié)果為,否則為。

以下所用測試代碼可以訪問 RunJS 查看

undefined 與 null

如果定義一個變量卻不賦值,則其默認(rèn)等于 undefined

var foo;
console.log(foo); // undefined

也可以對其賦值 undefined

var undef = undefined;
console.log(undef); // undefined

調(diào)用函數(shù)時,傳入的參數(shù)少于所需參數(shù),未傳入的參數(shù)也為 undefined

bar(1, 2);
function bar(a, b, c){
    console.log(a, b, c); // 1, 2, undefined
}

使用 new Array(n) 的形式初始化一個長度為 n 的數(shù)組時,數(shù)組中的值默認(rèn)為 undefined

var arr = new Array(3);
console.log(arr); // [undefined × 3]

這里要注意使用 var arr = new Array(1, 2, 3)var arr = [3] 與上述初始化方法的區(qū)別。

獲取某對象不存在的屬性或數(shù)組中不存在的值時,也會返回 undefined

var element = {};
console.log(element.nonAttr);  // undefined

var arr = [];
console.log(arr[1]);  // undefined

var obj = new Object();
console.log(obj.nonAttr);  // undefined

直接獲取 DOM 元素非原生屬性或未賦值的原生屬性時,會返回 undefined

將一個不存在的 DOM 對象賦值給一個變量時,該變量為 null

var foo = document.getElementById("notExists");
console.log(foo); // null

也可以將變量賦值為 null

var nullVal = null;
console.log(nullVal); // null

對于 undefinednull,由于前者是由后者派生而出的,所以其二者使用 == 比較時是相等的,因而若要對二者進(jìn)行區(qū)分,則需要使用 ===typeof

undefined == null;                   // true
undefined === null;                  // false
typeof(undefined) == typeof(null);   // false
NaN

NaN( Not a Number ),表示非數(shù)字。任何值都不與 NaN 相等,甚至是它自己;

1          == NaN   // false
""         == NaN   // false
" "        == NaN   // false
"abc"      == NaN   // false
[]         == NaN   // false
{}         == NaN   // false
null       == NaN   // false
undefined  == NaN   // false
NaN        == NaN   // false

我們可以使用 isNaN 來判斷一個值是否為 NaN

isNaN( 1 )            // false
isNaN( "" )           // false
isNaN( " " )          // false
isNaN( "abc" )        // true
isNaN( [] )           // false
isNaN( {} )           // true
isNaN( null )         // false
isNaN( undefined )    // true
isNaN( NaN )          // true

注意,由于部分非數(shù)字的 isNaN() 結(jié)果也為 false,所以若要判斷一個值是否為數(shù)字,需要使用如下方法:

isNumber( 1 )          // true
isNumber( "" )         // false
isNumber( " " )        // false
isNumber( "abc" )      // false
isNumber( [] )         // false
isNumber( {} )         // false
isNumber( null )       // false
isNumber( undefined )  // false
isNumber( NaN )        // false

// 判斷一個值是否為數(shù)字
function isNumber(value){
    return !isNaN(parseFloat(value));
}

注:parseIntparseFloat 方法在轉(zhuǎn)換失敗時會返回 NaN。

提示:isNaN() 函數(shù)通常用于檢測 parseFloat() 和 parseInt() 的結(jié)果,以判斷它們表示的是否是合法的數(shù)字。當(dāng)然也可以用 isNaN() 函數(shù)來檢測算數(shù)錯誤,比如用 0 作除數(shù)的情況。

「與」運算:&&

多個布爾類型相「與」,若其中存在一個及以上的 false,則結(jié)果為 false,否則為 true。且在「與」運算中存在「短路」,即遇到第一個 false 之后的內(nèi)容不會運行。

true && true  && false && true   // false
true && true  && true  && true    // true
true && false && i++   && j--     // false, i 和 j 的值不會變化

問題來了,如果這里參與「與」運算的不全是布爾類型呢?

true && 11 && "string" && {}   // 輸出什么?

在討論這個問題之前,我們先看一看以下兩組變量的值:

0         == true     // false
-123      == true     // false
123       == true     // false
""        == true     // false
"string"  == true     // false
[]        == true     // false
[1,2,3]   == true     // false
null      == true     // false
undefined == true     // false
NaN       == true     // false
{}        == true     // Uncaught SyntaxError
Boolean( 0 )          // false
Boolean( -123 )       // true
Boolean( 123 )        // true
Boolean( "" )         // false
Boolean( "string" )   // true
Boolean( [] )         // true
Boolean( [1,2,3] )    // true
Boolean( null )       // false
Boolean( undefined )  // false
Boolean( NaN )        // false
Boolean( {} )         // true

然后我們做如下測試:

true  && false                // false
true  && NaN                  // NaN
true  && null                 // null
true  && []                   // []
0     && []                   // 0
true  && "AAA" && undefined   // undefined
true  && "AAA" && "BBB"       // BBB
false && "AAA" && "BBB"       // false

這里我們發(fā)現(xiàn),「與」運算的結(jié)果并不一定是布爾值。結(jié)合上述 Boolean(xx) 形式結(jié)果,可以得出猜測:「與」運算的結(jié)果取決于第一個Boolean(xx) 轉(zhuǎn)換結(jié)果false 的值;若全部皆為 true,則結(jié)果為最后一個值。

以之前的問題為例,對于 true && 11 && "string" && {},我們可以將其轉(zhuǎn)換為:

true && Boolean(11) && Boolean("string") && Boolean({})

由于這四個值的結(jié)果均為 true,因而 true && 11 && "string" && {} 的結(jié)果即為最后一個值,即:{}。

同理,我們可以得知,true && 0 && "string" && {}true && [] && "" && null 的值分別為:0"";

「或」運算:||

同 && 「與」運算類似,「或」運算的結(jié)果也不一定為布爾類型,其結(jié)果取決于第一個Boolean() 結(jié)果true 的值,若全部為 false,則結(jié)果為最后一個元素的值,如以下例子:

true  || false                // true
true  || NaN                  // true
true  || null                 // true
true  || []                   // true
0     || []                   // []
true  || "AAA" || undefined   // true
true  || "AAA" || "BBB"       // true
false || "AAA" || "BBB"       // "AAA"

參考:

JS中Null與Undefined的區(qū)別 - 博客園

為什么 javascript 中 Boolean... - 百度知道

JavaScript isNaN() 函數(shù) - w3school

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81771.html

相關(guān)文章

  • js中的bool值轉(zhuǎn)換"&&" 、"||"

    摘要:如果左側(cè)表達(dá)式的值為真值,則返回右側(cè)表達(dá)式的值否則返回左側(cè)表達(dá)式的值。遇到真愛就返回中運算符的運算法則如下返回遇到的第一個真值或者最后一個值。輸出為將表達(dá)式進(jìn)行強制轉(zhuǎn)化為值的運算,運算結(jié)果為或者。 bool值轉(zhuǎn)換 數(shù)據(jù)類型 bool值轉(zhuǎn)化 undefined undefined 轉(zhuǎn)化為 false Object null 轉(zhuǎn)化為false,其他為 true Boole...

    hufeng 評論0 收藏0
  • 溫故js系列(9)-相等==&嚴(yán)格相等===&代碼里的那些判斷

    摘要:業(yè)務(wù)越復(fù)雜,邏輯就越復(fù)雜,判斷就越多比較判斷比較判斷是比較兩個值,返回一個布爾值,表示是否滿足比較條件。對于非布爾值的數(shù)據(jù),取反運算符會自動將其轉(zhuǎn)為布爾值。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:========== JavaScript-判斷 代碼中,多多少少會有判斷語句。業(yè)務(wù)越復(fù)雜,邏輯就越...

    libin19890520 評論0 收藏0
  • 解析JavaScript判斷兩個值相等的方法

      本篇文章主要是講述在JavaScript中判斷兩個值相等,不要認(rèn)為很簡單,要注意的是在JavaScript中存在4種不同的相等邏輯?! CMAScript 是 JavaScript 的語言規(guī)范,在ECMAScript 規(guī)范中存在四種相等算法,如下圖所示:  上圖中每個依次寫下來,很多前端應(yīng)該熟悉嚴(yán)格相等和非嚴(yán)格相等,但對于同值零和同值卻不熟悉,現(xiàn)在就依次下面四種方法?! ⊥怠 ⊥盗恪 》?..

    3403771864 評論0 收藏0
  • JS Q&A

    摘要:系統(tǒng)內(nèi)部會自動調(diào)用函數(shù)。因此除了以下五個值,其他都是自動轉(zhuǎn)為??兆址詣愚D(zhuǎn)換為字符串遇到預(yù)期為字符串的地方,就會將非字符串的值自動轉(zhuǎn)為字符串。字符串的自動轉(zhuǎn)換,主要發(fā)生在字符串的加法運算時。 URL后面#號是代表什么? # 代表頁面中的某個位置,也稱為地址hash值 #XX 作用當(dāng)前可視區(qū)域移動到頁面xx位置 # 僅對瀏覽器起作用,對服務(wù)器無用,所以HTTP請求不包括#(#之后的字...

    URLOS 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<