本文会向大家介绍一些javascript
中的冷门知识,看完后觉得涨姿势了别忘记点个赞哦。
立即执行函数
javascript
中拥有立即执行函数,使用立即执行函数是有很多好处的。如果你觉得我只是给你介绍众所周知的立即执行函数的两种写法,那你还是中规中矩的往下看吧。
首先,我们都知道立即执行函数有两种书写方式:
// 第一种
(function() {
alert("hello world");
})()
// 第二种
(function() {
alert("hello world");
}())
我相信很多人都应该不太理解为什么会这样写。(如果你明白,当我没说)
原理:以第一种书写形式讲解,第一个()
包裹着函数体本身,这样使函数体变成一个表达式。简单来说,就是被()
包裹的部分都会称为一个表达式;第二个()
是函数执行符号,就是执行前面的特殊的表达式。
如果你看了以上表述后还是不理解,或者半信半疑,我们可以通过以下操作来进行验证:
+ function() {
alert("hello world");
}()
是的,你没有看错,我们将第一个()
改写成了一个+
,我们知道+
作用后的内容会成为一个特殊的表达式,当我们运行代码时,并没有报错,相反,浏览器还会弹出警告框。其实我们将+
换成-
等其他运算符都是可以的。
需要注意的一点是,当我们单纯的将+
换成-
时函数是可以执行的,但换成*
、/
或%
这些运算时就会报错,这个时候我们只需要给*
、/
或%
前面加上任意一个数字就可以正常执行了。原因也很简单,因为单独的+
和-
也具有正负的运算,所以使用*
、/
或%
时,就也需要让它成为一个正确的表达式。例如:
javascript 1 * function() { alert("hello world"); }()
相信你看了上面的讲解后会对立即执行函数有了更加深刻的认识。
typeof
typeof 是一个操作符,可以返回数据的类型。我们都知道在使用一直未经声明的变量时都会报错,例如:
var a = 10;
console.log(b); // b is not defined
但是当我们在typeof()
中使用一个未声明的变量时就不会报错,并且返回undefined
。
var a = 10;
console.log(typeof(b)); // undefined
在ES6之前,我们可以认为typeof
是一个万能操作符,因为不论如何使用它都不会报错。但是在ES6之后,我们添加了let
,const
命令来声明变量,如果在let
或者const
命令初始化变量之前我们使用typeof
操作符,就会报错,如:
console.log(typeof a); // Cannot access 'a' before initialization
console.log(typeof PI); // Cannot access 'PI' before initialization
let a;
const PI = 3.14;
这种情形我们称为暂时性死区,正是暂时性死区的出现,typeof
再也不是一个万能运算符了。
undefined
与null
首先我们看一下这个例子:
console.log(a); // undefined
var a = 10;
console.log(a); // 10
我们都知道这是一个预编译的过程,通俗的来说就是变量声明提升,所以第一个打印结果应该为undefined
。但是你有没有这样试过:
console.log(a == null); // true
var a = 10;
没错,这就说明了undefined == null
,这个知识点我们还可以从一个地方发现:
console.log(undefined > 0); // false
console.log(undefined < 0); // false
console.log(undefined == 0); // false
console.log(null > 0); // false
console.log(null > 0); // false
console.log(null > 0); // false
我们发现了undefined
和null
都不大于、不小于且不等于0。
这时我们就可以大胆猜测他们是相等的:
console.log(undefined == null); // true
console.log(undefined === null); // false
需要注意的是undefined !== null
,因为undefined
表示的是未定义,而null
则表示一个空对象。
NaN
我们知道任意的数据都跟本身相等,但这里有一个特殊情况就是NaN
,需要记忆的是NaN
不与任意的数据相等,包括自己本身(谁都不认,包括自己):
console.log(NaN == NaN); // false
console.log(NaN == NaN); // false
===
我们知道对于===
两端完全相等的两个基本数据类型的值才能返回true
,这里出去上述的NaN
,但是我们看下面一种情形:
console.log(+0 === -0); // true
对于+0
和-0
却不然,这也可以算是===
的一个弊端,对于这一种情况我们可以使用Object.is()
来判断:
console.log(Object.is(+0, -0)); // false
同样我们知道NaN == NaN
返回false
,但是如果我们用Object.is()
来判断:
console.log(Object.is(NaN, NaN)); // true