当前位置:  开发笔记 > 编程语言 > 正文

为什么4不是Number的实例?

如何解决《为什么4不是Number的实例?》经验,为你挑选了2个好方法。

只是好奇:

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,NumberString.此外,对于具有属性的事物,还有Object类型.

例如,函数的类型为Object(它们只有一个名为[[Call]]的特殊属性),并且nullNull类型的原始值.这意味着typeof运算符的结果并不真正返回值的类型...

另外,JavaScript对象具有另一个名为[[Class]]的属性.你可以通过Object.prototype.toString.call(value)(这将返回)获得它.数组和函数的类型为Object,但它们的类是ArrayFunction.'[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;
    }
}

对于基元,它将以小写形式返回它们的类型,对于对象,它将以标题大小写返回它们的.

例子:

对于Number(例如)类型的 基元 ,它将返回,对于Number(例如)的包装器对象,它将返回;5'number' new Number(5)'Number'

对于函数,它将返回'Function'.

如果您不想区分原始值和包装器对象(无论是什么,可能是不好的原因),请使用typeOf(...).toLowerCase().

已知的错误是IE中的一些内置函数,它们被考虑'Object'并且'unknown'与某些COM +对象一起使用时返回值.



1> Christoph..:

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,NumberString.此外,对于具有属性的事物,还有Object类型.

例如,函数的类型为Object(它们只有一个名为[[Call]]的特殊属性),并且nullNull类型的原始值.这意味着typeof运算符的结果并不真正返回值的类型...

另外,JavaScript对象具有另一个名为[[Class]]的属性.你可以通过Object.prototype.toString.call(value)(这将返回)获得它.数组和函数的类型为Object,但它们的类是ArrayFunction.'[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;
    }
}

对于基元,它将以小写形式返回它们的类型,对于对象,它将以标题大小写返回它们的.

例子:

对于Number(例如)类型的 基元 ,它将返回,对于Number(例如)的包装器对象,它将返回;5'number' new Number(5)'Number'

对于函数,它将返回'Function'.

如果您不想区分原始值和包装器对象(无论是什么,可能是不好的原因),请使用typeOf(...).toLowerCase().

已知的错误是IE中的一些内置函数,它们被考虑'Object'并且'unknown'与某些COM +对象一起使用时返回值.



2> rkj..:

您可以尝试评估:

>>> typeof("a")
"string"
>>> typeof(new String("a"))
"object"
>>> typeof(4)
"number"
>>> typeof(new Number(4))
"object"

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有