滑稽 的博客

几道有意思的javascript题

这几道及分析,经常会被当作进阶的面试题,还有javascript的作用域,全局变量污染,经常是考点。


1. 取出一组数中的第二个大的数

function argsSecondMax() {

    // 将js处理成数组,然后排序

    return Array.prototype.slice.call(arguments).sort(function(a,b){return b-a})[1]

    //return [].slice.call(arguments, 0).sort(function(a,b){return b-a})[1]

}

var a = argsSecondMax(1, 5, 34, 23, 63, 3, 8)

alert(a);

// 主要是将一组数组成数组,然后正向排序数组,取出顺序为第二个的数


2. 判断结果

alert([] == []); 

// 非同一个对象引用,都是false

alert(parseInt('08'));   

// 旧浏览器由于使用旧版本的ECMAScript(ECMAScript版本小于ECMAScript 5,当字符串以"0"开头时默认使用八进制,ECMAScript 5使用的是十进制),所以在解析("08") 将输出8。

alert(false == {});

// 1.将false ToNumber 强转为0。

2.将{}执行ToPrimitive(Number标志的原始值)转换;

          流程:

          对象的值一开始不是一个原始值,不返回,继续判断;

          若对象的valueOf是原始值,直接返回,不是,继续判断;

          若对象的ToString是原始值,直接返回,不是,抛出异常。


          过程:

          {}的valueOf是一个对象,不返回;

          继续走ToString,ToString返回一个字符串的'[object Object]'。

          接着是0=='[object Object]'的比较;

          将字符串'[object Object]'强转整型后,是NaN;

          NaN与任何都不相等,与自己也不相等;

          整个比较过程结束,最终结果是0==NaN,返回false。


        原始值和对象值说明:

        原始值有:undefined, null, 布尔值(booleans), 数字(numbers),还有字符串(strings)。

        其他的所有值都是对象类型的值,包括数组(arrays)和函数(functions)。

alert(1==[['1']]);  

//  true #数组对象使用toString()输出为'1',再toNumber转换为数值型1

3. 判断输出结果

for(var i=0;i<3;i++){

        setTimeout(function(){

            console.log('i:'+i);

        },0);

    }


// 当每执行一个setTimout时,会触发一个执行流;且i又是全局变量,当执行流执行到setTimeout任务时,i的值最后赋值的就是3


评论
< >
更多文章来:https://alpha2016.github.io
< >
© 滑稽 的博客 | Powered by LOFTER