2

存在性定义变量,以避免现有重挫变量,我有这样的快捷方式在JavaScript

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

这似乎是一个很长篇大论方式来定义一些代码,但要避免控制台错误。

我试了一下,而且它似乎工作正常。定义一个这样的变量可以吗?

window.x=window.x||{} 

甚至在全球范围内...

x=this.x||{} 
+2

[Wikipedia page](http://en.wikipedia.org/wiki/Existentialism)可能会给你一些提示...... – nnnnnn

回答

0

如果您在使用此结构:

window.x=window.x||{} 

而且x定义,但有一个falsy值(零,空字符串,null,NaN,未定义,当然也是false),那么该值将被一个新的空对象覆盖。如果这对你是可以接受的,因为你确信x要么是完全未定义的,要么已经被定义为一个对象,那么确定,继续...

1

这些是非常不同的。

首先,没有检查typeof ... === 'undefined'你基本上会重写任何'falsy'值。但这是微不足道的,还有更微妙的细微差别。

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

这将分配的一些x值(不是必需的全球性的,它可以是本地或x本地x一些外功能),以全球xwindow.x)。当“本地”x将超出范围时,其在分配时的值仍将存储在window.x变量中。

window.x = window.x || {} 

这只适用于window.x;即使我们现在忘记了关于falsy的值,它仍然不能像第一个那样工作(它甚至不检查'local'x的存在)。

x = this.x || {} 

而这一次可能会完全失控时this是挥发物(事件处理,超时功能,仅举几例),并且不会外部函数中的身体在‘使用严格’模式被允许。

0

这里是如何避免重挫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); 

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

参考