判断变量是否为undefined、null、NaN方法

判断变量是否为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
    原文作者:刘运召
    原文地址: https://blog.csdn.net/Liu_yunzhao/article/details/103808162
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞