这是识别javascript对象类型的好方法吗?
显然,无论是这是识别javascript对象类型的好方法吗?,javascript,object,types,Javascript,Object,Types,显然,无论是instanceof还是typeof都不能正确识别每个javascript对象的类型。我已经想出了这个函数,我正在寻找一些反馈: function getType() { var input = arguments[0] ; var types = ["String","Array","Object","Function","HTML"] ; //!! of the top of my head for(var n=0;
instanceof
还是typeof
都不能正确识别每个javascript对象的类型。我已经想出了这个函数,我正在寻找一些反馈:
function getType() {
var input = arguments[0] ;
var types = ["String","Array","Object","Function","HTML"] ; //!! of the top of my head
for(var n=0; n < types.length; n++) {
if( input.constructor.toString().indexOf( types[n] ) != -1) {
document.write( types[n] ) ;
}
}
}
函数getType(){
变量输入=参数[0];
变量类型=[“字符串”、“数组”、“对象”、“函数”、“HTML”];/!!在我的头顶
对于(var n=0;n谢谢你的阅读 在某些情况下,依赖于
instanceof
操作符是不正确的
一个已知的问题是,it wonk不能在跨帧环境下工作
typeof
操作符不是很有用,并且存在一些实现错误,例如在Chrome或Firefox 2.x中,RegExp
对象被检测为“function”
,因为它们使可调用(例如/foo/(str);
)
constructor
属性可以被篡改,您永远不应该对其过于信任
最后,该方法依赖于实现,这意味着实现可能甚至不包括函数的字符串表示中的函数名
我正在构建一个简单但健壮的类型检测函数,它使用typeof
作为基本值,并依赖于对象的内部属性
所有对象都具有此属性,实现在内部使用它来检测对象的类型,它是完全不可变的,并且只能通过以下方法访问:
用法:
//...
if (typeString(obj) == 'array') {
//..
}
if (sys.isArray(myObject)) doStuff();
实施:
function typeString(o) {
if (typeof o != 'object')
return typeof o;
if (o === null)
return "null";
//object, array, function, date, regexp, string, number, boolean, error
var internalClass = Object.prototype.toString.call(o)
.match(/\[object\s(\w+)\]/)[1];
return internalClass.toLowerCase();
}
此函数的定义更加严格,因为它只返回ECMAScript规范中描述的内置对象类型
可能的输出值:
基本体:
“数字”
“字符串”
“布尔值”
“未定义”
“null”
“对象”
[[Class]]
)
“函数”
“数组”
“日期”
“regexp”
“错误”
- 类似的问题几天前就出现了。我打开jQuery1.4.2,看看它是如何在那里实现的。这是我到目前为止的结果,你可以检查其余的我确定:
(function() {
// Define the base sys namespace
this.sys = function() { };
var toString = Object.prototype.toString;
//from jQuery 1.4.2
sys.isFunction = function(obj) {
return toString.call(obj) === "[object Function]";
}
//from jQuery 1.4.2
sys.isArray = function(obj) {
return toString.call(obj) === "[object Array]";
}
}
用法:
//...
if (typeString(obj) == 'array') {
//..
}
if (sys.isArray(myObject)) doStuff();
看起来很像CMS的技术。是的。他们似乎都使用相同的机制。无论如何,谢谢。你已经赢得了74K的声誉,CMS。好东西。谢谢你能详细解释一下为什么使用
构造函数属性不是一个好主意,因为它可能被“篡改”?@Diobeus,谢谢@FK82我的意思是构造函数
属性是可写的,格式错误的对象可能会给您错误的结果,例如(var re=/foo/;re.constructor=null;
),在自定义类型上实现继承时,您也可能设置错误的构造函数
。@CMS好的,再次感谢。因此,继承会破坏构造函数。毕竟javascript中没有java,是吗?:-)@FK82:重写构造函数函数的整个原型
成员可能会破坏构造函数
属性。。。是的,JavaScript更像是“C语言中的Lisp”:-)