对象.原型函数来测试它是否被定义/不为空
Object.prototype function to test if it is defined / not null?
我只是想避免这个
if(typeof myObject !== 'undefined' && myObject !== null)
{
//safely use myObject
}
所以我试了这个
Object.prototype.doesExist = function() {
return (typeof this !== "undefined" && this !== null);
}
后接
if(myObject.doesExist()){
//safely use myObject
}
当然结果是myObject没有定义
我明白为什么这不起作用,但是有没有人想出一个更好的方法来完成我正在寻找的?
如评论所述,null
或undefined
不是Object
的实例,因此它们不会继承Object的原型。
解决方案1:使用静态对象方法,这是一个函数式的解决方案,尽管不太干净,与您尝试做的类似。
Object.exists = function(obj) {
return typeof obj !== "undefined" && obj !== null;
}
if (Object.exists(myObject)) {
// safely use myObject
}
解决方案2:如果您知道期望的对象类型,则使用instanceof
。如果你要在if语句中访问ClassName的接口,建议这样做。
if (myObject instanceof ClassName) {
// safely use myObject
}
例子:
function A() {}
var a = new A(), b;
> a instanceof A
true
> a instanceof Object
true
> b instanceof A
false
> b instanceof Object
false
> null instanceof A
false
> null instanceof Object
false
> undefined instanceof A
false
> undefined instanceof Object
false
我认为这可以处理你的用例
松散相等可以在没有猴子补丁的情况下获得期望的结果,尽管它需要一些javascript的语义知识:
myObject == null; //true for null and undefined, false for all others
也可以使用逻辑和作为保护操作符:
if ((myObject != null) && myObject.someMethod && myObject.someMethod());
显然,你可以批评上面的可读性,但因为javascript转储到相同的全局命名空间的一切,我将非常小心,甚至添加静态方法到Object
我知道您可能不喜欢全局函数,但我相信这是唯一的解决方案。
function isObject (v) {
return (typeof v === 'object' && v != null);
// (Technically null is an object, but is often considered a non-object)
}
if (isObject(myObject)) {
//safely use myObject
}
相关文章:
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 用于检查数组中是否存在元素的javascript自定义方法
- 是否排除节点中错误堆栈的第一行?/节点中的自定义错误类型
- 如何在JavaScript中检查变量是否为null和/或未定义
- 检查对象的所有属性是否未定义
- 如何查看变量名称是否已在Javascript中定义
- 注册后是否可以定义HTML5自定义元素中的生命周期回调
- 是否可以替换或自定义getUserMedia提示
- 是否可以在定义对象时访问对象值
- 是否可以在AlloyUI中拥有自定义连接器
- 是否可以通过Primefaces 3.3的自定义对话框取消Ajax请求
- AngularJs 检查是否未定义和空的最佳实践
- 如何检查服务器是否返回未定义然后忽略它
- 我是否必须在每个文件中引用 TypeScript 定义
- 如何确定控件/插件是否从 CRM 2011 中功能区上的自定义按钮触发
- 检查未定义是否不起作用
- 这些JavaScript包含定义是否有区别
- angular是如何定义是否应该使用某个编译器的?
- 检查变量(定义)是否在JavaScript中不起作用
- Raphael / SVG路径定义是否总是以'M'开头?(如果不是,这样的路径的原点是否总是0,0?)