javascript中存在定义变量的快捷方式

javascript中存在定义变量的快捷方式,javascript,global-variables,variable-assignment,local-variables,not-exists,Javascript,Global Variables,Variable Assignment,Local Variables,Not Exists,为了避免重击现有变量,我有这样的代码 window.x = typeof x != "undefined" ? x : {} 这似乎是一种非常冗长的定义方式,但却是避免控制台错误所必需的 我试过了,但似乎效果不错。这样定义一个变量可以吗 window.x=window.x||{} 甚至在全球范围内 x=this.x||{} 如果使用此构造: window.x=window.x||{} 并且x已定义,但有一个falsy值(零,空字符串,null,NaN,未定义,当然还有false),那么该

为了避免重击现有变量,我有这样的代码

window.x = typeof x != "undefined" ? x : {}
这似乎是一种非常冗长的定义方式,但却是避免控制台错误所必需的

我试过了,但似乎效果不错。这样定义一个变量可以吗

window.x=window.x||{}
甚至在全球范围内

x=this.x||{}

如果使用此构造:

window.x=window.x||{}

并且
x
已定义,但有一个falsy值(零,空字符串,null,NaN,未定义,当然还有false),那么该值将被一个新的空对象覆盖。如果您确信
x
将完全未定义或已定义为对象,因此您可以接受,那么请确定,继续…

这些是非常不同的

首先,不检查
typeof…='未定义的'
实际上,您将重写任何'falsy'值。但这并不重要,还有更微妙的细微差别

window.x = typeof x != "undefined" ? x : {} 
这会将一些
x
(不需要全局,它可能是局部
x
x
局部到某些外部函数)的值分配给全局
x
window.x
)。当“local”x超出范围时,其赋值时刻的值仍将存储在
window.x
变量中

window.x = window.x || {}
这仅适用于
window.x
;即使我们现在忘记了falsy值,它仍然与第一个不一样(它甚至不检查“local”
x
是否存在)


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

下面是如何避免碰撞
控制台.log
特别是:

var console = window.console || {"log": function(){} };
通常,如果要避免使用默认(| |)或三元(?:)运算符,请使用:

/* 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);
可以选择指向元素数组的对象。对象始终具有相同数量的键/值对,并且每个数组元素始终具有相同的大小。因此,可以通过名称或值访问数组索引

参考资料

可能会给你一些提示。。。
/* 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);