原题来自: javascript-puzzlers
读者可以先去做一下感受感受. 当初笔者的成绩是 21/44…
当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了….
不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧!
第1题
1 |
["1", "2", "3"].map(parseInt) |
知识点:
首先, map接受两个参数, 一个回调函数 callback, 一个回调函数的this值
其中回调函数接受三个参数 currentValue, index, arrary;
而题目中, map只传入了回调函数–parseInt.
其次, parseInt 只接受两个两个参数 string, radix(基数).
可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
所以本题即问
1 2 3 |
parseInt('1', 0); parseInt('2', 1); parseInt('3', 2); |
首先后两者参数不合法.
所以答案是 [1, NaN, NaN]
第2题
1 |
[typeof null, null instanceof Object] |
两个知识点:
typeof 返回一个表示类型的字符串.
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上.
这个题可以直接看链接… 因为 typeof null === 'object'
自语言之初就是这样….
typeof 的结果请看下表:
1 2 3 4 5 6 7 8 9 10 |
type result Undefined "undefined" Null "object" Boolean "boolean" Number "number" String "string" Symbol "symbol" Host object Implementation-dependent Function "function" Object "object" |
所以答案 [object, false]
第3题
1 |
[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ] |
知识点:
arr.reduce(callback[, initialValue])
reduce接受两个参数, 一个回调, 一个初始值.
回调函数接受四个参数 previousValue, currentValue, currentIndex, array
需要注意的是 If the array is empty and no initialValue was provided, TypeError would be thrown.
所以第二个表达式会报异常. 第一个表达式等价于 Math.pow(3, 2) => 9; Math.pow(9, 1) =>9
答案 an error
第4题
1 2 |
var val = 'smtg'; console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing'); |
两个知识点:
简而言之 +
的优先级 大于 ?
所以原题等价于 'Value is true' ? 'Somthing' : 'Nonthing'
而不是 'Value is' + (true ? 'Something' : 'Nonthing')
答案 'Something'
第5题
1 2 3 4 5 6 7 8 9 |
var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(); |
这个相对简单, 一个知识点:
在 JavaScript中, functions 和 variables 会被提升。变量提升是JavaScript将声明移至作用域 scope (全局域或者当前函数作用域) 顶部的行为。
这个题目相当于
当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了….
不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧!
第1题
1 |
["1", "2", "3"].map(parseInt) |
知识点:
首先, map接受两个参数, 一个回调函数 callback, 一个回调函数的this值
其中回调函数接受三个参数 currentValue, index, arrary;
而题目中, map只传入了回调函数–parseInt.
其次, parseInt 只接受两个两个参数 string, radix(基数).
可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
所以本题即问
1 2 3 |
parseInt('1', 0); parseInt('2', 1); parseInt('3', 2); |
首先后两者参数不合法.
所以答案是 [1, NaN, NaN]
第2题
1 |
[typeof null, null instanceof Object] |
两个知识点:
typeof 返回一个表示类型的字符串.
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上.
这个题可以直接看链接… 因为 typeof null === 'object'
自语言之初就是这样….
typeof 的结果请看下表:
1 2 3 4 5 6 7 8 9 10 |
type result Undefined "undefined" Null "object" Boolean "boolean" Number "number" String "string" Symbol "symbol" Host object Implementation-dependent Function "function" Object "object" |
所以答案 [object, false]
第3题
1 |
[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ] |
知识点:
arr.reduce(callback[, initialValue])
reduce接受两个参数, 一个回调, 一个初始值.
回调函数接受四个参数 previousValue, currentValue, currentIndex, array
需要注意的是 If the array is empty and no initialValue was provided, TypeError would be thrown.
所以第二个表达式会报异常. 第一个表达式等价于 Math.pow(3, 2) => 9; Math.pow(9, 1) =>9
答案 an error
第4题
1 2 |
var val = 'smtg'; console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing'); |
两个知识点:
简而言之 +
的优先级 大于 ?
所以原题等价于 'Value is true' ? 'Somthing' : 'Nonthing'
而不是 'Value is' + (true ? 'Something' : 'Nonthing')
答案 'Something'
第5题
1 2 3 4 5 6 7 8 9 |
var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(); |
这个相对简单, 一个知识点:
在 JavaScript中, functions 和 variables 会被提升。变量提升是JavaScript将声明移至作用域 scope (全局域或者当前函数作用域) 顶部的行为。
这个题目相当于