javascript中 有null、undefined 在使用typeof 时候
console.log(typeof null); //object
console.log(typeof undefined) //undefined
null
与
undefined
都可以表示“没有”,含义非常相似。将一个变量赋值为
undefined
或
null
,老实说,语法效果几乎没区别。
两个类型到底有什么区别,什么场景使用是个头疼的问题。
一、概述
//1.在
if
语句中,它们都会被自动转为
false
,相等运算符(
==
)甚至直接报告两者相等。
var a = undefined;
// 或者
var a = null;
if (!undefined) {
console.log('undefined is false');
}
// undefined is false
if (!null) {
console.log('null is false');
}
// null is false
undefined == null
// true
从上面代码可见,两者的行为是何等相似!谷歌公司开发的 JavaScript 语言的替代品 Dart 语言,就明确规定只有
null
,没有
undefined
!
1995年 JavaScript 诞生时,最初像 Java 一样,只设置了
null
表示"无"。根据 C 语言的传统,
null
可以自动转为
。
Number(null) // 0
5 + null // 5
Number(undefined) // NaN
5 + undefined // NaN
但是,JavaScript 的设计者 Brendan Eich,觉得这样做还不够。首先,第一版的 JavaScript 里面,
null
就像在 Java 里一样,被当成一个对象,Brendan Eich 觉得表示“无”的值最好不是对象。其次,那时的 JavaScript 不包括错误处理机制,Brendan Eich 觉得,如果
null
自动转为0,很不容易发现错误。
因此,他又设计了一个
undefined
。区别是这样的:
null
是一个表示“空”的对象,转为数值时为
;
undefined
是一个表示"此处无定义"的原始值,转为数值时为
NaN
。
二、用法和含义
对于
null
和
undefined
,大致可以像下面这样理解。
null
1.通过id获取元素如果获取不到内容,那么默认返回值是null
2.如果要销毁对象的堆内存,那么就给对象赋值null
3.正则进行捕获,捕获不到内容,那么返回值就是null;
undefined
1.如果变量只声明,没有赋值,那么默认存储的值就是undefined;
2.如果获取对象的属性名和对应的属性值,如果属性名不存在,获取的就是undefined
3.如果函数没有对象的实参,那么形参默认存储的值就是undefined
4.如果函数没有return,那么默认的返回值也是undefined
// 变量声明了,但没有赋值
var i;
i // undefined
// 调用函数时,应该提供的参数没有提供,该参数等于 undefined
function f(x) {
return x;
}
f() // undefined
// 对象没有赋值的属性
var o = new Object();
o.p // undefined
// 函数没有返回值时,默认返回 undefined
function f() {}
f() // undefined
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面我们在说一说布尔数据类型(boolean)
布尔类型
布尔值代表“真”和“假”两个状态。“真”用关键字
true
表示,“假”用关键字
false
表示。布尔值只有这两个值。
下列运算符会返回布尔值:
- 前置逻辑运算符:
(Not)!
- 相等运算符:
,===
,!==
,==
!=
- 比较运算符:
,>
,>=
,<
<=
关于布尔类型的转换是要说的重点,因为这确实不符合我们之前学习语言转换的规律
如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为
false
,其他值都视为
true
。
-
undefined
-
null
-
false
-
NaN
-
或""
(空字符串)''
总结:请记住只有以上6种情况会转换为false
console.log(Boolean(0)); //false
console.log(Boolean(NaN)); //false
console.log(Boolean("")); //false
console.log(Boolean('')); //false
console.log(Boolean(" ")); //true
console.log(Boolean("0")); //true
console.log(Boolean(null)); //false
console.log(Boolean(undefined)); //false
console.log(Boolean([])); //true
console.log(Boolean({})) //true