原文:https://dev.to/shafikshaon/interesting-facts-in-javascript-22nk

使用 JavaScript 开发时你会碰到很多有趣的事情,尽管你每天都使用 JavaScript,但仍有一些特性是你所不了解的,在这里我将介绍一些你可能没使用过的 JavsScript 特性。

NaN 是 number 类型

NaN是一个number类型且NaN不等于它自己。事实上,NaN不等于任何东西,如果要验证一个变量是否是NaN,可以使用isNaN方法。

> typeof(NaN)"number"> NaN === NaNfalse

null 是一个 object

null是一个对象。听起来奇怪,对吗?但这是事实。

> typeof(null)"object"

在下面这种情况,null没有值。因此,null不应该是Object的实例。

> null instanceof Objectfalse

可以定义 undefined

undefined不是 JavaScript 中的保留关键字。你可以为它指定值,而它也不会报任何语法错误。

> var some_var;undefined> some_var == undefinedtrue> undefined = 'i am undefined'

0.1 + 0.2 不等于 0.3

在 JavaScript 中,0.1 +0.2 == 0.3 会返回 false,这是因为 JavaScript 将浮点数存储为了二进制。

> 0.1 + 0.20.30000000000000004> 0.1 + 0.2 == 0.3false

Math.max()小于 Math.min()

Math.max()> Math.min()返回 false 看起来似乎是错误的,但实际上它是正确的。

> Math.max() > Math.min()false

如果没有给 min()max()传递参数,则返回以下值。

> Math.max()-Infinity> Math.min()Infinity

函数可以自行执行

创建一个函数,在调用其他函数时使用()语法就可以立即调用它。

> (function()  { console.log('I am self executing');  })();I am self executing

括号的位置问题

看下面的代码,第一个函数的return 语句后面没有东西,当调用时,它什么都不返回,而调用第二个函数则正常返回一个对象。这是因为,JavaScript 在 return 后面添加了一个 ;

> function foo() {   return   {      foo: 'bar'   }}> foo(); undefined> function foo() {   return {      foo: 'bar'   }}> foo(); {foo: "bar"}

缺少参数默认值

在 JavaScript 中,你可以通过以下方式设置参数默认值。

> function missingParamerCheck(name, age){    var name = name || 'John Doe'    var age = age    console.log(name)    console.log(age)}> missingParamerCheck('', 23)John Doe23> missingParamerCheck('Mike', 18)Mike18

没有整数(integer)数据类型

在 JavaScript 中,没有int(整数)数据类型。所有数字都是Number 类型。实际上它在内存中存储int数字的浮点值。

sort()函数类型自动转换

sort() 函数会自动将值转换为字符串,这就会发生下面奇怪的事情。

> [1,5,20,10].sort()(4) [1, 10, 20, 5]

不过,我们可以通过比较来解决上面出现的问题:

> [1,5,20,10].sort(function(a, b){return a - b});(4) [1, 10, 20, 5]

Arrays 和 Objects 的和

> !+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]9> {} + []0> [] + {}"[object Object]"> [] + []""> {} + {}"[object Object][object Object]"> {} + [] == [] + {}true