只是好奇:
4 instanceof Number => false
new Number(4)instanceof Number => true?
为什么是这样?与字符串相同:
'some string' instanceof String
返回false
new String('some string') instanceof String
=>是的
String('some string') instanceof String
也返回false
('some string').toString instanceof String
也返回false
对于对象,数组或函数类型,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
Christoph.. 63
value instanceof Constructor
是相同的Constructor.prototype.isPrototypeOf(value)
和两者检查[[原型]] -链的value
特定对象的出现次数.
字符串和数字是原始值,而不是对象,因此没有[[Prototype]],因此它只有在将它们包装在常规对象(在Java中称为"装箱")时才有效.
另外,正如您所注意到的那样,String(value)
并new String(value)
执行不同的操作:如果在不使用new
运算符的情况下调用内置类型的构造函数,则会尝试将参数转换('cast')到特定类型.如果使用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; } }
对于基元,它将以小写形式返回它们的类型,对于对象,它将以标题大小写返回它们的类.
例子:
对于Number(例如)类型的 基元 ,它将返回,对于类Number(例如)的包装器对象,它将返回;5
'number'
new Number(5)
'Number'
对于函数,它将返回'Function'
.
如果您不想区分原始值和包装器对象(无论是什么,可能是不好的原因),请使用typeOf(...).toLowerCase()
.
已知的错误是IE中的一些内置函数,它们被考虑'Object'
并且'unknown'
与某些COM +对象一起使用时返回值.
value instanceof Constructor
是相同的Constructor.prototype.isPrototypeOf(value)
和两者检查[[原型]] -链的value
特定对象的出现次数.
字符串和数字是原始值,而不是对象,因此没有[[Prototype]],因此它只有在将它们包装在常规对象(在Java中称为"装箱")时才有效.
另外,正如您所注意到的那样,String(value)
并new String(value)
执行不同的操作:如果在不使用new
运算符的情况下调用内置类型的构造函数,则会尝试将参数转换('cast')到特定类型.如果使用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; } }
对于基元,它将以小写形式返回它们的类型,对于对象,它将以标题大小写返回它们的类.
例子:
对于Number(例如)类型的 基元 ,它将返回,对于类Number(例如)的包装器对象,它将返回;5
'number'
new Number(5)
'Number'
对于函数,它将返回'Function'
.
如果您不想区分原始值和包装器对象(无论是什么,可能是不好的原因),请使用typeOf(...).toLowerCase()
.
已知的错误是IE中的一些内置函数,它们被考虑'Object'
并且'unknown'
与某些COM +对象一起使用时返回值.
您可以尝试评估:
>>> typeof("a") "string" >>> typeof(new String("a")) "object" >>> typeof(4) "number" >>> typeof(new Number(4)) "object"