原文发表在: holmeshe.me
本文是汉化重制版。
还记得早先用ajax胡乱做项目的时候踩过好多坑,然后对JS留下了“非常诡异”的印象。最近换了一个工作,工作语言就是JS。然后发现这个语言真不得了,前面后面都能干,基本成了全栈的同义词。所以刚好就趁这个机会系统学习一下这个语言。因为是给程序员看的,这个系列不会讲基本的“if-else”,循环,或者面向对象。相反,我会关注差异,希望能给您在Pull Request里走查代码式的学习体验!
比较 == V.S. ===
== 会做类型转换,然后比较值。所以在==眼里,字符串"1"是等于数字1的。
===不做类型转换,所以字符串和数字都不用比,就直接是不等了。
打上码:
//comparing string with number
var res = "1" == 1;
alert(res); //=>true
res = "1" === 1;
alert(res); //=>false
//comparing two special type with the same value
res = null == undefined;
alert(res); //=>true
res = null === undefined;
alert(res); //=>false
//comparing number with object
var obj = new Number(123);
res = 123 == obj
alert(res) //=>true
res = 123 === obj
alert(res) //=>false
运行结果:
true
false
true
false
true
false
这里要注意 NaN === NaN 结果永远是 false,所以要用 isNaN() 来判断该值。
上个“等于口诀表”:
===
==
来源:github
NaN, undefined 和 null
简单来说,
- undefined:由JS引擎在运行时赋予的特殊值,表示一个未被初始化;
- null:由程序员赋值,用来表示这个变量已经不用了;
- NaN:则是用于表示出错(还是引擎赋值)。
在实际编程中,
- 出现undefined:一般说明你要看看程序初始化部分是不是有没赋值的变量;
- 出现null:一般可以搜搜程序中有没有强行=null
- 出现NaN:一般要看下函数里面的逻辑,和传参是否合法。
所以把这些异常的"木有"值进一步细分其实是可以简化bug定位过程的。您觉得呢?
打上码:
var res;
alert(res);
res = null;
alert(res);
res = parseFloat("geoff");
alert(res);
res = 1/0;
alert(res);
运行结果:
undefined
null
NaN
infinity
注意,网上很有些人说n/0结果是NaN,这个结论在我们这是不对的。
JS是一个非常灵活的语言,但灵活性很多时候会带来混乱。比如一些怪异的未初始化变量,
打上码:
var res = [1,2,3];
alert(res[10]);
function doSomething(first, second, optional) {
alert(optional);
}
doSomething(1,2);
运行结果:
undefined
undefined
上面的示例增加了两种变量未初始化的情况,数组越界,和函数调用时省略参数。在这些情况中,涉及的变量都会被设置成undefined。
好,今天先写到这。如果您觉得这篇不错,请在知乎上关注本专栏。也可以去Medium上随意啪啪啪我的其他文章。感谢阅读!👋