• 您真的了解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。

  • 相关阅读:
    lumen生成key
    github发布版本
    如何使用.gitignore文件删除掉已经提交的文件
    vue中计算属性和侦听属性
    Mac命令行指定特定程序打开文件
    MacOS中创建Sublime Text3快捷方式返回Operation not permitted的原因及解决
    Mac 下 visual studio code 编辑器 设置为中文
    Unix/Linux环境C编程入门教程(14) Mandriva LinuxCCPP开发环境搭建
    Unix/Linux环境C编程入门教程(13) 开发环境搭建VMware软件安装
    Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
  • 原文地址:https://www.cnblogs.com/dodocie/p/6739775.html
Copyright © 2020-2023  润新知