大厂面经---js基础篇typeof/NaN/以及一些常规题目

1. typeof

typeof null === ‘object’ // true

2. NaN
typeof(NaN)        // "number"
alert(NaN == NaN)  // false,NaN和任何值都不相等
alert(NaN === NaN)  // false,任何涉及 NaN的操作都会返回NaN。
2.1 哪些情况会返回NaN
  1. 计算
    JS 在进行加减乘除运算之前,会先调用 Number()方法,将非数值的运算项转化为数值,如果转换失败就返回NaN:
1-'a'; // NaN
1-'1'  // 0
  1. 类型转换
'1'+2+3
//记住,parseInt是尽量转化成功
parseInt('123ab') //123
Number('123ab')  // NaN
Number('123')    // 123

Number([]);  // 0
parseInt([]);  // NaN
parseFloat([]);  // NaN

Number([]);  // 0
parseInt([]);  // NaN
parseFloat([]);  // NaN
2.2 isNaN和Number.isNaN

isNaN 是window对象的一个方法,比较诡异的是:isNaN(x)并不是判断参数x本身是不是NaN,而是判断Number(x)是不是NaN。

// isNaN原理
var isNaNA = function(value) {
    var n = Number(value);
    return n !== n;
};
isNaN(NaN);  // true
isNaN(123);  // false
isNaN('abc');  //true
isNaN('123abc'); //true

isNaN({});  // true,因为Number({})=NaN
isNaN('');  // false, 因为Number('')=0
isNaN([]);  // false,因为Number([])=0

Number.isNaN 修复了isNaN(), 不会强制转化参数,直接对参数本身做判断,这样只有参数显示等于NaN,才会返回true.

// 原理
function isNaNC (value) {
    return typeof(value) === "number" && isNaN(value);
}
3. 常规题目
3.1 连续赋值的输出
function A(){
	var a = b = 100
}
A()
console.log(a) // 报错
console.log(b) // 100, 这里的b是全局变量
3.2 js精度问题
console.log(0.1+0.2 === 0.3) // false
console.log(0.3+0.2 === 0.5) // true

主要是计算机对数字的存储是以二进制方式,有些小数转化成二进制的时候会变成一个无限循环的树,造成了精度的问题。

解决问题方式:

  • 设置一个误差值

if (!Number.EPSILON) {
     Number.EPSILON = Math.pow(2, -52);
}
function numbersCloseEnoughToEqual(a, b) {
     return Math.abs(a - b) < Number.EPSILON
}
  • 同时扩大100倍
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章