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
- 计算
JS 在进行加减乘除运算之前,会先调用 Number()方法,将非数值的运算项转化为数值,如果转换失败就返回NaN:
1-'a'; // NaN
1-'1' // 0
- 类型转换
'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倍