假设x是一个对象......这样做有什么好处:
if (typeof x.foo != "undefined")
VS。做
if (x.foo)
在我阅读这篇博文时出现了这个问题: http://www.nczonline.net/blog/2010/03/09/custom-events-in-javascript/
在他的例子中,他做了:
function EventTarget(){
this._listeners = {};
}
EventTarget.prototype = {
constructor: EventTarget,
addListener: function(type, listener){
if (typeof this._listeners[type] == "undefined"){
this._listeners[type] = [];
}
this._listeners[type].push(listener);
在这种情况下,this._listeners [type]将永远不会是除数组之外的任何东西 - 所以在这种情况下它不是真的更干净
addListener: function(type, listener){
if (!this._listeners[type]){
this._listeners[type] = [];
}
this._listeners[type].push(listener);
另外,作为一个附带问题,我不知道他为什么这样做:
EventTarget.prototype = {
constructor: EventTarget
当你调用new EventTarget()时,默认情况下构造函数是否已设置为EventTarget('this')?
答案 0 :(得分:10)
if (x.foo)
将无法运行
if (typeof x.foo !== "undefined") {
仅检查值是否为undefined
替代检查将是
if (x.foo !== undefined) {
和if (x.foo !== void 0) {
请注意undefined
可以作为局部变量覆盖
undefined = true
是一个有效的声明,会破坏您的所有代码。当然,你永远不会在生产中看到这个代码,所以你真的不必屏蔽它,它只是需要警惕。
我个人倾向于使用
if (x.foo != null) {
...
}
可以检查null
和undefined
。
<强> [[编辑]] 强>
在您的具体示例中,它可以是Array
或undefined
,因此!foo
是安全的。我个人更喜欢专门检查undefined
,以便用户知道我只希望它在未定义时运行,而不是在null
或false
或""
时运行。这使得代码更加明确/自我记录。
至于
EventTarget.prototype = {
constructor: EventTarget
如果使用新对象覆盖EventTarget.prototype
,则EventTarget.prototype.constructor
属性将丢失,需要重新设置。
如果您只是通过调用.constructor
扩展原型,则无需再次设置EventTarget.prototype.method = ...
。
答案 1 :(得分:2)
第一个明确检查x.foo
是undefined
,而if (x.foo)
正在检查x.foo
是否真实。