只是好奇:
为什么是这样?与字符串相同:
'some string' instanceof String 返回falsenew 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
Run Code Online (Sandbox Code Playgroud)
Chr*_*oph 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.'[objectClassname]'
上面给出的对象类的测试在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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于基元,它将以小写形式返回它们的类型,对于对象,它将以标题大小写返回它们的类.
例子:
对于Number(例如)类型的 基元 ,它将返回,对于类Number(例如)的包装器对象,它将返回;5'number' new Number(5)'Number'
对于函数,它将返回'Function'.
如果您不想区分原始值和包装器对象(无论是什么,可能是不好的原因),请使用typeOf(...).toLowerCase().
已知的错误是IE中的一些内置函数,它们被考虑'Object'并且'unknown'与某些COM +对象一起使用时返回值.
rkj*_*rkj 13
您可以尝试评估:
>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"
>>> typeof(4)
"number"
>>> typeof(new Number(4))
"object"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31520 次 |
| 最近记录: |