28道JavaScript难题

博客包含28道JavaScript难题,从基础到进阶,可用于复习、提高深度或助力面试。每个问题下方给出答案,并对部分答案进行了解析,涉及数组原型、运算规则、数据类型存储等JavaScript知识。

28道JavaScript难题 (原文)

从基础到进阶,用于复习,提高深度,或者帮助你的 coding 面试!

答案在问题下方的折叠部分,点击即可展开问题。祝你好运~


1. 输出是什么?
["1", "2", "3"].map(parseInt)
复制代码
答案

答案:[1, NaN, NaN]
解析:parseInt (val, radix) :两个参数,val值,radix基数(就是多少进制转换)
     map 能传进回调函数 3参数 (element, index, array)
     parseInt('1', 0);  //0代表10进制
     parseInt('2', 1);  //没有1进制,不合法
     parseInt('3', 2);  //2进制根本不会有3
巩固:["1", "1", "11","5"].map(parseInt) //[1, NaN, 3, NaN]  
复制代码


2. 输出是什么?
[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ]
复制代码
答案

答案:an error
解析:Math.pow (x , y)  x 的 y 次幂的值
     reduce(fn,total)
     fn (total, currentValue, currentIndex, arr) 
         如果一个函数不传初始值,数组第一个组默认为初始值.
         [3,2,1].reduce(Math.pow)
         Math.pow(3,2) //9
         Math.pow(9,1) //9
     [].reduce(Math.pow)       //空数组会报TypeError
巩固:[1].reduce(Math.pow)      //只有初始值就不会执行回调函数,直接返回1
     [].reduce(Math.pow,3)     //只有初始值就不会执行回调函数,直接返回1
     [2].reduce(Math.pow,3)    //传入初始值,执行回调函数,返回9
复制代码


3. 输出是什么?
[typeof null, null instanceof Object]
复制代码
答案

答案:["object", false]
解析:null代表空对象指针,所以typeof判断成一个对象。可以说JS设计上的一个BUG
     instanceof 实际上判断的是对象上构造函数,null是空当然不可能有构造函数
巩固:null == undefined //true    null === undefined //flase
复制代码


4. 输出是什么?
var name = 'World!';
(function () {
if (typeof name === 'undefined') {
    var name = 'Jack';
    console.log('Goodbye ' + name);
} else {
    console.log('Hello ' + name);
}
})();
复制代码
答案

答案: Goodbye Jack
解析:(1)typeof时var name 在函数内部之声明未定义
     (2)typeof优先级高于===
巩固:
    var str = 'World!';   
    (function (name) {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
复制代码


5. 输出是什么?
var ary = [0,1,2];
ary[10] = 10;
ary.filter(function(x) { 
    return x === undefined;
}); 
复制代码
答案

答案: :[]
解析:filter() 不会对空数组进行检测。会跳过那些空元素
巩固:
      var ary = [0,1,2,undefined,undefined,undefined,null];
      ary.filter(function(x) { return x === undefined;});
      // [undefined, undefined, undefined] 
复制代码


6. 输出是什么?
var two   = 0.2
var one   = 0.1
var eight = 0.8
var six   = 0.6
[two - one == one, eight - six == two]
复制代码
答案

答案: [true, false]
解析:IEEE 754标准中的浮点数并不能精确地表达小数
巩固:var two   = 0.2;
     var one   = 0.1;
     var eight = 0.8;
     var six   = 0.6;
     ( eight - six ).toFixed(4) == two 
     //true
复制代码


7. 输出是什么?
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'));
复制代码
答案

答案: Do not know!
解析:new String(x)是个对象
巩固:下一题
复制代码


8. 输出是什么?
function showCase2(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!');
    }
}
showCase2(String('A'));
复制代码
答案

答案: Case A
解析:String('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);
复制代码
答案

答案: [true, true, true, false, false]

解析:

如果不是数值会调用 Number()去转化
'13' % 2       // 1
Infinity % 2  //NaN  Infinity 是无穷大
-9 % 2        // -1
巩固: 9 % -2        // 1   余数的正负号随第一个操作数
复制代码


10. 输出是什么?
Array.isArray( Array.prototype )
复制代码
答案

答案:true

解析:Array.prototype是一个数组 数组的原型是数组,对象的原型是对象,函数的原型是函数


11. 输出是什么?
var a = [0];
if ([0]) {
  console.log(a == true);
} else {
  console.log("wut");
}
复制代码
答案

答案:false

解析:[0]的boolean值是true 巩固:a[0] 的boolean是 false


12. 输出是什么?
'5' + 3
'5' - 3
复制代码
答案

答案: 53 2

解析:加号有拼接功能,减号就是逻辑运算


13. 输出是什么?
var ary = Array(3);
ary[0]=2
ary.map(function(elem) { 
    return '1'; 
});
复制代码
答案

答案: ["1", empty × 2]

解析:如果没有值,map会跳过不会执行回调函数


14. 输出是什么?
function sidEffecting(ary) {
  ary[0] = ary[2];
}
function bar(a,b,c) {
  c = 10
  sidEffecting(arguments);
  return a + b + c;
}
bar(1,1,1)
复制代码
答案

答案: 21,

解析:

// arguments会和函数参数绑定。
// 但如果es6赋给初始值则无法修改
 function sidEffecting(ary) {
  ary[0] = ary[2];
}
function bar(a=1,b,c) {
  c = 10
  sidEffecting(arguments);
  return a + b + c;
}
bar(1,1,1)
//12
复制代码


15. 输出是什么?
 var a = 111111111111111110000,
b = 1111;
a + b;
复制代码
答案

答案: 11111111111111111000

解析:在JavaScript中number类型在JavaScript中以64位(8byte)来存储。

这64位中有符号位1位、指数位11位、实数位52位。

2的53次方时,是最大值。其值为:9007199254740992(0x20000000000000)。超过这个值的话,运算的结果就会不对.


16. 输出是什么?
var x = [].reverse;
x();
复制代码
答案

答案: window

解析:但在chrome上执行报错,没太懂


17. 输出是什么?
Number.MIN_VALUE > 0
复制代码
答案

答案: true

解析:MIN_VALUE 属性是 JavaScript 中可表示的最小的数(接近 0 ,但不是负数)。它的近似值为 5 x 10-324。


18. 输出是什么?
[1 < 2 < 3, 3 < 2 < 1]
复制代码
答案

答案: [true,true]

解析:

1 < 2    =>  true;
true < 3 =>  1 < 3 => true;

3 < 2     => false;
false < 1 => 0 < 1 => true;
复制代码


19. 输出是什么?
 (function(){
  var x = y = 1;
})();
console.log(y);
console.log(x);
复制代码
答案

答案: 1, error

解析:y 被赋值成全局变量,等价于 y = 1 ; var x = y;


20. 输出是什么?
function foo() { }
var oldName = foo.name;
foo.name = "bar";
[oldName, foo.name]    
复制代码
答案

答案: ["foo", "foo"]

解析:函数的名字不可变.


21. 输出是什么?
"1 2 3".replace(/\d/g, parseInt)     
复制代码
答案

答案: "1 NaN 3"

解析:replace() 回调函数的四个参数: 1、匹配项
2、与模式中的子表达式匹配的字符串
3、出现的位置
4、stringObject 本身 。

如果没有与子表达式匹配的项,第二参数为出现的位置,所以第一个参数是匹配项,第二个参数是位置

 parseInt('1', 0)
 parseInt('2', 2)  //2进制中不可能有2
 parseInt('3', 4)
// 巩固:
"And the %1".replace(/%([1-8])/g,function(match,a , b ,d){
  console.log(match +"  "+ a + " "+ b +" "+d )
});
//%1  1 8 And the %1 
复制代码


22. cool_secret 可访问多长时间?
 function f() {}
var parent = Object.getPrototypeOf(f);
f.name // ?
parent.name // ?
typeof eval(f.name) // ?
typeof eval(parent.name) //  ?  
复制代码
答案

答案: "f", "Empty", "function", error

解析:f的函数名就是f parent是f原型对象的名字为"" , 先计算eval(f.name) 为 f,f的数据类型是function eval(parent.name) 为undefined, "undefined"


23. 输出是什么?
[,,,].join(",")
复制代码
答案

答案: ",,"

解析:因为javascript 在定义数组的时候允许最后一个元素后跟一个, 所以这个数组长度是3, 巩固: [,,1,].join(".").length // 3


24. 输出是什么?
var a = Function.length,
b = new Function().length
a === b
复制代码
答案

答案: false

解析:首先new在函数带()时运算优先级和.一样所以从左向右执行 new Function() 的函数长度为0 巩固:function fn () { var a = 1; } console.log(fn.length) //0 fn和new Function()一样


25. 输出是什么?
var min = Math.min(), max = Math.max()
min < max
复制代码
答案

答案: false

解析: Math.min 不传参数返回 Infinity, Math.max 不传参数返回 -Infinity 无限集合之间不能比较大小。 巩固:Number.MAX_VALUE > Number.MIN_VALUE //true


26. 输出是什么?
function captureOne(re, str) {
  var match = re.exec(str);
  return match && match[1];
}
var numRe  = /num=(\d+)/ig,
    wordRe = /word=(\w+)/i,
    a1 = captureOne(numRe,  "num=1"),
    a2 = captureOne(wordRe, "word=1"),
    a3 = captureOne(numRe,  "NUM=2"),
    a4 = captureOne(wordRe,  "WORD=2");
[a1 === a2, a3 === a4]
复制代码
答案

答案: [true, false]

解析: /g有一个属性叫lastIndex,每次匹配如果没有匹配到,它将重置为0,如果匹配到了,他将记录匹配的位置。我们看一个简单的例子吧。 var numRe = /num=(\d)/g; numRe.test("num=1abcwewe") //true numRe.lastIndex //5 匹配到num=1后在5的索引位置 numRe.exec("num=1") //fales 这次要从5的索引位置,开始匹配 numRe.lastIndex //0 上一次匹配失败了numRe.lastIndex重制为0


27. 输出是什么?
if ('http://giftwrapped.com/picture.jpg'.match('.gif')) {
    'a gif file'
  } else {
    'not a gif file'
  }
复制代码
答案

答案: 'a gif file'

解析: String.prototype.match 接受一个正则, 如果不是, 按照 new RegExp(obj) 转化。 所以, 并不会转义, 那么 /gif 就匹配了 /.gif/ 巩固:

if ('http://giftwrapped.com/picture.jpg'.indexOf('.gif')) {
    'a gif file'
} else {
    'not a gif file'
}
//'a gif file' 同样的道理
复制代码


28. 输出是什么?
function foo(a) {
  var a;
  return a;
}
function bar(a) {
    var a = 'bye';
    return a;
}
[foo('hello'), bar('hello')]
复制代码
答案

答案: ["hello", "bye"]

转载于:https://juejin.im/post/5d08d632518825282e2c3c18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值