您真的了解javaScript?(1)
前几天发现了这个javaScript题目。一向缺乏自信的我,决定通过做题来树立信心,我其实没辣么菜对不对。
那么,点击下面链接,来测测您的javaScript水平吧。
JavaScript Puzzlers!
陷阱多多,惊喜满满~~
1.
["1", "2", "3"].map(parseInt)
what you actually get is
[1, NaN, NaN]
becauseparseInt
takes two parameters (val, radix) andmap
passes 3 (element, index, array)
嗯,map()里面的回调函数接收3个参数:当前元素的值,可选的当前元素的索引值和当期元素属于的数组对象。
所以实际运行过程是这样:
parseInt('1', 0) // 1 parseInt('2', 1) // NaN parseInt('3', 2) // NaN
怎么样,意不意外,惊不惊喜?
2.
[typeof null, null instanceof Object] //["object", false]
//typeof
will always return "object" for native non callable objects.
3.
[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ] //error
拆开来看。
[3,2,1].reduce(Math.pow) //9
[].reduce(Math.pow) // Uncaught TypeError: Reduce of empty array with no initial value
reduce on an empty array without an initial value throws TypeError. 没有初始值的空数组,reduce()方法抛出类型异常
4.
var val = 'smtg'; console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');
这又是一个坑。+号比三元运算的优先级高。所以实际上是
if('Value is ' + (val === 'smtg')){ console.log('something'); }else{ console.log('nothing'); }
5.
var name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
输出结果是:Goodbye Jack
在函数体内,同名的局部变量或者参数的优先级会高于全局变量。JavaScript函数里的所有声明(只是声明,但不涉及赋值)都被提前到函数体的顶部,而变量赋值操作留在原来的位置。
所以变量提升后的代码实际上是这样的:
var name = 'World!'; (function () { var name ; if (typeof name === 'undefined') { name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
6.
var END = Math.pow(2, 53); var START = END - 100; var count = 0; for (var i = START; i <= END; i++) { count++; } console.log(count);
这个钩也太直了吧~~2的53次方不就是JS最大数嘛。
来看下精确的最大整数:
The JavaScript number format allows you to exactly represent all integers between
−9007199254740992 and 9007199254740992 (即正负2的53次方)
再打印下:Math.pow(2, 53)
得出:9007199254740992
这不让它陷入死循环了嘛~2^53+1还是2^53。
6.(这道题是我踩的第一个坑)
var ary = [0,1,2]; ary[10] = 10; ary.filter(function(x) { return x === undefined;});
我以为会返回undefined*7。然而实际上是返回一个空数组[]。
因为ary的[0, 1, 2, undefined × 7, 10],并不是[0, 1, 2, undefined, undefined,undefined,...10]实际上是[0, 1, 2, ,,,,,,,10]。而filter()函数不会对空数组进行检测。
7.
var two = 0.2 var one = 0.1 var eight = 0.8 var six = 0.6 [two - one == one, eight - six == two]
这个简单,输出结果是[true, false]
计算机只认识0和1,所以并不能精确计算,虽然有时候它也能得出正确的结果。
所以一般情况下,要判断两个浮点数是否相等,推荐使用无限逼近的方式:
if(fabs(a-b) < 1E-10) ;//we think a is equals to b.
8.
function showCase(value) { switch(value) { case 'A': console.log('Case A'); break; case 'B': console.log('Case B'); break; case undefined: console.log('undefined'); break; default: console.log('Do not know!'); } } showCase(new String('A'));
这题的关键点其实就在于:new String('A'),它返回的并不是一个字符串A,而是一个对象,属于引用类型存储。(javascript中有值和引用两种存储方式)
在控制台打印下看看。
而String('A')则返回一个字符串。这道题,如果把new去掉,
showCase(String('A'));
那么就相当于showCase('A'), 返回的就是 CASE A。
9.
function isOdd(num) { return num % 2 == 1; } function isEven(num) { return num % 2 == 0; } function isSane(num) { return isEven(num) || isOdd(num); } var values = [7, 4, '13', -9, Infinity]; values.map(isSane);
这题考的是各种运算符,-9 % 2,得 -1,所以false。 无穷大 Infinity % 2,结果是 NaN。
10.
parseInt(3, 8) parseInt(3, 2) parseInt(3, 0)
parseInt(string, radix) 函数可解析一个字符串,并返回一个整数。第二个参数radix表示要解析的数字的基数,介于 2~36 之间。如果radix省略或者值为0,parseInt()根据string来判断基数。
3并不在基数2里,所以会返回一个 NaN。