摘要:無關緊要的開頭作為一個年輕的前端從業者,近期趾高氣昂的去各種面試,抱著找虐心態去單挑的結果就是被各種面試題晃斷腳踝并被射,然后開始質問自己對的掌握為何如此淺薄,為何當初不好好學世界上最好的語言。
/*===無關緊要的開頭start===*/
作為一個年輕的前端從業者,近期趾高氣昂的去各種面試,抱著找虐心態去單挑的結果就是被各種面試題晃斷腳踝并被yan射,然后開始質問自己對js的掌握為何如此淺薄,為何當初不好好學世界上最好的語言php。
當然,這不僅提醒了我得背背面試題,還要時刻謹記,要寫安全規范的javascript代碼
然后小總結了一下那天面試上來的就被隔扣的第一題。
/*===無關緊要的開頭end===*/
null === undefined; // false null == undefined; // true null === 0; // false null == 0; // false false === 0; // false false == 0; // true true === 1; // false true == 1; // true true == "1"; // true true == 2; // false undefined === 0; // false undefined == 0; // false NaN === NaN; // false NaN == NaN; // false !NaN == !NaN; // false !NaN; // true null == NaN; // false !null == !NaN; // true !null === !NaN; // true if(!NaN) console.log("媽呀,這都是啥啊"); // "媽呀,這都是啥啊" false || 0; // 0 !(false || 0) // true true && 1; // 1 true && 2; // 2 !(true && 2) // false !(false || 2) // false let a = 123; let b = new Number(123); a === b; // false a == b; // true let a = document.getElementsByTagName("a"); let b = document.getElementsByTagName("a"); a === b; //true let c = document.querySelectorAll("a"); let d = document.querySelectorAll("a"); c === d; //false /*待續。。。*/解答
答案在問題里邊,真是皮得很...
其實這些是我根據當時的面試題整理和擴充的,有些代碼中真的是碰不上,但是順手都寫上了。其實有些經驗的開發者都會知道這些,小的不才在這再說那么一小下。
還有一些ES6中的set和map和symbol等后期會寫到另一篇上。
正經解答這道題中涉及到強等、弱等、js中基礎類型轉換、懸疑NaN、null和undefined、選擇器等
js中的弱類型造福了人類,到處都是它貼心的幫你各種轉換,讓我們的代碼在瀏覽器上、在webview上、在node里、在各種模擬器里、在喜馬拉雅山上、在尼斯湖里、在握不緊的指尖上、在人生的光輝歲月里跑的流暢且難以預料。
所以:如何安全的寫js,其實真的很重要(忘了這是誰說的了)。
以下只是我的一些理解,歡迎指正?
1. === 和 == 和類型轉換雖然看了一個很棒的總結(https://www.cnblogs.com/nelso...)
但是自己的想法還是要講:
‘===’:
(1) 如果是基礎類型進行比較,第一件事兒就是比較一下兩邊的數據類型,如果不一樣,直接false
(2) 如果兩個數據類型(這里指的還是基礎類型)一樣,那接下來就是直接的“值”的比較了
(3) 如果是引用類型的變量或者是內置函數構造出的變量進行比較,那么就是指針的比較了
(4) null和undefined,再強等面前,只和自己相等。
‘==’:
(1) 如果是基礎類型進行比較,類型一樣沒得說,類型不一樣,第一件事就是轉一下,字符串轉數字再進行值的比較,boolean類型轉為數字
這里稍微總結了一下,可以頑固的認為 == 都是再比較數字,所有的都轉換為數字,然后進行“值”的比較了(不知道接下來這么理解是好還是壞) 舉個例子:"123" == 123 // true 其實就是 new Number("123") == 123,兩邊值一樣,那就是true,不一樣就是false; 再舉個例子: true == 1; //true true == "1" // true true == 2; // false false == 0 // true false == -1 // false 拿true == "1"來說 這樣就是 new Number(true) == new Number("1") 其實還是兩個為1的‘值’去比較 (new Number(true)返回一個 Number {1},new Number(false)返回一個 Number {0})
(2)如果是引用類型的變量或者是內置函數構造出的變量 和 基礎數據類型 去比較,那就是這些變量的值拿出來去比較,例如 "123asd" == new String("123ads") 返回true
(3)如果是引用類型的變量或者是內置函數構造出的變量 相互比較,那還是指針的比較
2. NaNNaN,感覺其實就是一個為了避免非數字的數字操作引起程序報錯而設計的一個表示‘Not a Number’的存在,網上有好多好多介紹它的文字
NaN等于誰因為討論的強等和弱等,那在這只說一點:NaN和誰都不等,不管什么等
所以
———— NaN === NaN 是false
———— NaN==NaN也是false
———— new Number(NaN) == new Number(NaN)也是 false
很難理解為什么是這樣,覺得是一個bug,其實我自己感覺這樣是對的,因為它就是‘單純的表示’這不是一個數字,并沒有說是什么,such as:
NaN + 1; // NaN 那么一個數加一還是自己,那自己本來就不應該等于自己。。。 let a = 12/0 //a是NaN let b = 13/0 //b是NaN,但是很簡單看出a本來就不應該等于b(雖然再高數上它們是相等的) let raptors = 81/"Kobe" //raptors也是NaN,raptors本來就不該等于a或者b
所以任何和NaN去比較的話,那都是“不等”!
NaN的判斷那么,該如何判斷是不是NaN呢
不賣關子了,我就是來說 isNaN 和 Number.isNaN
大家都知道isNaN======>
isNaN不是看上去那個意思,不是判斷“是一個NaN”,而是判斷“不是一個數字類型的值”,isNaN看上去就是幫你在內部把傳入的值進行了一次 new Number(param)的操作,然后new Number(param)返回NaN那就判斷為true,但是字符串等類型就沒有辦法判斷,如下:
isNaN(NaN); // 是個true isNaN(NaN+1); // 當然還是個true isNaN(123); //當然false isNaN("123"); // 幫你轉了個類型,就是內部執行了一下isNaN(new Number("123")),所以還是false isNaN("Curry"); //返回true,內部執行了一下(new Number("Curry")返回了NaN
第五行的字符串,竟然被判定為NaN,實際上它的確不是一個數字,但是它的的確確不是我們需要判斷的是一個NaN,所以這個方法只是用來判斷“不是一個數字類型的值”
然后大家還知道Number.isNaN======>
es6來補漏了,Number.isNaN的出現解決了大家希望判斷“是一個NaN”的操作。如下
Number.isNaN("Curry"); //返回false
NaN結束了
3. getElement* 和 querySelector*在問題中有這樣一個東西:
let a = document.getElementsByTagName("a"); let b = document.getElementsByTagName("a"); a === b; // true let c = document.querySelectorAll("a"); let d = document.querySelectorAll("a"); c === d; //false
這衍生出來的:getElementsByTagName查出來是什么?querySelectorAll查出來的又是什么?
MDN上告訴我們:
———— getElementsByTagName查出來的是HTMLCollection,HTMLCollection是一個動態的dom節點集合,綁定在document的live上,隨著document變化隨時更新,指向每一個符合選擇要求的dom節點,這既是為什么上邊例子中 a===b 為 true 的原因了
———— querySelectorAll查出來的是NodeList,是一個單純的選擇器選出的dom節點集合,這就是為什么上邊例子中 c===d 為 false 了
HTMLCollection和NodeList都是只讀的。jQuery也是使用的querySelectorAll,所以jQuery選擇器選擇出來也是對NodeList進行操作,所以:
var a = $("a"); var b = $("a"); a === b; // false
所以,事件委托真偉大...
總結其實由NaN、選擇器、===和==、基本數據類型轉換、內置函數構造出的對象結合進數組中,去判斷數組值相等,去去重、去求交并補等操作,并結合set和map,都有很多討論的話題,希望下次能分享給大家
感謝各位的閱讀,這些只是我自己的一些理解和想法,希望不正確的地方各位能夠幫忙指正。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94465.html
摘要:前言新增了兩種基本的原生數據集合和加上和現在共有四種,以及由兩者衍生出的弱引用集合和。其本身是生成實例數據集合的構造函數,可以接受一個數組或具有接口的數據結構作為參數用來初始化。返回鍵值對的遍歷器對象,鍵值對為鍵名鍵值。 前言 ES6新增了兩種基本的原生數據集合:Set和Map(加上Array和Object現在共有四種),以及由兩者衍生出的弱引用集合:WeakSet和WeakMap。從...
摘要:引用數據類型引用數據類型值指保存在堆內存中的對象。訪問方式是按引用訪問。數據類型檢測操作符是檢測基本類型的最佳工具。未定義布爾值字符串數值對象或函數用于檢測引用類型,可以檢測到它是什么類型的實例。 前端學習:教程&開發模塊化/規范化/工程化/優化&工具/調試&值得關注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:數據類型 回味,無窮! 數據類型定義 數據類型分類 基本數據...
摘要:作為一個菜雞的我而言,在之前講到過那么多的鏈式查找機制,比如說原型鏈,作用域鏈等等,想當然的把這個機制帶入到了指向上邊,結果就是這個指向指的我萬臉懵逼標題換字了,擔心被河蟹在經過漫長的通俗易懂的規范閱讀之后,分享一下我所認知的指向簡而言之, 作為一個js菜雞的我而言,在之前講到過那么多的js鏈式查找機制,比如說原型鏈,作用域鏈等等,想當然的把這個機制帶入到了this指向上邊,結果就是這...
摘要:中的強制轉換規則面試官中強制類型轉換是一個非常易出現的點,知道強制轉換時候的規則嗎注規則最好配合下面什么時候發生轉換使用這些規則看效果更佳。調用方法用來把對象轉換成原始類型的值數值字符串和布爾值。 前言 showImg(https://segmentfault.com/img/bVbu4Fb?w=940&h=400);之前面試了幾個開發者,他們確實做過不少項目,能力也是不錯的,但是發現...
閱讀 2835·2023-04-25 17:59
閱讀 675·2023-04-25 15:05
閱讀 669·2021-11-25 09:43
閱讀 3026·2021-10-12 10:13
閱讀 3532·2021-09-27 13:59
閱讀 3577·2021-09-23 11:21
閱讀 3872·2021-09-08 09:35
閱讀 561·2019-08-29 17:12