资讯专栏INFORMATION COLUMN

【译】javascript中的undefined可以被重写

codeKK / 1900人阅读

摘要:然而,这一行为在年的被修复了。在现代浏览器中,的值将不能被重写我们需要支持或者更古老的浏览器怎么办通常指令是安全的。都会计算得到另外一种选择,你可以使用操作符安全地检查是否已经被赋值。虽然没有被声明,仍然会说他是。

众所周知,当声明一个变量,并且没有给赋值的情况下,它的初始值是 undefined
但是在javascript中,怎么检查一个值是否为 undefined 呢?

简单的回答

在现代浏览器中,你可以安全的直接比较将变量是与 undefined 进行比较

if (name === undefined) {
    //...
}

一些人反对直接使用 undefined 变量进行比较,因为在旧的浏览器中它允许被重新赋值,像下面这样:

undefined = "test"

在被重新赋值后,直接使用 undefined 将不能正确的检测一个变量是否被赋值。
然而,这一行为在2009年的ECMAScript 5被修复了。

15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
undefined 的值是 undefined。这个属性有不可写不可枚举不可配置的特性。

在现代浏览器中,undefined的值将不能被重写

我们需要支持ie8或者更古老的浏览器怎么办

通常undefined指令是安全的。在应用中并没有什么理由需要修改undefined的值。
Thomas的回答使用具有说服力的推理,论证了这一点。

我没有听从人们告诉我,我不应该使用setTimeout,因为有人可以(这样用):

window.setTimeout = function () {
    alert("Got you now!");
};

下面一行,它可以重新定义参数,替换原始值,使 raw === undefined 看起来是假的。

如果你仍然很在意,有两个方法在即使全局 window.undefined 已经被重写的情况下,依然可以检查一个值是否为 undefined

if (name === void(0)) {
    //...
}

在这个例子中 0 没有任何实际意义,你想要使用 1 or function(){}也无所谓。 void(anything)都会计算得到undefiend

另外一种选择,你可以使用typeof操作符安全地检查是否已经被赋值。你可以检查一个值的类型是否为 "undefined" 代替与全局的 undefined 比较.

if (typeof name === "undefined") {
    //...
}

注意第二个选择与前一个方案稍微有点差异。虽然name没有被声明,typeof 仍然会说他是 undefined。如果你直接使用 nameundefinedor void(0)你会得到ReferenceError异常的错误.

但是不要直接使用void(0)

在代码中避免使用void(0)或者 typeof x === "undefined",这些表达式不是自解释的,应该包装在isUndefined function函数中,像这样:

function isUndefined(value){
    //获得undefined,保证它没有被重新赋值
    var undefined = void(0);
    return value === undefined;
}

许多的工具库已经部署了这个方法,例如: _.isUndefined,underscore中的isUndefined方法

原文地址
原文标题:在javascript中怎样检查undefiend

初次翻译,如有错误,欢迎指正

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80518.html

相关文章

  • JavaScript中的执行上下文和堆栈是什么?

    摘要:每次调用函数时,都会创建一个新的执行上下文。理解执行上下文和堆栈可以让您了解代码为什么要计算您最初没有预料到的不同值的原因。 首发:https://www.love85g.com/?p=1723 在这篇文章中,我将深入研究JavaScript最基本的部分之一,即执行上下文。在这篇文章的最后,您应该更清楚地了解解释器要做什么,为什么在声明一些函数/变量之前可以使用它们,以及它们的值是如何...

    miguel.jiang 评论0 收藏0
  • [] 为什么原型继承很重要

    摘要:使用构造函数的原型继承相比使用原型的原型继承更加复杂,我们先看看使用原型的原型继承上面的代码很容易理解。相反的,使用构造函数的原型继承像下面这样当然,构造函数的方式更简单。 五天之前我写了一个关于ES6标准中Class的文章。在里面我介绍了如何用现有的Javascript来模拟类并且介绍了ES6中类的用法,其实它只是一个语法糖。感谢Om Shakar以及Javascript Room中...

    xiao7cn 评论0 收藏0
  • 搞懂JavaScript的Function.prototype.bind[]

    摘要:搞懂的译可能是初学的人最不关心的函数,当你意识到需要保持在其他函数中的上下文,实际上你需要的是。这就是问题所在。整合事件绑定和一个重大提高就是,和等等。然而,并没有原生添加事件到多个节点的方式。能力有限,如有疑问,纰漏,速指出,感谢你 搞懂JavaScript的Function.prototype.bind[译] Ben Howdle binding可能是初学Javascript的人最...

    Pandaaa 评论0 收藏0
  • 】45种Javascript技巧大全

    摘要:对进行序列化和反序列化避免使用和构造函数使用和构造函数是非常昂贵的操作,因为每次他们都会调用脚本引擎将源代码转换成可执行代码。 原文:45 Useful JavaScript Tips, Tricks and Best Practices 译文:45个有用的JavaScript技巧,窍门和最佳实践 译者:dwqs 在这篇文章中,我将分享一些JavaScript常用的技巧,窍门和最...

    hufeng 评论0 收藏0
  • 」编写更好的 JavaScript 条件式和匹配条件的技巧

    摘要:通常情况下,面向对象编程让我们得以避免条件式,并代之以继承和多态。同时,使用条件式简写来表示值。因此,对于以这种方式编写的代码,你需要使用进行编译。 原文地址:Tips and Tricks for Better JavaScript Conditionals and Match Criteria 原文作者:Milos Protic 介绍 如果你像我一样乐于见到整洁的代码,那么你...

    honmaple 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<