只是好奇:
为什么是这样?与字符串相同:
'some string' instanceof String
返回假new String('some string') instanceof String
=>是的String('some string') instanceof String
也返回假('some string').toString instanceof String
也返回假对于对象,数组或函数类型,instanceof运算符可以按预期工作。我只是不知道该如何理解。
[ 新见解 ]
Object.prototype.is = function() {
var test = arguments.length ? [].slice.call(arguments) : null
,self = this.constructor;
return test ? !!(test.filter(function(a){return a === self}).length)
: (this.constructor.name ||
(String(self).match ( /^function\s*([^\s(]+)/im )
|| [0,'ANONYMOUS_CONSTRUCTOR']) [1] );
}
// usage
var Newclass = function(){}; // anonymous Constructor function
var Some = function Some(){}; // named Constructor function
(5).is(); //=> Number
'hello world'.is(); //=> String
(new Newclass()).is(); //=> ANONYMOUS_CONSTRUCTOR
(new Some()).is(); //=> Some
/[a-z]/.is(); //=> RegExp
'5'.is(Number); //=> false
'5'.is(String); //=> true
value instanceof Constructor
与相同,Constructor.prototype.isPrototypeOf(value)
并且都检查[[Prototype]]链中value
是否存在特定对象。
字符串和数字是原始值,不是对象,因此没有[[Prototype]],因此,只有将它们包装在常规对象中(在Java中称为“装箱”),它才有效。
另外,正如您所注意到的,String(value)
并new String(value)
做不同的事情:如果您在不使用new
运算符的情况下调用内置类型的构造函数,则它们会尝试将参数转换(“投射”)为特定类型。如果使用new
运算符,它们将创建包装对象。
new String(value)
大致等同于Object(String(value))
,其行为与相同new Object(String(value))
。
有关JavaScript中的类型的更多信息:ECMA-262定义以下原始类型:Undefined,Null,Boolean,Number和String。此外,具有属性的事物的类型为Object。
例如,函数的类型为Object(它们只有一个称为[[Call]]的特殊属性),并且null
是类型为Null的原始值。这意味着typeof
运算符的结果不会真正返回值的类型。
另外,JavaScript对象还有另一个称为[[Class]]的属性。您可以通过获取它Object.prototype.toString.call(value)
(它将返回)。数组和函数的类型为Object,但它们的类为Array和Function。'[object
Classname
]'
上面给出的对象类的测试在instanceof
失败时可以工作(例如,当对象在窗口/框架边界之间传递并且不共享相同的原型时)。
另外,您可能想查看此改进的版本typeof
:
function typeOf(value) {
var type = typeof value;
switch(type) {
case 'object':
return value === null ? 'null' : Object.prototype.toString.call(value).
match(/^\[object (.*)\]$/)[1]
case 'function':
return 'Function';
default:
return type;
}
}
对于原语,它会返回其类型在较低的情况下,对于对象,它将返回自己的阶级在标题的情况下。
例子:
对于原语类型 数(例如5
),它将返回'number'
,为的包装对象类 号(例如new Number(5)
),它将返回'Number'
;
对于函数,它将返回'Function'
。
如果您不想区分原始值和包装对象(无论出于何种原因,可能是不好的原因),请使用typeOf(...).toLowerCase()
。
已知的错误是IE中的一些内置函数,与某些COM +对象一起使用时,会考虑这些错误'Object'
并提供返回值'unknown'
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句