为了避免破坏现有变量,我有这样的代码
window.x = typeof x != "undefined" ? x : {}
这似乎是一种很长时间的定义方式,但是必须避免控制台错误。
我试了一下,似乎工作正常。可以定义这样的变量吗?
window.x=window.x||{}
甚至在全球范围内......
x=this.x||{}
答案 0 :(得分:1)
这些非常不同。
首先,在不检查typeof ... === 'undefined'
的情况下,您将基本上重写任何'falsy'值。但这是微不足道的,还有更微妙的细微差别。
window.x = typeof x != "undefined" ? x : {}
这会将某些x
(不一定是全局的,可能是某个外部函数的本地x
或x
}的值分配给全局x
({ {1}})。当'local'x超出范围时,其值在分配时仍将存储在window.x
变量中。
window.x
仅适用于window.x = window.x || {}
;即使我们现在忘记了关于虚假价值的事情,它仍然不能与第一个一样(它甚至不检查'本地'window.x
存在)。
x
当x = this.x || {}
易变(事件处理程序,超时函数,仅举几例)时,这个可能完全失控,并且在'use strict'模式下不允许在外部函数体内。
答案 1 :(得分:0)
如果您使用此构造:
window.x=window.x||{}
并且x
是定义但有一个假值(零,空字符串,null,NaN,未定义,当然是假)然后该值将被新的覆盖空对象。如果您认为这是可以接受的,因为您确信x
将完全未定义或已定义为对象,那么请确定,继续......
答案 2 :(得分: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);
一个可选地指向元素数组的对象。对象始终具有相同数量的键/值对,并且每个数组元素始终具有相同的大小。因此,可以按名称或值访问数组索引。
<强>参考强>