如果我有内部对象的javascript数组,就像这样
articlesParams[itemId].properties.loaded
如果我尝试这样做:
if ( typeof articlesParams[itemId].properties.loaded != 'undefined' && ...) {
// do something...
}
我遇到过问题,如果articleParams [itemId] .properties未定义我得到一个错误:无法读取属性'属性'未定义的。
所以在这种情况下,我应该做一些像这样的蠢事:
if ( typeof articlesParams[itemId].properties != 'undefined' &&
typeof articlesParams[itemId].properties.loaded != 'undefined' && ...) {
// do something...
}
在PHP中是否有任何等效的PHP isset()?
答案 0 :(得分:1)
另一种方法就是这样做,这在JS中非常典型:
if (articlesParams[itemId] &&
articlesParams[itemId].properties &&
articlesParams[itemId].properties.loaded && ...) {
// do something...
}
或者这个:
var item = articlesParams[itemId];
if (item && item.properties && item.properties.loaded && ...) {
// do something...
}
需要注意的一点是,即使if
为loaded
,如果您希望执行false
语句,也不会有效。在这种情况下,最好使用undefined
检查typeof
是否为{{1}}。
答案 1 :(得分:1)
虽然详细,用于检查变量是否未定义的标准JavaScript惯用法确实使用typeof
,实际上看起来很像你写的。没有单独的JavaScript等效于PHP的isset()
。
只提供两项小改进:
!==
rather than !=
with typeof
. 像这样:
var item = articlesParams[itemId];
if (typeof item !== 'undefined') {
var props = item.properties;
if (typeof props !== 'undefined') {
var loaded = props.loaded;
if (typeof loaded !== 'undefined') {
// do something...
}
}
}
当然,如果loaded
,props
等未被重复使用,那么为它们定义变量的动机很小。
答案 2 :(得分:0)
正如大家所说,你可以链接很多类型的表达式。可替换地....
var result;
try {
result=typeof articlesParams[itemId].properties.loaded;
} catch(e) {
result='undefined';
}
if ('undefined'==result) {
// do something
}
但是您可能会将此应用于方法而不是变量,因此它应该抛出不同类型的异常。此外,它不能简单地作为一个函数包装(因为当您尝试调用函数时,将发生异常,而不是在函数体中)。而且,与链接的typeof表达式相比,您需要做的键入量或者易于理解代码的功能几乎没有节省。
这样做可能更合适:
try {
typeof articlesParams[itemId].properties.loaded;
} catch (e) {
// do something
}