摘要:作為前端開發(fā)必須掌握的一門語言,因?yàn)檎Z言的靈活性,有些知識點(diǎn)看起來簡單,在真正遇到的時候,卻不一定會直接做出來,今天我們就一起來看看幾道題目吧題目這道題考察的知識點(diǎn)是運(yùn)算符的優(yōu)先級。
Javascript作為前端開發(fā)必須掌握的一門語言,因?yàn)檎Z言的靈活性,有些知識點(diǎn)看起來簡單,在真正遇到的時候,卻不一定會直接做出來,今天我們就一起來看看幾道題目吧
題目1
var val = "smtg"; console.log(" Value is" + (val === "smtg") ? "Something" : "Nothing");
這道題考察的知識點(diǎn)是運(yùn)算符的優(yōu)先級。
首先,小括號的優(yōu)先級是最高的,所以首先會做判斷,val與smtg相等返回true。因此最后這道題等價(jià)于判斷是執(zhí)行下面的語句1還是語句2.
//語句1
"Value is" + (true ? "Something" : "Nothing");
//語句2
"Value is true" ? "Something" : "Nothing";
根據(jù)運(yùn)算符優(yōu)先級我們知道,連接元算符+的優(yōu)先級要高于條件運(yùn)算符?的優(yōu)先級,因此實(shí)際執(zhí)行的是語句2,所以最后返回的結(jié)果是
"Something".
題目2
我們再來看看下面這道題。
var ary = [0,1,2]; ary[6] = 6; var result = ary.filter(function(x){ return x === undefined; }); console.log(result);
這道題考察的時候數(shù)組的初始化和filter方法。
第一眼看上去,以為會輸出[undefined,undefined,undefined],但是實(shí)際輸出卻是undefined,為什么會這樣?
這是因?yàn)樵贘avaScript里存在稀疏數(shù)組的概念,數(shù)組在初始化時,只會對已經(jīng)確定索引的選項(xiàng)進(jìn)行初始化,對于不存在索引的選項(xiàng)不進(jìn)行初始化,通過以下代碼可以確定。
0 in ary;//true 1 in ary;//true 3 in ary;//false 4 in ary;//false 6 in ary;//true
對數(shù)組使用in運(yùn)算符時,是通過枚舉數(shù)組的索引,通過3和4返回false可以知道,ary[3]和ary[4]實(shí)際是不存在的,未進(jìn)行初始化。
我們再來看看 Array.prototype.filter方法和polyfill,注意代碼中標(biāo)注的地方。
Array.prototype.filter = function(fun /*thisArg*/){ if(this === void 0 || this === null){ throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; if(typeof fun !== "function"){ throw new TypeError(); } var res = []; var thisArg = arguments.length >=2 ? arguments[1]:void 0; for(var i = 0;i在filter方法源碼中,我發(fā)現(xiàn)使用了in運(yùn)算符,而arg數(shù)組沒有對索引為3,4,5的值進(jìn)行初始化,因此會直接跳過執(zhí)行,所以最后返回undefined。
題3
function caseshow(val){ switch(val){ switch(value){ case "A": console.log("A"); break; case "B": console.log("B"); break; case "C": console.log("C"); break; default: console.log("do not know!"); } } } caseshow(new String("A"));咋一看,很多人會以為輸出"case A",但實(shí)際輸出"do not know"。why? 這道題考察的知識點(diǎn)是:switch和string,我們需要知道一下兩點(diǎn):
1,JavaScript中switch執(zhí)行的是嚴(yán)格相等(===)。 2,字符串和string的實(shí)例不一樣。
第二點(diǎn)我們可以測試下。
var s_p = "foo"; var s_o = new String(s_p) console.log(typeof s_p) //"string" console.log(typeof s_o) //"object" console.log(s_p === s_o) //"false"因此針對題目中的"A"與String("A")并不嚴(yán)格相等,最終會返回‘do not know’
題4 針對上面的題目3,我們稍作一點(diǎn)改動,成為下面的題目4,再看看結(jié)果輸出什么?
function caseshow2(val){ switch(val){ case "A": console.log("A"); break; case "B": console.log("B"); break; case undefined: console.log("undefined"); break; default: console.log("do not know!"); } } caseshow2(String("A"));題目4相對于題目3,只是在最后調(diào)用的時候傳入的參數(shù)是String("A"),它的結(jié)果就變成了"Case A"。這是為什么呢?
其實(shí)很簡單,String(X)返回的是一個字符串而不會生成一個新的String實(shí)例,因此與"A"是嚴(yán)格相等的
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/93688.html
摘要:第一遞歸函數(shù)功能假設(shè)的功能是求第項(xiàng)的值,代碼如下找出遞歸結(jié)束的條件顯然,當(dāng)或者我們可以輕易著知道結(jié)果。定義遞歸函數(shù)功能假設(shè)函數(shù)的功能是反轉(zhuǎn)但鏈表,其中表示鏈表的頭節(jié)點(diǎn)。可能很多人在大一的時候,就已經(jīng)接觸了遞歸了,不過,我敢保證很多人初學(xué)者剛開始接觸遞歸的時候,是一臉懵逼的,我當(dāng)初也是,給我的感覺就是,遞歸太神奇了! 可能也有一大部分人知道遞歸,也能看的懂遞歸,但在實(shí)際做題過程中,卻不知道怎么...
摘要:為什么要有不可變數(shù)據(jù)首先,不可變數(shù)據(jù)類型是源于函數(shù)式編程中的,是一條必備的準(zhǔn)則。另外在中的廣泛應(yīng)用,也讓函數(shù)式編程火熱,而函數(shù)式編程最重要的原則之一就是不可變數(shù)據(jù),所以你在使用的時候,改變必須返回新的。 不可變數(shù)據(jù) 引入 我是通過使用 React 才去關(guān)注 immutable data 這個概念的。事實(shí)上,你去搜 immutable 的 JS 相關(guān)文章,也基本都是近兩年的,大概是隨著 ...
摘要:中幾個最重要的大知識點(diǎn)面向?qū)ο笫录惒浇换ッ嫦驅(qū)ο笤谥锌梢园讶我獾囊煤妥兞慷伎闯墒且粋€對象。我們可以寫一個通用方法來模擬面向?qū)ο笳Z言的多態(tài) JavaScript中幾個最重要的大知識點(diǎn) 面向?qū)ο?DOM事件 異步交互ajax 面向?qū)ο?在JS中可以把任意的引用和變量都看成是一個對象。面向?qū)ο蟮闹饕齻€表現(xiàn)形式: 封裝 繼承 多態(tài) 1. 封裝 1.1 單例模式 var obj={...
摘要:使用來移除事件,參數(shù)必須與要移除的事件處理函數(shù)地址指針相同。在低版本瀏覽器中,綁定級事件的方法為中的級事件的事件處理程序都是在冒泡階段執(zhí)行的。 JavaScript中幾個最重要的大知識點(diǎn) 面向?qū)ο?DOM事件 異步交互ajax 事件 事件就是文檔和瀏覽器的瞬間交互行為 1.事件類型 點(diǎn)擊: click 滾輪: scroll 滑動: move 進(jìn)入: enter 加載: load ...
閱讀 955·2021-11-17 09:33
閱讀 415·2019-08-30 11:16
閱讀 2468·2019-08-29 16:05
閱讀 3351·2019-08-29 15:28
閱讀 1393·2019-08-29 11:29
閱讀 1947·2019-08-26 13:51
閱讀 3385·2019-08-26 11:55
閱讀 1203·2019-08-26 11:31