【问题标题】:shortcut to existentially define variable in javascript在javascript中存在定义变量的快捷方式
【发布时间】:2012-09-07 03:19:31
【问题描述】:

为了避免破坏现有变量,我有这样的代码

window.x = typeof x != "undefined" ? x : {}

这似乎是一种非常冗长的定义方式,但对于避免控制台错误是必要的。

我尝试了这个,它似乎工作正常。这样定义变量可以吗?

window.x=window.x||{}

甚至在全局范围内...

x=this.x||{}

【问题讨论】:

标签: javascript global-variables variable-assignment local-variables not-exists


【解决方案1】:

如果你使用这个结构:

window.x=window.x||{}

x 已定义但具有虚假值(零、空字符串、null、NaN、未定义,当然还有 false),那么该值将被新的空对象覆盖.如果这对您来说是可以接受的,因为您确信 x 将完全未定义或已定义为对象,那么可以确定,继续...

【讨论】:

    【解决方案2】:

    这些是非常不同的。

    首先,如果不检查typeof ... === 'undefined',您实际上将重写任何“虚假”值。但这是微不足道的,还有更多微妙的细微差别。

    window.x = typeof x != "undefined" ? x : {} 
    

    这会将一些x 的值(不一定是全局的,它可能是局部的xx 局部于某个外部函数)到全局的x (window.x)。当“本地”x 超出范围时,其值在赋值时仍将存储在window.x 变量中。

    window.x = window.x || {}
    

    这仅适用于window.x;即使我们现在忘记了虚假值,它仍然与第一个不同(它甚至不检查“本地”x 的存在)。

    x = this.x || {}
    

    this 是易失性的(事件处理程序、超时函数等等)时,这可能会完全失控,并且在“使用严格”模式下不允许在外部函数体中使用。

    【讨论】:

      【解决方案3】:

      这里是如何避免具体破坏console.log

      var console = window.console || {"log": function(){} };
      

      一般来说,如果你想避免默认(||) 或三元(?:) 运算符,请使用dispatch table

      /* Check for IE Mutation Event */
      var browser = "onpropertychange" in document;
      
      /* Map boolean values to variables */
      var detect = { "true": ie_param, "false": w3_param };
      
      /* Map string templates with escaped quotes to variables */
      var w3_param = [".addEventListener","\u0022DOMAttrModified\u0022",",false"];
      var ie_param = [".attachEvent","\u0022onpropertychange\u0022",""];
      
      /* Shadow array indices with key/value pairs */
      var api = {"event":0,"attribute":1,"state":2};
      
      /* Generate DOM lookup based on boolean value and matching string template */
      var result = "document.getElementsByTagName(\u0022body\u0022)[0]".concat(detect[browser][api.event], "(", detect[browser][api.attribute], ",alert", detect[browser][api.state], ")");
      
      /* Execute generated code */ 
      var lazy = Function(result);
      

      可选地指向元素数组的对象。该对象始终具有相同数量的键/值对,并且每个数组元素始终具有相同的大小。因此,数组索引可以按名称或按值访问。

      参考文献

      【讨论】:

        猜你喜欢
        • 2019-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-17
        • 2019-03-13
        • 2021-01-12
        • 2010-12-10
        • 1970-01-01
        相关资源
        最近更新 更多