摘要:原文發(fā)布于我的承接上篇個(gè){{BANNED}}題解析上第題這個(gè)題也還可以這個(gè)題會(huì)讓人誤以為是其實(shí)不是的這個(gè)題等價(jià)于答案是第題這個(gè)題我是猜的我猜的至于為什么我不能信服第題這個(gè)題也挺逗我做對(duì)了答案是你如果換一個(gè)寫法就更費(fèi)解了這個(gè)答案就是為啥呢因?yàn)樵谥卸际呛戏ǖ臄?shù)
原文發(fā)布于我的 github
承接上篇 44個(gè) Javascript {{BANNED}}題解析 (上)
第23題[1 < 2 < 3, 3 < 2 < 1]
這個(gè)題也還可以.
這個(gè)題會(huì)讓人誤以為是 2 > 1 && 2 < 3 其實(shí)不是的.
這個(gè)題等價(jià)于
1 < 2 => true; true < 3 => 1 < 3 => true; 3 < 2 => false; false < 1 => 0 < 1 => true;
答案是 [true, true]
第24題// the most classic wtf 2 == [[[2]]]
這個(gè)題我是猜的. 我猜的 true, 至于為什么.....
both objects get converted to strings and in both cases the resulting string is "2" 我不能信服...
第25題3.toString() 3..toString() 3...toString()
這個(gè)題也挺逗, 我做對(duì)了 :) 答案是 error, "3", error
你如果換一個(gè)寫法就更費(fèi)解了
var a = 3; a.toString()
這個(gè)答案就是 "3";
為啥呢?
因?yàn)樵?js 中 1.1, 1., .1 都是合法的數(shù)字. 那么在解析 3.toString 的時(shí)候這個(gè) . 到底是屬于這個(gè)數(shù)字還是函數(shù)調(diào)用呢? 只能是數(shù)字, 因?yàn)?b>3.合法啊!
第26題(function(){ var x = y = 1; })(); console.log(y); console.log(x);
答案是 1, error
y 被賦值到全局. x 是局部變量. 所以打印 x 的時(shí)候會(huì)報(bào) ReferenceError
第27題var a = /123/, b = /123/; a == b a === b
即使正則的字面量一致, 他們也不相等.
答案 false, false
第28題var a = [1, 2, 3], b = [1, 2, 3], c = [1, 2, 4] a == b a === b a > c a < c
字面量相等的數(shù)組也不相等.
數(shù)組在比較大小的時(shí)候按照字典序比較
答案 false, false, false, true
第29題var a = {}, b = Object.prototype; [a.prototype === b, Object.getPrototypeOf(a) === b]
知識(shí)點(diǎn):
Object/getPrototypeOf
只有 Function 擁有一個(gè) prototype 的屬性. 所以 a.prototype 為 undefined.
而 Object.getPrototypeOf(obj) 返回一個(gè)具體對(duì)象的原型(該對(duì)象的內(nèi)部[[prototype]]值)
答案 false, true
第30題function f() {} var a = f.prototype, b = Object.getPrototypeOf(f); a === b
f.prototype is the object that will become the parent of any objects created with new f while Object.getPrototypeOf returns the parent in the inheritance hierarchy.
f.prototype 是使用使用 new 創(chuàng)建的 f 實(shí)例的原型. 而 Object.getPrototypeOf 是 f 函數(shù)的原型.
請(qǐng)看:
a === Object.getPrototypeOf(new f()) // true b === Function.prototype // true
答案 false
31function foo() { } var oldName = foo.name; foo.name = "bar"; [oldName, foo.name]
答案 ["foo", "foo"]
知識(shí)點(diǎn):
Function/name
因?yàn)?strong>函數(shù)的名字不可變.
第32題"1 2 3".replace(/d/g, parseInt)
知識(shí)點(diǎn):
String/replace#Specifying_a_function_as_a_parameter
str.replace(regexp|substr, newSubStr|function)
如果replace函數(shù)傳入的第二個(gè)參數(shù)是函數(shù), 那么這個(gè)函數(shù)將接受如下參數(shù)
match 首先是匹配的字符串
p1, p2 .... 然后是正則的分組
offset match 匹配的index
string 整個(gè)字符串
由于題目中的正則沒有分組, 所以等價(jià)于問
parseInt("1", 0) parseInt("2", 2) parseInt("3", 4)
答案: 1, NaN, 3
第33題function f() {} var parent = Object.getPrototypeOf(f); f.name // ? parent.name // ? typeof eval(f.name) // ? typeof eval(parent.name) // ?
先說以下答案 "f", "Empty", "function", error 這個(gè)答案并不重要.....
這里第一小問和第三小問很簡(jiǎn)單不解釋了.
第二小問筆者在自己的瀏覽器測(cè)試的時(shí)候是 "", 第四問是 "undefined"
所以應(yīng)該是平臺(tái)相關(guān)的. 這里明白 parent === Function.prototype 就好了.
第34題var lowerCaseOnly = /^[a-z]+$/; [lowerCaseOnly.test(null), lowerCaseOnly.test()]
知識(shí)點(diǎn):
RegExp/test
這里 test 函數(shù)會(huì)將參數(shù)轉(zhuǎn)為字符串. "nul", "undefined" 自然都是全小寫了
答案: true, true
第35題[,,,].join(", ")
[,,,] => [undefined × 3]
因?yàn)閖avascript 在定義數(shù)組的時(shí)候允許最后一個(gè)元素后跟一個(gè),, 所以這是個(gè)長(zhǎng)度為三的稀疏數(shù)組(這是長(zhǎng)度為三, 并沒有 0, 1, 2三個(gè)屬性哦)
答案: ", , "
第36題var a = {class: "Animal", name: "Fido"}; a.class
這個(gè)題比較流氓.. 因?yàn)槭菫g覽器相關(guān), class是個(gè)保留字(現(xiàn)在是個(gè)關(guān)鍵字了)
所以答案不重要, 重要的是自己在取屬性名稱的時(shí)候盡量避免保留字. 如果使用的話請(qǐng)加引號(hào) a["class"]
第37題var a = new Date("epoch")
知識(shí)點(diǎn):
Date
Date/parse
簡(jiǎn)單來說, 如果調(diào)用 Date 的構(gòu)造函數(shù)傳入一個(gè)字符串的話需要符合規(guī)范, 即滿足 Date.parse 的條件.
另外需要注意的是 如果格式錯(cuò)誤 構(gòu)造函數(shù)返回的仍是一個(gè)Date 的實(shí)例 Invalid Date.
答案 Invalid Date
第38題var a = Function.length, b = new Function().length a === b
我們知道一個(gè)function(Function 的實(shí)例)的 length 屬性就是函數(shù)簽名的參數(shù)個(gè)數(shù), 所以 b.length == 0.
另外 Function.length 定義為1......
所以不相等.......答案 false
第39題var a = Date(0); var b = new Date(0); var c = new Date(); [a === b, b === c, a === c]
還是關(guān)于Date 的題, 需要注意的是
如果不傳參數(shù)等價(jià)于當(dāng)前時(shí)間.
如果是函數(shù)調(diào)用 返回一個(gè)字符串.
答案 false, false, false
第40題var min = Math.min(), max = Math.max() min < max
知識(shí)點(diǎn):
Math/min
Math/max
有趣的是, Math.min 不傳參數(shù)返回 Infinity, Math.max 不傳參數(shù)返回 -Infinity ?
答案: false
第41題function captureOne(re, str) { var match = re.exec(str); return match && match[1]; } var numRe = /num=(d+)/ig, wordRe = /word=(w+)/i, a1 = captureOne(numRe, "num=1"), a2 = captureOne(wordRe, "word=1"), a3 = captureOne(numRe, "NUM=2"), a4 = captureOne(wordRe, "WORD=2"); [a1 === a2, a3 === a4]
知識(shí)點(diǎn):
RegExp/exec
通俗的講
因?yàn)榈谝粋€(gè)正則有一個(gè) g 選項(xiàng) 它會(huì)‘記憶’他所匹配的內(nèi)容, 等匹配后他會(huì)從上次匹配的索引繼續(xù), 而第二個(gè)正則不會(huì)
舉個(gè)例子
var myRe = /ab*/g; var str = "abbcdefabh"; var myArray; while ((myArray = myRe.exec(str)) !== null) { var msg = "Found " + myArray[0] + ". "; msg += "Next match starts at " + myRe.lastIndex; console.log(msg); } // Found abb. Next match starts at 3 // Found ab. Next match starts at 9
所以 a1 = "1"; a2 = "1"; a3 = null; a4 = "2"
答案 [true, false]
第42題var a = new Date("2014-03-19"), b = new Date(2014, 03, 19); [a.getDay() === b.getDay(), a.getMonth() === b.getMonth()]
這個(gè)....
JavaScript inherits 40 years old design from C: days are 1-indexed in C"s struct tm, but months are 0 indexed. In addition to that, getDay returns the 0-indexed day of the week, to get the 1-indexed day of the month you have to use getDate, which doesn"t return a Date object.
a.getDay() 3 b.getDay() 6 a.getMonth() 2 b.getMonth() 3
都是套路!
第43題if ("http://giftwrapped.com/picture.jpg".match(".gif")) { "a gif file" } else { "not a gif file" }
知識(shí)點(diǎn):
String/match
String.prototype.match 接受一個(gè)正則, 如果不是, 按照 new RegExp(obj) 轉(zhuǎn)化. 所以 . 并不會(huì)轉(zhuǎn)義
那么 /gif 就匹配了 /.gif/
答案: "a gif file"
第44題function foo(a) { var a; return a; } function bar(a) { var a = "bye"; return a; } [foo("hello"), bar("hello")]
在兩個(gè)函數(shù)里, a作為參數(shù)其實(shí)已經(jīng)聲明了, 所以 var a; var a = "bye" 其實(shí)就是 a; a ="bye"
所以答案 "hello", "bye"
全部結(jié)束!
==================
總結(jié)由于筆者水平有限, 如果解釋有誤, 還望指出 ?
通過整理, 筆者發(fā)現(xiàn)絕大部分題目都是因?yàn)樽约簩?duì)于基礎(chǔ)知識(shí)或者說某個(gè) API 的參數(shù)理解偏差才做錯(cuò)的.
筆者的重災(zāi)區(qū)在原型那一塊, 所以這次被虐和整理還是很有意義呀.
筆者相信 堅(jiān)實(shí)的基礎(chǔ)是深入編程的前提. 所以基礎(chǔ)書還是要常看啊 ?
最后這些{{BANNED}}題現(xiàn)在看看還{{BANNED}}嘛?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86340.html
摘要:變量提升是將聲明移至作用域全局域或者當(dāng)前函數(shù)作用域頂部的行為。 原文來自我的 github 原題來自: javascript-puzzlers 44個(gè) Javascript 變態(tài)題解析 (下) 讀者可以先去做一下感受感受. 當(dāng)初筆者的成績(jī)是 21/44... 當(dāng)初筆者做這套題的時(shí)候不僅懷疑智商, 連人生都開始懷疑了.... 不過, 對(duì)于基礎(chǔ)知識(shí)的理解是深入編程的前提. 讓我們一起來看看...
摘要:第題知識(shí)點(diǎn)首先接受兩個(gè)參數(shù)一個(gè)回調(diào)函數(shù)一個(gè)回調(diào)函數(shù)的值其中回調(diào)函數(shù)接受三個(gè)參數(shù)而題目中只傳入了回調(diào)函數(shù)其次只接受兩個(gè)兩個(gè)參數(shù)基數(shù)可選。 第1題 [1, 2, 3].map(parseInt) 知識(shí)點(diǎn): Array/map Number/parseInt JavaScript parseInt 首先, map接受兩個(gè)參數(shù), 一個(gè)回調(diào)函數(shù) callback, 一個(gè)回調(diào)函數(shù)的this值 ...
摘要:與面向?qū)ο缶幊塘蠓较蛑阃黄魄岸松钠脚_(tái)期前端掘金無論我們從事何種職業(yè),在職業(yè)生涯的某個(gè)階段,都或多或少會(huì)遇到所謂的平臺(tái)期。目前為止,已經(jīng)有個(gè)用戶通過認(rèn)證登觀點(diǎn)年前端初學(xué)者的生存指南前端掘金逝者如斯夫,不舍晝夜。 你可能聽說過函數(shù)式編程(Functional programming),甚至已經(jīng)使用了一段時(shí)間。 但是,你能說清楚,它到底是什么嗎? 網(wǎng)上搜索一下,你會(huì)輕松找到好多答案...
摘要:詳解十大常用設(shè)計(jì)模式力薦深度好文深入理解大設(shè)計(jì)模式收集各種疑難雜癥的問題集錦關(guān)于,工作和學(xué)習(xí)過程中遇到過許多問題,也解答過許多別人的問題。介紹了的內(nèi)存管理。 延遲加載 (Lazyload) 三種實(shí)現(xiàn)方式 延遲加載也稱為惰性加載,即在長(zhǎng)網(wǎng)頁中延遲加載圖像。用戶滾動(dòng)到它們之前,視口外的圖像不會(huì)加載。本文詳細(xì)介紹了三種延遲加載的實(shí)現(xiàn)方式。 詳解 Javascript十大常用設(shè)計(jì)模式 力薦~ ...
摘要:第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題第題屬性是中可表示的最小的數(shù)接近,但不是負(fù)數(shù)。 第1題 [1,2,3].map(parseInt); 第2題 [typeof null,null instanceOf Object] 第3題 [[3,2,1].reduce(Math.pow),[].reduce(Math.pow)] 第4題 var v...
閱讀 671·2023-04-25 18:59
閱讀 1211·2021-09-22 16:00
閱讀 1889·2021-09-22 15:42
閱讀 3594·2021-09-22 15:27
閱讀 1246·2019-08-30 15:54
閱讀 1104·2019-08-30 11:16
閱讀 2445·2019-08-29 16:24
閱讀 820·2019-08-29 12:14