前言
今天在学习的过程,发现了几个自己从来没注意过的小坑。今天就把它们写下来,看看你能不能完美回答出来吧!
问题一
请你实现一个求和函数,不用考虑大数,考虑范围尽可能全面
要是面试的时候被问到这个题目,想必内心一定会很开心吧,不就实现两数求和吗三下两除二就能解决。
function add(a,b){
return a+b
}
好了,就这样写完了。
要是写出这样的结果,那么估计面试官大概率会说再仔细想想。
于是,你可能会写上限定a,b的类型,然后写出这样的代码。
function add(a,b){
if(typeof a!=='number'|| typeof b!=='number'){
hrow new TypeError('a 和 b 必须是数字')
}
return a+b
}
嗯,你考虑的已经很全面了,请你再考虑一下,能不能再更全面一些。
思虑再三,实在想不出来有什么可以再写的了。
好了,我就直接说出来吧。如果传入的参数是NAN或者Infinity呢,是不是会绕过一开始的类型检测。那么我们可以写出最终的代码了。
function add(a, b) {
if (typeof a !== 'number' || typeof b !== 'number' || !isFinite(a) || !isFinite(b)) {
throw new TypeError('a 和 b 必须是数字')
}
return a + b;
}
问题二
JS数据类型有几种?
想必这个问题是非常常见的,你可能在很多的地方上看到过一共有八种数据类型,undfined、null、boolean、string、Symbol、number、BigInt、object。
可是,真的是八种吗?诚然,确实是这八种。但是,根据ECAMScript的最新规定,JS数据类型一共有七种,其中number和BigInt被合并成一种numeric了。
是不是感到有点意外?
问题三
说说你对Symbol的认识。
Symbol是es6新增的一种基础数据类型,它可以创建一个独一无二的值,用来防止命名冲突。
Symbol是比较特殊的,它可以创建独一无二的值,而且Symbol不能通过for...in、for...of等遍历,它只能用Object.getOwnPropertyNames()方法获取。
它有两种创建方式。直接用Symbol()或者有Symbol.for()。二者不同点在于,Symbol.for()它会先看看是否已经存在,如果存在就不会再创建新的Symbool()。
Ending
以上就是我今天学习中没有注意到的小坑。