您真的了解javaScript?(1)

前几天发现了这个javaScript题目。一向缺乏自信的我,决定通过做题来树立信心,我其实没辣么菜对不对。

那么,点击下面链接,来测测您的javaScript水平吧。

JavaScript Puzzlers!

陷阱多多,惊喜满满~~

1. 

["1", "2", "3"].map(parseInt)

what you actually get is [1, NaN, NaN] because parseInt takes two parameters (val, radix) and map 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 (即正负253次方)

再打印下: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。

posted @ 2017-04-20 17:09  kiera  阅读(251)  评论(0编辑  收藏  举报