在讨论Javascript中的原始数据类型时,大多数人都知道字符串、数字到布尔的基本知识,这些基本类型相当简单,在常识上表现得很好。但是,本文将更多地关注独特的原始数据类型null和未定义,是什么使它们如此相似,但却自相矛盾。

1。理解null和未定义

在Javascript中,NULL是语言中的一个字面值和一个关键字来表示一个未识别的对象值。换句话说,这是用来表示一个没有值,但是你可以决定什么时候得到期望值。

虽然类似的定义实际上是非存在的价值(一种价值不存在),就是你已经丢失的东西。都是完全不变的,没有属性和方法,而不能将值赋给属性。事实上,当你试图访问或定义为未定义的一个属性,一个类型(TypeError)会引起的误差。

不表示值的布尔值是false,这意味着它们在条件上下文中被计算为false,如if语句。使用相等运算符(=)比较两个值和其他false值,它们不等于自己:


NULL = 0; / false
未定义的; / false
NULL = false; false
未定义的= false;false / false
空值=未定义



但是,它与其他相似性相似,但null和未定义是不等价的。作为唯一类型的唯一成员,未定义的是未定义类型,null是对象类型。使用同余运算符(= =)比较这两个值,需求类型和值是相等的,下面证明这一点:


空=未定义的
类空; / /对象
类定义; / / 的定义



上面显示的是null:这是一个对象,但它是空的,null是一个Javascript保留关键字。

此外,当null参与数值运算时,它的值将自动转换为0,因此下面的表达式将被计算得到正确的值:




123 + null;123
123 * NULL;0



定义的是一个全局对象的特殊属性(窗口),它的值是未定义的。但类型定义的返回定义。

虽然未定义有特殊的含义,但它确实是一个全局对象(窗口)的属性和属性:


警报('undefined'in窗口); / /输出:真
无功anobj = { };
警报('undefined'in anobj); / /输出:假



正如你所看到的,不确定的是窗口对象的一个属性,但不是它的anobj对象属性。

小心 uff1a

虽然定义的是一种属性,有着特殊的意义,它不是一个保留关键字的Javascript。当未参与任何数值计算,结果一定是南。事实上,楠是全局对象的另一个特殊的属性(窗口),和无穷大也。这些特殊的性能不保留关键字的Javascript!
对一个值或一个对象的验证是空的,需要使用它来确定是否= = =,无法确定null或未定义。


两。生产的定义

有很多方法生成一个未定义值的代码。当试图访问一个不存在的值时通常会遇到这种情况。在这种情况下,在Javascript的动态弱类型语言中,默认情况下只返回一个未定义的值,而不是错误。

1。如果未声明任何变量的初始值,则将有未定义的默认值:


var;默认值未定义。


2,当试图访问不存在的对象属性或数组项时,返回一个未定义的值:


var数组{ { 1, 2, 3 };
变量foo = array.foo; / / foo属性不存在,返回未定义
var =数组中的{ 5 };数组中的5个项没有索引,返回未定义



3,如果函数的返回语句被省略,或者返回语句不返回任何参数的未定义。


var值=(函数(){())

}())
VaR值=((){()函数
返回;
}())




4。调用函数时,不提供所需的参数,参数等于未定义的参数。


函数f(x){
console.log(X)
}
(f);未定义的



最后,未定义的是一个预定义的全局变量(与null关键字不同),初始化为未定义的值:


undefined'in / /真实的窗口;



在ECMAscript 5,这个变量是只读的,不是之前。

三、空用例

使用空的情况使他不同的主要方面,因为不同的定义,零被认为是更有用的。这就是为什么typeof运算符返回的对象时,它的作用在空值。最初的原因是它是静止的,经常被用来作为一个空的对象,作为一个空的对象,像一个占位符,类此行为被认定为一个错误,虽然它已经被修改,这一点具有兼容性的目的后保持不变。

一般来说,如果需要为变量或属性分配一个不变值,将其传递给函数,或者从函数返回null,null几乎总是最佳选择。

空的另一个可行的使用情况也被认为是很好的做法,这是一个显式指定变量无效(对象= null),当参考不再是必要的。通过将空值,明确参考假定对象没有引用其他代码是有效的,指定的垃圾收集,和确保内存回收。

四,提高未定义的性能

当我们在程序中使用未定义的值时,我们实际上是使用窗口对象的未定义属性,同样的,当我们定义一个变量但不给出它的初始值时,例如:


VaR值;


在这个时候,Javascript将设置其初始值window.undefined属性时,它是预编译的,所以当我们比较一个变量或值的定义,它实际上是以窗口对象定义的属性进行比较。在比较中,Javascript搜索窗口对象命名为未定义,然后比较两个操作数参考指针。

由于窗口对象的属性值是非常多的,它需要时间来寻找每个判断与定义的窗口对象的属性,一个功能,需要频繁而定义的,这可能是一个性能点。因此,在这种情况下,我们可以定义一个局部变量未定义加快未定义的比较。例如:


功能anyfunc(){
VaR的定义;
本地变量未定义自定义
如果(x =未定义)
范围/引用比较
当(y!=未定义)
范围/引用比较
};



在这方面,当定义的局部变量的定义,它的初始值是一个参考的window.undefined属性的值,该函数的作用域中定义的局部变量未定义的新的存在。在随后的比较操作,在编写Javascript代码的方式没有变化,但比较的速度是非常快。因为范围变量的数目远小于窗口对象的属性的搜索变量的速度将大大提高。

这就是为什么许多前端JS框架经常为自己定义一个本地未定义变量!

以上是本文的全部内容,希望能对大家有所帮助。