依赖对象类型检查Javascript似乎是多余的
Dependent Object Type Check Javascript Seems Redundant
有更好的方法吗?
如果我这样做:
if(typeof someObject[bar][foo] == "function"){
// Do something
}
如果bar
不存在,我得到一个someObject[bar][foo] is not an object
错误,它指的是someObject[bar]
。这意味着代码假定您知道someObj[bar]
已经定义。所以我的解决方案是:
if(typeof someObj[bar] === "object"){
if(typeof someObject[bar][foo] == "function"){
// Do something
}
}
如果我们想努力减少代码行,制作出好的、干净的、可读的代码,那么看起来就显得多余而丑陋。有没有更好的方法可以做到这一点,而不必经过两个if
点?我意识到这没什么大不了的,但我想知道是否有更好的方法。
恐怕没有简单的解释。
您希望对象在哪种情况下有条件地行为?给你举一个我使用的例子。。。继续前进。。。并试图在尽可能简单的同时。。。
- 你是否在一整套类似数组的对象中循环
- 你能相信这个对象,这样你就知道会发生什么了吗
- 不同数据类型的对象比较
[我需要一些编辑: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
}
此示例使用一个以"bar.foo"形式传递的路径,但您可以很容易地为数组['bar','fo']进行调整,使其成为传入的可变数量的参数。
这就是你的例子:
if(has(someObject, bar + '.' + foo)){
if(typeof someObject[bar][foo] == "function"){
// Do something
}
}
虽然这并没有减少这个例子的具体数量,但如果你有更长的搜索路径,这可能会显著减少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
}
if( someObject.bar && someObject.bar.foo && typeof someObject.bar.foo === "function" ){
...
}
或者相同,但具有更好的可见性表示方式:
if( someObject.bar
&& someObject.bar.foo
&& typeof someObject.bar.foo === "function" ){
...
}
相关文章:
- 从JS到PHP;另一个CORS问题(似乎是)
- 依赖对象类型检查Javascript似乎是多余的
- innerHTML似乎是唯一好的解决方案
- “TypeError: t.validation is undefined”,但它似乎是已定义的
- 图标不会显示,似乎是 webpack 的问题
- 与隔离作用域的 Angular 双向绑定似乎是单向的
- onsubmit=“返回检查表(this);” 对于我的表单来说似乎是空的
- Javascript变量似乎是静态的
- Ractive.js索引没有't似乎是被动的
- Javascript值似乎是交替的,而不是添加在一起的
- 高位图表列没有宽度(似乎是任意的)
- href属性之后的onclick属性是多余的吗
- 设置UTC日期似乎是在使用夏令时
- 咖啡描述:我可以't似乎是通过ID+子类来选择元素
- 为什么非dojo javascript错误似乎是由chrome中的dojo.xd.*.js引起的
- 我的代码是在$document.ready中调用的,但似乎是在加载DOM之前运行的.为什么?
- 源代码似乎是隐藏的
- 否则if语句对我来说似乎是合理的,但会破坏代码
- JavaScript函数关键字在声明式使用时似乎是准备好的
- 浏览器多人网络策略-这似乎是一个可行的解决方案