• 基础部分


    1、

       console.log(["1", "2", "3"].map(parseInt));
       //答案
       //[1, NaN, NaN]

    parseInt(string, radix)函数可解析一个字符串,并返回一个整数。
    当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

    举例:
    如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。
    如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。
    如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

    如果想让 parseInt(string, radix) 返回 NaN,有两种情况:
    1>第一个参数不能转换成数字。
    2>第二个参数不在 2 到 36 之间。

    我们重新定义 parseInt(string,radix) 函数来观察参数的个数导致输出的结果:(这一段属于他人想法)
    1>当给parseInt传2个参数的时候:

    var parseInt = function (string, radix) {
    return string + "-" + radix;
    };
    ["1", "2", "3"].map(parseInt);

    输出结果为:

    ["1-0", "2-1", "3-2"]

    2 > 当给parseInt传3个参数的时候:

    var parseInt = function (string, radix, obj) {
    return string + "-" + radix + "-" + obj;
    };
    ["1", "2", "3"].map(parseInt);

    输出结果:

    ["1-0-1,2,3", "2-1-1,2,3", "3-2-1,2,3"]

    3 > 当给parseInt传4个参数的时候:

    var parseInt = function (string, radix, obj, other) {
    return string + "-" + radix + "-" + obj + "-" + other;
    };
    ["1", "2", "3"].map(parseInt);

    结果:

    ["1-0-1,2,3-undefined", "2-1-1,2,3-undefined", "3-2-1,2,3-undefined"]
    map给parseInt传递了三个值:数组每一项,数组每一项的索引,数组本身;在这个题目里相当于每循环一次就执行一次parseInt,
    parseInt(1, 0, [1, 2, 3]);//第二位参数为0,默认是十进制,所以结果是1.
    parseInt(2, 1, [1, 2, 3]);//第二位参数为1,正好不在2到36之内,所以是NaN.
    parseInt(3, 2, [1, 2, 3]);//第二位参数为2,假如说是二进制,那么第一位参数只能出现1和0,但是它却是3,所以是NaN;或者按照第一位参数是3,那么第二位参数就可代表3以上的进制,但是它却是2,所以是NaN.比如parseInt(4,3);结果也是NaN,

    2、

    [typeof null, null instanceof Object]

    答案

    ["object", false]

    3、

    [[3, 2, 1].reduce(Math.pow), [].reduce(Math.pow)]

    答案
    报错

    Array.reduce方法接收四个值:
    previousValu 上一次值
    currentValue 当前值
    currentIndex 当前值的索引
    array 数组
    Math.pow方法接收两个参数,
    底数
    幂数
    所以[3, 2, 1].reduce(Math.pow)的值应该是9 ,第一次Math.pow(3,2)等于9,第二次Math.pow(9,1)等于9,至于最后一个[].reduce(Math.pow)应该数组为空,所以无法计算。

    4、

    var val = 'value';
    console.log('Value id ' + (val === 'value') ? 'Something' : 'Nothing');
    console.log('Value id ' + (val === 'value111') ? 'Something' : 'Nothing');
    console.info('Value id '+(val === 'value')?'Something':'Nothing');
    //'Value id '+(val === 'value')这个得到的是'Value id true'这个再转成Boolean是true啊,是true肯定是something啊。同理下面那个是'Value id false'这个也是true啊。那么肯定还是something。这个三元运算符的意思是,如果前面的值为真,那么就执行?后面的语句,
    否则执行:后面的语句。你要把三元写在一起,+号的优先级高于三元运算符,低于小括号的优先级。

    5、

    var name = 'World';
    
    (function () {
        console.log(name); //undefined
        if (typeof name === 'undefined') {
            var name = "Jack";
            console.info('Goodbye ' + name);
        } else {
            console.info('Hello ' + name);
        }
    })();
    
    var name = 'World';
    
    (function () {
        console.log(name); //World why?????????????
    
        typeof name;
    })();

    答案:Goodbye Jack

    自执行函数里是私有作用域,所以 var name = "Jack"; 会将name提到作用域顶端,先赋值为undefined,所以才会输出Goodbye Jack,如果将var name= "Jack"; 改成 name= "Jack" 

    那么输出为Hello world

    6、

    var END = Math.pow(2, 53);
    var START = END - 100;
    var count = 0;
    console.log(START);
    console.log(END);
    for (var i = START ; i <= END ; i++) {
        console.log(count);
        count++;
    }
    console.log(count);

    答案
    程序会陷入死循环
    这道题考的是JavaScript数字范围的题。在JavaScript中,只有一种数字:IEEE 754标准的64位浮点数,范围是-2^53~2^53(包含边界值),所以Math.pow(2, 53)即为javascript中所能表示的最大整数,在最大整数在继续增大就会出现精度丢失的情况,
    END + 1 的值其实是等于END的,题中当START=END的时候,继续执行,但当下一次 START继续加1的时候,因为超出了边界,所以变为恒等,造成了死循环。
    所以可以把for循环中的i <= END变为 i < END即可输出正确。

    7、

    var ary = [0, 1, 2];
    ary[10] = 10;
    console.log(ary.filter(function (x) { return x === undefined; }));
    console.log(ary[4]); //undefined

    答案
    []
    给ary数组第10个位置赋值为10的话,那么其中断开的位置实际上是用undefined补齐的。
    在Array.filter方法中,会对未赋值的或已经删除的项进行调用,所以返回空数组。

    8、

    var two = 0.2;
    var one = 0.1;
    var eight = 0.8;
    var six = 0.6;
    console.log([two - one == one, eight - six == two]);

    答案
    [true,false]
    js浮点数运算时,会将10进制转换为2进制运算,这会导致精度丢失的问题,例如0.8-0.6时,所得到的是0.20000000000000007。

    9、

    function showCase(value) {
        console.log(value);//String {0: "A", length: 1, [[PrimitiveValue]]: "A"}
        switch (value) {
            case 'A':
                console.info('Case A');
                break;
            case 'B':
                console.info('Case B');
                break;
            case undefined:
                console.info('undefined');
                break;
            default:
                console.info('Do not know!');
        }
    }
    showCase(new String('A'));

    答案
    Do not konw!
    当使用new 时,创建的是string对象,而非原始的string字符串
    JS本身有原始字符串和字符串对象之分,只不过在调用方法和获取属性时的时候会自动转换,但typeof运算符运算时是不会转换的。Number和Boolean同样适用
    当String('A')时,创建的就是原始的字符串了。

    10、

    console.log(Array.isArray(Array.prototype));

    答案
    true

    11、

    var a = [0];
    console.log([0]);
    if ([0]) {
        console.info(a == true);
    } else {
        console.info("else");
    }

    答案
    false
    a本身是一个长度为1的数组,而当数组不为空时,其转换成bool值为true。
    而==左右的转换,会使用如果一个操作值为布尔值,则在比较之前先将其转换为数值的规则来转换,Number([0]),也就是0,于是变成了0 == true,结果自然是false,

    12、

    console.log([] == []);

    答案
    false
    这题考的是数组字面量创建数组的原理和==运算符,首先JS中数组的真实类型是Object这点很明显typeof []的值为"object",而==运算符当左右都是对象时,则会比较其是否指向同一个对象。而每次调用字面量创建,都会创造新的对象,也就是会开辟新的内存区域。所以指针的值自然不一样,结果为 false

    13、

    console.log([('5' + 3), ('5' - 3)]);

    答案
    ["53", 2]
    加法: 加法运算中,如果有一个操作值为字符串类型,则将另一个操作值转换为字符串,最后连接起来
    减法: 如果操作值之一不是数值,则被隐式调用Number()函数进行转换

    14、

    var ary = Array(3);
    ary[0] = 2
    ary=ary.map(function (elem) { return '1'; });
    console.log(ary);

    答案
    ["1"]
    map在使用的时候,只有数组中被初始化过元素才会被触发,其他都是undefined,所以结果为["1"]

    15、

    function sidEffecting(arr) {
        arr[0] = arr[2];
    }
    function bar(a, b, c) {
        c = 10;//向函数传递参数时,arguments数组中的对应单元会和命名参数建立关联,以得到相同的值,相反,不传递参数就不会建立关联。
        console.log(arguments[2]);
        sidEffecting(arguments);
        return a + b + c;
    }
    console.log(bar(1, 1, 1));

    答案
    21
    arguments 对象其实是一个类数组对象,里面有length属性和索引1、2、等等属性,所以,这里传入arguments其实传入的是一个对象,将引用传入,从而会影响当前函数内部的值。

    补充:

    function a() {
        var arr = [1];
        b(arr);
        return arr;
    }
    function b(a) {
        a = [2];
    } 
    console.log(a()); //[1]
    
    
    function c() {
        var arr = {name:"aa"};
        d(arr);
        return arr;
    }
    function d(a) {
        a.name="bb";
    }
    console.log(c()); //Object {name: "bb"}

    当参数为数组时,会建立一个副本,而对象时,则会将引用传入。

    16、

    var a = 111111111111111110000;
    b = 1;
    console.info(a + 1);

    答案
    111111111111111110000
    a已经超出js整数范围边界。所以会发生精度丢失的问题。

    17、

    var x = [].reverse;
    console.log(x());

    答案
    报错

    var arr = new Array(3)
    arr[0] = "George"
    arr[1] = "John"
    arr[2] = "Thomas"
    
    document.write(arr + "<br />")
    document.write(arr.reverse())

    18、

    console.log(Number.MIN_VALUE > 0);

    答案
    true

    19、

    console.log([1 < 2 < 3, 3 < 2 < 1]);

    答案
    [true, true]
    比较时会根据优先级从左至右进行比较,所以转换为 [true<3,false<1] ,又在比较时,如果有数字,则将操作数进行number转换,所以其实比较的是[1<3,0<1]

    20、

    console.log(2 == [[[2]]]);

    答案
    true
    隐式转换,会将[[[2]]]转换为"2",然后进行数字和字符串进行比较,再讲字符串用number方法转换为数字,所以为true。

    21、

    console.log(3.toString());
    console.log(3..toString());
    console.log(3...toString());

    答案
    error 3 error
    数字进行tostring时,需要填写两个.,因为数字类型无法区分是小数点还是方法调用的点。所以第一个会报错,第二个调用,第一个.是数字的小数点,第二个是方法调用的.,所以是正确的,第三个多了一个点。

    22、

    (function () {
        var x1 = y1 = 1;
    })();

    console.info(y1);
    console.info(x1);

    答案
    1 x1 is not defined
    自执行函数中的作用域是私有的,当执行完成之后会将内部的变量释放。
    然而题中的y1其实是 y1=1 前面并没有var,所以在执行的时候,编译器会进行处理,如果从未声明,那么会创建一个全局变量进行存放。

    23、

    var a = Function.length;
    var b = new Function().length;
    console.log(a);//1
    console.log(b);//0
    console.log(a === b);

    答案
    false

    24、

    var a = Date(0);
    var b = new Date(0);
    var c = new Date();
    console.log(a);
    console.log(b);
    console.log(c);
    console.log([a === b, b === c, a === c]);

    答案
    [false, false, false]

    var d1 = Date();        //返回一个字符串(string),没有getDate等日期对象方法,内容为当前时间
    var d2 = new Date();    //返回一日期对象,可以调用getDate(),内容为当前时间
    var d3 = Date("2000-1-1");//返回一个字符串(string),内容仍旧为当前时间,也就是不受参数影响
    var d4 = new Date("2000-1-1");//返回一日期对象,可以调用getDate(),内容为2000年元旦

    25、

    var min = Math.min();
    var max = Math.max();
    console.log(min);//Infinity
    console.log(max);//-Infinity
    console.log(min < max);

    答案
    false
    Math.min()和Math.max()是两个比较函数,并不是返回最大最小值的函数,文档上进行了说明,如果传入参数的个数为0,那么Math.min()返回Infinity,而Math.max()返回-Infinity

    26、

    var a = new Date("2014-03-19"); 
    var b = new Date(2014, 03, 19); 
    console.log(a);//2014/3/19 上午8:00:00
    console.log(b);//2014/4/19 上午12:00:00
    console.log([a.getDay() === b.getDay(), a.getMonth() === b.getMonth()]);

    答案
    false

    27、

    function foo(a) {
        var a;
        return a;
    }
    function bar(a) {
        var a = 'bye';
        return a;
    }
    console.log([foo('hello'), bar('hello')]);

    答案
    ["hello", "bye"]
    当内部变量和参数同名时,js会自动进行对应。

    28、

    var a = { class: "Animal", name: 'Fido' };
    console.log(a.class);

    答案
    Animal
    class是关键字。根据浏览器的不同,结果不同

    29、

    var a = /123/;
    var b = /123/;
    console.log(a == b);
    console.log(a === b);

    答案
    false
    false

    30、

    var a = [1, 2, 3],
        b = [1, 2, 3],
        c = [1, 2, 4]
    console.log(a == b);
    console.log(a === b);
    console.log(a > c);
    console.log(a < c);

    答案
    false false false true
    JavaScript中Array的'>'运算符和'<'运算符的比较方式类似于字符串比较字典序,会从第一个元素开始进行比较,如果一样比较第二个,还一样就比较第三个,如此类推,所以第三个结果为false,第四个为true。

    31、

    var a = {}, b = Object.prototype;
    console.log([a.prototype === b, Object.getPrototypeOf(a) === b]);

    答案
    [false, true]

    32、

    function foo() { }
    var oldName = foo.name;
    foo.name = "bar";
    console.log([oldName, foo.name]);

    答案
    ["foo", "foo"]
    函数的name属性,使用函数定义方式时,会给function对象本身添加一个name属性,保存了函数的名称,很好理解oldName为"foo"。name属性时只读的,不允许修改,所以foo.name = "bar";之后,foo.name还是"foo",所以结果为["foo", "foo"]

    33、

    function aaa(a, b, c) {
        c = 3;
        console.log(arguments[0] + 'arguments[0]');
        console.log(arguments[1] + 'arguments[1]');
        console.log(arguments[2] + 'arguments[2]');
    }
    aaa('a', 'b');

    答案
    a,b,undefind
    如果参数没有传递,那么arguments与参数变量是不会绑定的,所以即使重新赋值,(实际是在作用域中新建了一个变量)arguments也会为undefined。
    如果传递了这个参数变量,那么会自动进行绑定,所以无论对哪个进行改变,都会一起变化。

    34、

    36
    var foo = {
        baz: 1,
        bar: function () {
            return this.baz;
        }
        //
    };
    //var baz=2;
    (function () {
        //var baz=3;
        console.log(arguments[0]());
    })(foo.bar);
    
    (function () {
        console.log(arguments[0].call(foo));
    })(foo.bar)

    答案
    undefind 1
    第一个自执行函数,其实是将foo.bar方法的引用传递进去,所以在方法调用的时候,其实是没有上下文的,this其实指向的Windows,即使在自执行函数中,声明了baz,也是在自执行内部的作用域,而不是window。
    第二个自执行函数,通过用call方法强行指定了bar方法的this为foo对象,所以结果会为1.

  • 相关阅读:
    利用docker搭建测试环境--安装
    fiddler获取手机请求
    python多线程
    linux下安装python的第三方module
    shell编程sed笔记
    shell 函数
    mysql information_schema 数据库简介:
    shell常用的判断条件
    gulp:gulp-sass基础教程
    (六):关于全局config配置
  • 原文地址:https://www.cnblogs.com/y8932809/p/6015668.html
Copyright © 2020-2023  润新知