[size=11px;]
很多人或许对null和undefined这两个关键词比较困惑。
希望看了这篇文章之后可以轻松的找到关键点。
做个小实验
[code="js"]alert(null == undefined); // true
alert(null === undefined); //false[/code]
这个小实验说明,如果这两个特殊类型都进行向下转型然后对比值的话是相等的。但是类型确实是不相等的,也就是说,他们两个实际上不是一个东西。
再做个小实验
[code="js"]function a(x) {
// 判断x是否传递
if(x == null) {
console.log("yes");
}else {
console.log("no");
}
};
a();
print : yes[/code]
这个例子的本意是判断参数x 是否传递, OK 我们不去传递,结果打印出了yes。我们想当然的认为好像这样是正确的做法。
大错特错了!what? 为什么?
好吧 我们换一种方式
[code="js"]a(null);
print: yes.[/code]
它依然打印出yes。或许你会觉得,这样很好啊,一箭双雕。又能判断有没有传递又能判断参数是不是空。
好吧,那我再举个例子!
[code="js"]function m1() {
alert("没有参数, 支线1");
};
function m2(x) {
alert("有参数,需要做操作, 支线2");
};
function sbss(x) {
// 本意判断没有传递
if(x == null) {
m1();
}else {
m2(x);
}
};[/code]
我发现我永远无法执行m2,这显然是不对的!
这时候我使用undefined来判断,效果就截然不同。
这就是为什么很多书上说为什么不推荐使用null来判断对象是否存在。对于对象存在的概念,再次引入一个小例子,将清楚的说明这个问题:
[code="js"]if(a === undefined) {
alert("对象不存在");
}[/code]
上面的小片段我们并没有定义a 所以他会打印出“对象不存在”
[code="js"]var a;
if(a === undefined) {
alert("对象不存在");
}[/code]
至于这个,虽然我们定义了a, 但是并没有初始化, 没有初始化虽然他确实再上下文中占了一个位置,但是它没有初始化,这个时候系统依然认为他不是一个存在的对象。 所以依然会打印出“对象不存在”, 其实这是一个bug, 如何规避这个bug? 很简单。
[code="js"]var a == null;
if(a === undefined) {
alert("对象不存在");
}[/code]
这样,我们就不会再打印出“对象不存在”这句烦人的话了。
上述就是null 和 undefined 的区别了,欢迎反驳。
[/size]
很多人或许对null和undefined这两个关键词比较困惑。
希望看了这篇文章之后可以轻松的找到关键点。
做个小实验
[code="js"]alert(null == undefined); // true
alert(null === undefined); //false[/code]
这个小实验说明,如果这两个特殊类型都进行向下转型然后对比值的话是相等的。但是类型确实是不相等的,也就是说,他们两个实际上不是一个东西。
再做个小实验
[code="js"]function a(x) {
// 判断x是否传递
if(x == null) {
console.log("yes");
}else {
console.log("no");
}
};
a();
print : yes[/code]
这个例子的本意是判断参数x 是否传递, OK 我们不去传递,结果打印出了yes。我们想当然的认为好像这样是正确的做法。
大错特错了!what? 为什么?
好吧 我们换一种方式
[code="js"]a(null);
print: yes.[/code]
它依然打印出yes。或许你会觉得,这样很好啊,一箭双雕。又能判断有没有传递又能判断参数是不是空。
好吧,那我再举个例子!
[code="js"]function m1() {
alert("没有参数, 支线1");
};
function m2(x) {
alert("有参数,需要做操作, 支线2");
};
function sbss(x) {
// 本意判断没有传递
if(x == null) {
m1();
}else {
m2(x);
}
};[/code]
我发现我永远无法执行m2,这显然是不对的!
这时候我使用undefined来判断,效果就截然不同。
这就是为什么很多书上说为什么不推荐使用null来判断对象是否存在。对于对象存在的概念,再次引入一个小例子,将清楚的说明这个问题:
[code="js"]if(a === undefined) {
alert("对象不存在");
}[/code]
上面的小片段我们并没有定义a 所以他会打印出“对象不存在”
[code="js"]var a;
if(a === undefined) {
alert("对象不存在");
}[/code]
至于这个,虽然我们定义了a, 但是并没有初始化, 没有初始化虽然他确实再上下文中占了一个位置,但是它没有初始化,这个时候系统依然认为他不是一个存在的对象。 所以依然会打印出“对象不存在”, 其实这是一个bug, 如何规避这个bug? 很简单。
[code="js"]var a == null;
if(a === undefined) {
alert("对象不存在");
}[/code]
这样,我们就不会再打印出“对象不存在”这句烦人的话了。
上述就是null 和 undefined 的区别了,欢迎反驳。
[/size]