深入理解 Undefined

栏目: JavaScript · 发布时间: 7年前

内容简介:原文:翻译:疯狂的技术宅本文首发微信公众号:jingchengyideng

原文: http://davidshariff.com/blog/...

翻译:疯狂的技术宅

本文首发微信公众号:jingchengyideng

欢迎关注,每天都给你推送新鲜的前端技术文章

Undefined 这个概念听起来很简单,不过你知道应该怎样检查JavaScript中的变量或属性是否真的存在吗? 做这件事最好的方法是什么? 我们如何涵盖所有的边界值? 要回答这些问题,首先让我们来看看究竟什么是undefined......

undefined概述

变量的值被赋予一个类型,JavaScript中有几个内置的本地类型:

  1. Undefined
  2. Null
  3. Boolean
  4. String
  5. Number
  6. Object
  7. Reference
  8. etc…

首先看第一个,内置的Undefined类型只能有一个值,它称为 undefined 。 这是一个原始值,只要声明了变量,就会为其分配此 undefined 值,直到您以编程的手段为其分配不同的值。

此外,每当函数完成执行并返回一个没有给定的值时,它默认返回 undefined 。

var foo,
    bar = (function() {
        // do some stuff 
    }()),
    baz = (function() {
        var hello;
        return hello;
    }());

typeof foo; // undefined
typeof bar; // undefined
typeof baz; // undefined

因此,当声明一个变量但还未赋值时,它将被赋予 undefined 值。 我们还应该注意的是: undefined 本身是一个在全局范围内可用的变量/属性,它的值也是 undefined 。

typeof undefined; // undefined

var foo;

foo === undefined; // true

但是,全局变量 undefined 并不是保留字,因此它可以被重新定义。 幸运的是,从ECMA 5开始,就不允许重新定义 undefined 了,但是在以前的版本和旧版浏览器中,可以执行以下操作:

typeof undefined; // undefined
undefined = 99;
typeof undefined; // number

null到底代表了什么?

先看下面的代码:

null == undefined // true
null !== undefined // true

很多人对此都感到困惑,实际上很简单。 null 和 undefined 之间唯一真正的关系是:它们在类型强制过程中都判断为false。

之所以所以 null == undefined // true 是因为 == 没有执行严格的比较,因为在比较类型时使用 !== 更严格。 每当您把 null 看作是一个值时,它会始终以编程方式进行指定,并且在默认情况下从不设置。

访问对象的属性

当您尝试使用对象上一个不存在的属性时,也会得到 undefined ,如果您把不存在的属性作为函数使用有时会引发错误。

var foo = {};

foo.bar; // undefined
foo.bar(); // TypeError

如果您想分辨“有未定义值的属性”和“根本不存在的属性”这两者,应该怎么做呢?

使用 typeof 或者 === 都会给你一个 undefined 的值。

使用 in 运算符能够检查对象中是否存在某个属性:

var foo = {};

// undefined (这样不好,bar从未在window对象中被声明过)
typeof foo.bar;

// false (如果您不关心原型链,这样用)
'bar' in foo;

// false (如果你关心原型链,就这样用)
foo.hasOwnProperty('bar');

应该用typeof还是in/hasOwnProperty?

这很显然。一般来说,如果要测试是一个属性否存在,那么就用 in/hasOwnProperty ,如果要检查属性或变量的值,则用 typeof 。

通过例子进行总结

检查变量是否存在:

if (typeof foo !== 'undefined') {}

检查对象上的属性是否存在,无论是否已经为它分配了值:

// 存在于对象上,同时也检查原型
if ('foo' in bar) {}

// 直接存在于对象上,不检查原型
if (bar.hasOwnProperty('foo')) {}

检查对象上是否存在属性,并且属性具有值集(真值或假)

var bar = {
    foo: false
}; 

if ('foo' in bar && typeof bar.foo !== 'undefined'){ 
    // bar.foo存在,并且它包含以编程方式分配的值
}

本文首发微信公众号:jingchengyideng

欢迎关注,每天都给你推送新鲜的前端技术文章


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Pro Django

Pro Django

Marty Alchin / Apress / 2008-11-24 / USD 49.99

Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具