摘要:剛學了一些的基礎語法,試著用一下。相關文檔基本語法配合基本使用相同點和都是的基本數(shù)據(jù)類型擴展的種基本數(shù)據(jù)類型和都是值擴展的種值空字符串不同點可見代表變量有值,值為空且該值是通過變量賦值獲得的代表聲明了變量,但沒有為其賦值。
剛學了一些 Markdown 的基礎語法,試著用一下。
相關文檔:Markdown基本語法配合基本使用相同點:
null 和 undefined 都是js的基本數(shù)據(jù)類型
擴展:JS的6種基本數(shù)據(jù)類型
Boolean
String
Number
Symbol
Null
undefined
null 和 undefined 都是falsy值
擴展:JS的6種falsy值
0
false
"" (空字符串)
NaN (Not a Number)
undefined
null
不同點:let i = null; console.log(i); // null
let j; console.log(j); // undefined
可見:
null 代表變量有值,值為 空 , 且該值是通過 變量賦值 獲得的;
undefined 代表聲明了變量,但沒有為其賦值。
綜上:
undefined == null; // true undefined !== null; // true
使用 typeof 驗證一下:
typeof undefined; // "undefined" typeof null; // "object" typeof NaN; // "number"
Emm...,有點懵逼,確實驗證了undefined !== null,不過...
null的類型是object?! ( 你不是js的基本數(shù)據(jù)類型嗎? )
NaN的類型是number?! ( 你全稱不是叫 “Not a Number” 嗎? )
事實上就是這么皮,而且你還會發(fā)現(xiàn):
!!NaN === false; // true NaN == false; // false NaN == 0; // false
甚至:
NaN == NaN; // false
NaN的特性就是如此:
NaN是number類型;
NaN不等于任何值;
無效運算時會產(chǎn)生NaN,比如parseInt("abc")
可用isNaN()判斷一個值是否是NaN
!!是個很好用的“運算符”,它的用途是判斷任意值在做if條件判斷時的邏輯值(而非參與邏輯運算時的邏輯值,下文會提到),比如:
!! "" // false "" == false // true !! 0 // false 0 == false // true
但是,千萬不要覺得!!運算結(jié)果為false,== false就成立,比如:
!! undefined; // false undefined == false; // false !! undefined === false; // true !! null; // false null == false; // false !! null === false; // true !! NaN; // false NaN == false; // false !! NaN === false; // true
另一點需要注意的是,它不做為參與邏輯運算時的邏輯值,比如:
!! undefined; // false /* 結(jié)果是undefined,而不是false */ undefined && "a"; // undefined false && "a"; // false
但愿你還沒看蒙。。至于為什么typeof(null) === "object"
Emm。。跑題了,我們接著說 Null vs. Undefined
===(嚴格等于) 和 ==(等于) 分別在何時使用:
我們都知道在做邏輯判斷時,== 會強制轉(zhuǎn)換用于比較的兩個值的類型;而在實際開發(fā)中,以下情況用 == ,其他時候都用 === 即可
if (obj.a == null) { // 這里相當于 obj.a === null || obj.a === undefined; // 這也是jquery源碼中推薦的寫法 }
ES6函數(shù)默認參數(shù)的實現(xiàn):
結(jié)合上文,null 是有值的,且值為 空,可通過賦值賦給變量
let logHi = (param = "hello" ) => { console.log(param); }; /* 默認值生效 */ logHi(); // "hello" /* 賦值調(diào)用 */ logHi("world"); // "world" /* undefined時,默認值生效 */ logHi(undefined); // "hello" /* null作為值,賦值調(diào)用 */ logHi(null); // null /* NaN作為值,賦值調(diào)用 */ logHi(NaN); // NaN
倘若函數(shù)這樣寫:
let consoleHi = (param) => { param = param || "hello"; console.log(param); }; /* 默認值生效 */ consoleHi(); // "hello" /* 賦值調(diào)用 */ consoleHi("world"); // "world" /* undefined時,默認值生效 */ consoleHi(undefined); // "hello" /* null作為值為falsy */ consoleHi(null); // "hello" /* NaN作為值為falsy */ consoleHi(NaN); // "hello"
參考文獻:JavaScript?—?Null vs. Undefined
題外話:不免想起一篇文章,雖然聯(lián)系不大
趣文:編程其實是文科
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/103981.html
摘要:而在這個運算符的相關用例中,往往會涉及到其他知識點,深拷貝和淺拷貝就是其中之一。即對象的淺拷貝會對主對象的值進行拷貝,而該值有可能是一個指針,指向內(nèi)存中的同一個對象。,可以看到深拷貝和淺拷貝是對復制引用類型變量而言的。 在ES6的系列文章中,基本都會提到Spread——擴展運算符(...)。而在這個運算符的相關用例中,往往會涉及到其他知識點,深拷貝和淺拷貝就是其中之一。 背景知識 在討...
摘要:內(nèi)部屬性包含一個函數(shù)被創(chuàng)建的作用域中的對象的集合,此集合被稱為函數(shù)的作用域鏈。當作用域鏈銷毀時,激活對象一同被銷毀。下圖展示了函數(shù)運行期上下文的作用域和閉包由于閉包的屬性包含與運行期上下文作用域鏈相同的對象引用,會產(chǎn)生副作用。 javascript按照數(shù)據(jù)存儲位置的不同可分為以下四類: 直接量(字符串、數(shù)字、布爾型、Object、Array、Function、正則表達式、NULL以...
摘要:此過程中,頁面的解析與用戶的交互都是阻塞的。非阻塞腳本延時腳本可以給標簽添加一個屬性,這個屬性表明元素中的腳本不打算修改,因此代碼可以稍后執(zhí)行。此技術的重點在于無論在何處啟動下載,腳本的下載和運行都不會阻塞頁面的處理過程。 當瀏覽器遇到標簽時,頁面的加載、介些都會停下來,運行此javascript代碼,然后再繼續(xù)加載。這種事情同樣會發(fā)生在那些以src屬性調(diào)用的外部腳本,瀏覽器首先下載外...
JavaScript?—?Null vs. Undefined 初學者往往搞不清楚null和undefined的區(qū)別,本文深入剖析null和undefined的異同。 null是啥? 關于null有兩點需要掌握: null是一個空值 null是被賦值來的 下面是個 Demo, 我們給 a 變量賦值為 null: let a = null; console.log(a); // null ...
摘要:數(shù)據(jù)結(jié)構前言隨著的興起將推向的一個前所未有的高度作為為建立高性能的服務端而創(chuàng)建的運行平臺隨著時間的推移和生態(tài)鏈的完善已經(jīng)不再局部于服務端包括前端后端桌面正如在年提出的任何可以使用來編寫的應用,最終會由編寫雖然人們大多或多或少對筆者的文章有點 數(shù)據(jù)結(jié)構 前言 隨著node的興起, 將javascript推向的一個前所未有的高度, node作為為建立高性能的服務端而創(chuàng)建的js運行平臺隨著時...
閱讀 1491·2019-08-30 15:44
閱讀 1954·2019-08-30 14:07
閱讀 2881·2019-08-30 13:56
閱讀 2350·2019-08-29 17:06
閱讀 1333·2019-08-29 14:13
閱讀 2091·2019-08-29 11:28
閱讀 3238·2019-08-26 13:56
閱讀 1954·2019-08-26 12:11