我正在尝试使用YUI3 Test框架测试声明的已定义函数的存在。在Safari和FireFox中,尝试使用isNotUndefined,isUndefined或isFunction失败。我希望那些抛出可以由测试框架处理的异常。
Y
Object
Y.Assert
Object
Y.Assert.isNotUndefined(x, "fail message")
ReferenceError: Can't find variable: x
Y.Assert.isUndefined(x, "fail message")
ReferenceError: Can't find variable: x
Y.Assert.isFunction(x, "fail message")
ReferenceError: Can't find variable: x
但是,相反,我从来没有看到失败消息,并且其余的测试都没有运行,因为解释器阻碍了...这不会破坏这些功能的目的,或者是我误解了框架?
我的直觉告诉我,鉴于上面的代码,只有上面的代码,
Y.Assert.isUndefined(x, "fail message")
应该继续没有错误(因为x未声明)和
Y.Assert.isNotUndefined(x, "fail message")
应该记录消息“失败消息”(因为x未声明)。
但是,由于ReferenceError,没有办法(使用那些YUI3方法)来测试未声明的对象。相反,我留下了一些非常难看的断言代码。我不能用
Y.Assert.isNotUndefined(x)
ReferenceError: Can't find variable: x
或
Y.assert( x !== undefined )
ReferenceError: Can't find variable: x
离开了我
Y.assert( typeof(x) !== "undefined" ) // the only working option I've found
Assert Error: Assertion failed.
比
的可读性低得多 Y.Assert.isNotUndefined(x)
我再次问:这不会破坏这些功能的目的,还是我误解了框架?
所以
x
未声明,因此无法直接测试,而
var x;
声明它,但保留未定义。最后
var x = function() {};
既已声明又已定义。
我认为我缺少的是轻松说出的能力
Y.Assert.isNotUndeclared(x);
-Wil
答案 0 :(得分:2)
好的,昨天有点晚了我猜你现在明白了问题,你想要做的是检查一个变量是否已定义,对吗?
执行此操作的唯一方法是typeof x === 'undefined'
。
typeof
运算符允许不存在的变量与它一起使用。
因此,为了使其工作,您需要上面的表达式并将其插入到正常的true/false
断言中。
例如(尚未使用YUI3):
Y.Assert.isTrue(typeof x === 'undefined', "fail message"); // isUndefined
Y.Assert.isFalse(typeof x === 'undefined', "fail message"); // isNotUndefined
答案 1 :(得分:0)
背景:我希望能够区分:
x // undeclared && undefined
var x; // declared && undefined
var x = 5; // declared && defined
因此,这里的挑战是JavaScript不容易区分前2个案例,我希望能够为教学目的做。经过大量的阅读和阅读后,似乎确实有办法实现,至少在网络浏览器和全局变量的背景下(不是很大的限制,但......):
function isDeclared(objName) {
return ( window.hasOwnProperty(objName) ) ? true : false;
}
function isDefined(objName) {
return ( isDeclared(objName) && ("undefined" !== typeof eval(objName)) ) ? true : false;
}
我意识到使用eval可能不安全,但对于我将使用这些函数的严格控制的上下文,它没关系。所有其他人,请注意并查看http://www.jslint.com/lint.html
isDeclared("x") // false
isDefined("x") // false
var x;
isDeclared("x") // true
isDefined("x") // false
var x = 5;
isDeclared("x") // true
isDefined("x") // true