依赖对象类型检查Javascript似乎是多余的
有更好的方法吗 如果我这样做:依赖对象类型检查Javascript似乎是多余的,javascript,object,if-statement,typeof,Javascript,Object,If Statement,Typeof,有更好的方法吗 如果我这样做: if(typeof someObject[bar][foo] == "function"){ // Do something } 如果bar不存在,我得到的someObject[bar][foo]不是它所指的someObject[bar]错误。这意味着代码假定您知道定义了someObj[bar]。所以我的解决方案是: if(typeof someObj[bar] === "object"){ if(typeof som
if(typeof someObject[bar][foo] == "function"){
// Do something
}
如果bar
不存在,我得到的someObject[bar][foo]不是它所指的someObject[bar]
错误。这意味着代码假定您知道定义了someObj[bar]
。所以我的解决方案是:
if(typeof someObj[bar] === "object"){
if(typeof someObject[bar][foo] == "function"){
// Do something
}
}
如果我们想努力减少代码行并生成好的、干净的、可读的代码,那么看起来就显得多余和丑陋。是否有更好的方法可以做到这一点,而不必经过两个if
点?我意识到这没什么大不了的,但我想知道是否有更好的办法
if( someObject.bar && someObject.bar.foo && typeof someObject.bar.foo === "function" ){
...
}
或相同,但具有更好的可见性符号样式:
if( someObject.bar
&& someObject.bar.foo
&& typeof someObject.bar.foo === "function" ){
...
}
恐怕没有简单的解释
您希望对象在哪种情况下有条件地表现?给你一个我用的例子。。。前进。。。同时,为了尽可能的简单
- 你是否在一整套类似数组的对象中循环
- 你能信任这个对象,这样你就知道该期待什么了吗李>
- 不同数据类型的对象比较李>
[我需要一些编辑:s]
/**
* @description Get an object from a list of objects by searching for a key:value pair
* @param {Object} obj : -literal, json
* @param {String} val : the value you seek
* @param {String} key : the key
* @param {Boolean} isTypeComparison : if set to true, the key and value will be checked against it's type as well
*/
getObjectProperty: function (obj, val, key, isTypeComparison) {
var property, o;
for (property in obj) {
if (obj.hasOwnProperty(property)) {
if (typeof obj[property] === 'object') {
o = this.getObjectProperty(obj[property], val, key);
if (o) {
break;
}
} else {
// found a property which is not an object
if (isTypeComparison) {
if (property === key && obj[property] === val) {
// we got a match
o = obj;
break;
}
} else {
if (property == key && obj[property] == val) {
// we got a match
o = obj;
break;
}
}
}
}
}
return o || undefined;
},
为了给你的问题增加一些价值,在上面的所有这些循环中,你看到了与期望的斗争。我用这段代码搜索了一个ajax联系人列表,该列表附在一个列表上。因此,您肯定需要编写更多的代码来满足深度和信任要求。如果您概括了您的问题,您基本上是在问是否可以验证对象中的某种“路径”是否合法。我的方法是使用一个函数,该函数获取对象和所需的“路径”:
function has(obj, path){
var temp = obj;
var path = path.split('.');
for(var i = 0; i < path.length; i++){
if(temp[path[i]])
temp = temp[path[i]];//path still exists
else
return false;//path ends here
}
return true;//the whole path could be followed
}
虽然这并没有具体减少这个示例,但如果您有更长的搜索路径,这可能会显著减少链接在一起的if语句
您可以修改该函数,使其返回路径(如果存在)指定的值,而不是true,以便只处理一行:
function get(obj, path){
var temp = obj;
var path = path.split('.');
for(var i = 0; i < path.length; i++){
if(temp[path[i]] !== undefined)
temp = temp[path[i]];//path still exists
else
return undefined;//path ends here
}
return temp;//the whole path could be followed
}
if(typeof get(someObject, bar + '.' + foo) === 'function'){
//do something
}
函数get(对象,路径){
var-temp=obj;
var path=path.split('.');
对于(变量i=0;i
您是否尝试过如果(someObj.hasOwnProperty(bar)){}
?没有附加任何条件。。。当然要检查这个fddle@PashaB,这就是我的意思:看一下日志。@TimVermaelen这是真的,但是你不需要在以后检查这个函数是否存在于这个属性中吗?我的意思是,你会假设typeof
将返回“undefined”
,如果方法和属性都不存在,你知道吗?@FelipeTadeo你是在寻找类似if(someObj[bar]和&typeof obj[bar][foo]=='function')
?第一个条件检查元素是否不是未定义的
,空的
,0
。。。如果满足此条件,则检查另一部分,查看foo
是否为函数。数组的缩小版本作为第二个参数:函数get(o,p){for(i=0;i
function get(obj, path){
var temp = obj;
var path = path.split('.');
for(var i = 0; i < path.length; i++){
if(temp[path[i]] !== undefined)
temp = temp[path[i]];//path still exists
else
return undefined;//path ends here
}
return temp;//the whole path could be followed
}
if(typeof get(someObject, bar + '.' + foo) === 'function'){
//do something
}