【问题标题】: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 的值(不一定是全局的,它可能是局部的x 或x 局部于某个外部函数)到全局的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);
可选地指向元素数组的对象。该对象始终具有相同数量的键/值对,并且每个数组元素始终具有相同的大小。因此,数组索引可以按名称或按值访问。
参考文献