几道有意思的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