繁体   English   中英

显式typeof ==“undefined”检查vs只是检查它的存在?

[英]explicit typeof == “undefined” check vs just checking for its existence?

假设x是一个对象......有什么好处:

 if (typeof x.foo != "undefined")

与做

 if (x.foo)

我在阅读这篇博文时提出了这个问题: http//www.nczonline.net/blog/2010/03/09/custom-events-in-javascript/

在他的例子中,他做了:

function EventTarget(){
  this._listeners = {};
}

EventTarget.prototype = {

  constructor: EventTarget,

  addListener: function(type, listener){
    if (typeof this._listeners[type] == "undefined"){
        this._listeners[type] = [];
    }

    this._listeners[type].push(listener);

在这种情况下,this._listeners [type]将永远不会是除数组之外的任何东西 - 所以在这种情况下它只是做得更干净

addListener: function(type, listener){
    if (!this._listeners[type]){
        this._listeners[type] = [];
    }

    this._listeners[type].push(listener);

另外,作为一个附带问题,我不知道他为什么这样做:

EventTarget.prototype = {

  constructor: EventTarget

调用new EventTarget()时,默认情况下构造函数是否已设置为EventTarget('this')?

注意真正的价值观

if (x.foo) x.foo是, if (x.foo)将不会运行

  • 空值
  • 未定义
  • “”
  • 0
  • 为NaN

if (typeof x.foo !== "undefined") {仅检查值是否undefined

替代检查将是

if (x.foo !== undefined) {if (x.foo !== void 0) {

要小心, undefined可以被覆盖为局部变量

undefined = true是一个有效的语句,将破坏您的所有代码。 当然,你永远不会在生产中看到这个代码,所以你真的不必屏蔽它,它只是需要警惕的东西。

我个人倾向于使用

if (x.foo != null) {
    ...
}

检查nullundefined的很多东西。

[[编辑]]

在您的具体示例中,它是一个Arrayundefined所以!foo是安全的。 我个人更喜欢专门检查undefined以便用户知道我只希望它在未定义时运行,而不是在它为nullfalse"" 这使代码更加明确/自我记录。

至于

EventTarget.prototype = {

  constructor: EventTarget

如果使用新对象覆盖EventTarget.prototype ,则EventTarget.prototype.constructor属性将丢失,需要再次设置。

如果只是通过调用EventTarget.prototype.method = ...扩展原型,则不需要再次设置.constructor

第一个显式检查x.foo是否undefined ,而if (x.foo)正在检查x.foo是否真实。

http://11heavens.com/falsy-and-truthy-in-javascript

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM