44道JS难题,你能做对几道

284 阅读6分钟

在公众号“前端达人”上看到的一篇文章。一个外国网站 javascript-puzzlers.herokuapp.com/ 给出了44道JS难题,挺感兴趣的就去试着做了一下,涉及到的知识还挺多的,最后只对了25道(😂好几道是蒙的),下面是自己总结的题目解析(文中的^表示次方)。

第1题

这道题还在之前的笔试题中遇到过(😂)
parseInt(val,radix),而map的回调函数有三个参数,callback(currentVal,index,array)
因此相当于执行parseInt("1",0),parseInt("2",1),parseInt("3",2)。
MDN中规定进制在236之间合法,如果是0,以10进制解析。
所以parseInt("1",0)=parseInt("1",10)=1;parseInt("2",1)中进制为1不合法,返回NaN;
parseInt("3",2)用二进制无法表示3,因此返回NaN。

第2题

typeof null为Object,实际上是js的一个bug,记住就行;
a instanseof b是用来判断通过a通过原型链是否能找到b.prototype,实际上执行了这个过程:
a.__proto__...._proto__是否等于b.prototype,到顶层的null为止。(按照其他语言中的父类子类来理解的话,实际上就是判断a是否是b.prototype的子孙)

第3题

根据MDN:
arr.reduce(callback( accumulator, currentValue, [, index[, array]] )[, initialValue])
若传入initialValue,刚开始accumulator为initialValue,currentValue为数组中下标为0对应的值;
若未传入initialValue,刚开始accumulator为数组中下标为0对应的值,currentValue为数组中下标为1对应的值;
因此[3,2,1].reduce(Math.pow)实际上是这样执行的:(3^2)^1 = 9
而如果数组为空且没有提供initialValue,会抛出TypeError;如果数组仅有一个元素(无论位置如何)并且没有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行!!!

第4题

这个没啥好说的,优先级问题。结果是'something',前面的'Value is ' + (val==='smtg') 会先被计算,
相当于('Value is ' + (val==='smtg'))?'Something':'Nothing;加号优先级高于条件运算符!!!

第5题

变量提升
在这个立即执行函数中,var name会被提升到最上层,相当于这样:
(funtion(){
	var name;
    if(){name='Jack';...}
    else{};
})();

第6题

在Javascipt中,最大的值是2^53,所以2^53==2^53+1,陷入死循环

第7题

arr.filter不会考虑那些缺失的值(arr.reduce等函数也是)

第8题

Javascript中采用双精度浮点数格式,所以会有误差。
用乘2取整法计算即可。不懂的可以看个例子: [乘2取整法](https://www.xuebuyuan.com/1216929.html)

第9题

第10题

结合第9题来说,注意两点,一点是用===来判断;一点是String(str)会返回str

第11题

-9/2 = -4...-1(余数与被除数符号相同),Infinity/2 => NaN

第12题

与第1题类似,进制问题

第13题

第14题

Javascript强制类型转换:https://juejin.cn/post/6844903632974905358
首先[0]被转成布尔值是true,然后[0]==true,因为如果有一个操作数是布尔值类型,会转为数字,true转为1,而[0]转为'0'后转为00!==1,所以输出为false

第15题

与第14题类似,强制类型转换
[][]类型相同,都为对象,但不是引用同一对象,因此返回false

反之,如果引用同一对象,返回true

第16题

第17题

🙃 相当于1+0-0+0+0+0-0+1=2

第18题

与第7题类似 ["1",emptyx2]

第19题

参数变量和arguments是双向绑定的!!!

第20题

数值太大,损失精度

第21题

MDN中有写道:

reverse方法颠倒数组中元素的位置,并返回该数组的引用(this) 因为没有将this绑到数组上,此处返回的this为window

第22题

第23题

运算符优先级和隐式类型转换

第24题

强制类型转换,与之前类似,参考https://juejin.cn/post/6844903632974905358中的4.1

第25题

点运算符会被有限识别为数字常量的一部分,然后才是对象属性访问符。
3.toString()会被识别为(3.)toString();

第26题

y没有用var声明,会创建在window下,而x用var声明,在window下访问不到

第27题

第28题

>,<比较调用toString()

第29题

原型和原型链相关,略

第30题

所有函数都是Function原型(一个匿名函数)的实例!!!

第31题

函数的name属性是只读的!!!

第32题

MDN String.prototype.replace()中是这样写的:

replace() 方法返回一个由替换值(replacement)替换部分或所有的模式(pattern)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern是字符串,则仅替换第一个匹配项。(因此如果第二个参数是回调函数的话,每一次匹配都会调用回调函数!!!)

第33题

事实上,在chrome中运行的结果为:

第34题

test方法的参数如果不是字符串,会调用ToString转换为字符串!!!

第35题

javascript允许用逗号来定义数组,1个逗号表示1undefined值!

第36题

在chrome中:

在window10 ie中:(老版本可能会报错,但没试过)

第37题

a是Invalid Date

第38题

根据MDN的定义:

length 属性指明函数的形参个数。

Function 构造器本身也是个Function。他的 length 属性值为 1 。该属性 Writable: false, Enumerable: false, Configurable: true.

Function.prototype 对象的 length 属性值为 0 。

第39题

a->字符串,当前时间
b->Date对象,1970年(开始计时的时间)
c->Date对象,当前时间

第40题

min=>Infinity,max=>+Infinity

第41题

numRe设置为global,会从上次匹配结果的位置(lastIndex)开始查找,因此a3为null

第42题

new Date(a,b,c)这种形式创建的Date对象月份是从0开始算起的。

第43题

使用match方法会隐式转换为正则对象!!!

第44题

一个变量在同一作用域中已经声明过会自动移除var 声明!!!

总结

1. parseInt ->1题、第122. js中数的最大最小值,双精度浮点数格式 ->6题、第8题、第20题、第223. 数组的map、reduce、filter、reverse、join等方法 ->1题、第2题、第7题、第18题、第21题、第354. type、原型和原型链 ->2题、第13题、第29题、第305. 函数:第31题、第33题、第386. 数学运算及运算优先级 ->4题、第11题、第16题、第17题、第237. 变量提升 ->5题、第26题!!!(经典)、第448. switch_case ->109. 强制类型转换 ->14题、第15题、第24题、第2810. 隐式类型转换 ->14题、第28题、第34题、第4311. arguments ->1912. reg相关 ->27题、第32题、第34题、第41题、第4313. Date相关 ->37题、第29题、第4214. 其他 ->25题(点运算符)、第36题(关键字)、第40题(Math.min()和Math.max())