判断变量是否为undefined
typeof判断
if(typeof temp === 'undefined'){
console.log('--undefined--')
}
- 通过 typeof 判断,不管temp 变量是否定义都可以判断(let 的暂时性死区除外)
注意
let 的出现让 typeof 操作不再绝对安全,所以尽量做到先声明再使用变量
错误示例
function test(){
if(typeof temp === 'undefined'){
console.log('--undefined--')
}
let temp
}
test()
// Uncaught ReferenceError: Cannot access 'temp' before initialization
===判断
let temp
if(typeof temp === 'undefined'){
console.log('--undefined--')
}
通过 === 判断时temp 必须先定义,否则会报错
判断变量是否为null
let temp = null
if(Object.prototype.toString.call(temp) === '[object Null]'){
console.log("-null--")
}
// 或者
if (!temp && typeof(temp)!="undefined" && temp!=0){
console.log('--null--')
}
判断undefined或null
let temp;
console.log(undefined == null) // true
if (temp == undefined){
console.log('--undefined or null--')
}
- ==判断时temp必须先定义,否则报错
- ==判断时undefined和null相等,且不等于0、’’、false
== 比较规则
console.log(0=='') // true
console.log(0==false) // true
console.log(0==undefined) // false
console.log(0==null) // false
console.log("-----------")
console.log(''==false) // true
console.log(''==undefined) // false
console.log(''==null) // false
console.log("-----------")
console.log(false==undefined) // false
console.log(false==null) // false
console.log(true == undefined) // false
console.log(true == null) // false
console.log("-----------")
console.log(undefined==null) // true
console.log("-----------")
a与b进行比较时,如果a与b是String、Boolean、Number这三种类型中的一种,并且a与b的类型不同,那么就将a与b都转换成数字再进行比较
console.log('1' == true) // true
console.log('1' == 1) // true
console.log('a' == true) // false
‘a’转换成Number是NaN,NaN与true、’’都不相等
基本数据类型和引用数据类型比较
函数无返回值时,默认返回undefined
let fun = function(){}
console.log(undefined == fun()) // true
定义变量但未赋值
let obj = {
name: 'liu',
age: 20,
toString: function(){
console.log('--toString--')
},
valueOf: function(){
console.log('--valueOf--')
}
}
let temp // 未赋值
console.log(temp == obj) // false
- 当只定义temp但未赋值时,结果为false,并且不会调用obj的valueOf、toString方法
- 当给temp赋值为undefined、null时,结果为false,并且也不会调用obj的valueOf、toString方法
- 当给temp赋值String、Boolean、Number时会调用obj的valueOf、toString方法
定义变量并赋值 valueOf/toString无返回值
let obj = {
name: 'liu',
age: 20,
toString: function(){
console.log('--toString--')
},
valueOf: function(){
console.log('--valueOf--')
}
}
let temp = ''
console.log(temp == obj) // false
打印结果
--valueOf--
false
定义变量并赋值 valueOf/toString有返回值
let obj = {
name: 'liu',
age: 20,
toString: function(){
console.log('--toString--')
return 0
},
valueOf: function(){
console.log('--valueOf--')
return {}
}
}
let temp = ''
console.log(temp == obj) // false
打印结果
--valueOf--
--toString--
true
当比较时首先调用obj的valueOf方法,当valueOf 中返回引用数据类型(如:{}、[]、函数,但返回undefined、null不行)则会继续调用toString方法
注意
- “”、false、0、undefined、null,在if语句中做判断时,都是false
- 如果不重写valueOf方法,则默认返回this,即对象本身
判断变量是否为NaN
function isNaN(value) {
return Number.isNaN ? Number.isNaN(value) : typeof value === "number" && isNaN(value)
}
NaN(not a number): NaN 与任何值(包括其自身)相比得到的结果均是 false
isNaN()函数:用于检查其参数是不是非数字值,如果isNaN函数的参数不是Number类型,
isNaN函数会首先尝试将这个参数转换为数值,然后才会对转换后的结果是不是NaN进行判断
console.log(typeof NaN); //number
console.log(isNaN(false)); //false
console.log(isNaN(true)); //false
console.log(isNaN('')); //false 比较特殊
console.log(isNaN('abc')); //true
console.log(isNaN('abc123')); //true
console.log(isNaN('123abc')); //true
console.log(isNaN('123')); //false
console.log(Number(false)); //0
console.log(Number(true)); //1
console.log(Number('')); //0
console.log(Number('abc')); //NaN
console.log(Number('abc123')); //NaN
console.log(Number('123abc')); //NaN
console.log(Number('123')); //123
注意
- 1:当给isNaN传递空字符串时返回值为false,因为isNaN会把空字符串转化为0处理,所以返回为false
- 2:Number(‘123abc’)和parseInt(“123abc”)不同,前者返回NaN,后者返回123
当我们向isNaN传递一个参数时,它的本意是通过Number()尝试把参数转换为Number类型,
如果转换成功则返回false,否则返回true,isNaN只是判断这个参数能不能转换成数字而已。
所以使用isNaN方法无法判断某个值是否严格等于NaN,毕竟你传递任意字符串它都会返回true。
如:isNaN(‘abc’)返回true,说明它是一个NaN,但是我们传的参数’abc’是一个字符串而不是NaN
Number.isNaN()
该方法不会强制将参数转换成数字,只有在参数是真正的数字类型,且值为 NaN 的时候才会返回 true
console.log(Number.isNaN(false)); //false
console.log(Number.isNaN(true)); //false
console.log(Number.isNaN("")); //false
console.log(Number.isNaN("abc")); //false
console.log(Number.isNaN("abc123")); //false
console.log(Number.isNaN("123abc")); //false
console.log(Number.isNaN("123")); //false
console.log(Number.isNaN(123)); //false
console.log(Number.isNaN(NaN)); //true