为什么4不是Number的实例?

KooiInc:

只是好奇:

  • 4 instanceof Number => false
  • new Number(4)instanceof Number =>是吗?

为什么是这样?与字符串相同:

  • '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定义以下原始类型:UndefinedNullBooleanNumberString此外,具有属性的事物的类型为Object

例如,函数的类型为Object(它们只有一个称为[[Call]]的特殊属性),并且null是类型为Null的原始值这意味着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;
    }
}

对于原语,它会返回其类型较低的情况下,对于对象,它将返回自己的阶级标题的情况下

例子:

  • 对于原语类型 (例如5),它将返回'number',为的包装对象 (例如new Number(5)),它将返回'Number';

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

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

已知的错误是IE中的一些内置函数,与某些COM +对象一起使用时,会考虑这些错误'Object'并提供返回值'unknown'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么数字不是typeof和instanceof的Number实例?

为什么Kleisli不是Monoid的实例?

为什么Exception不是Throwable实例?

为什么iter不是实例的方法而__iter__是实例?

为什么使用1 << 4而不是16?

为什么这不是google.maps.Map的地图实例?InvalidValueError:setMap:不是Map的实例;

为什么会有模板条件:不是CfnCondition的实例?

为什么SimpUserRegistry不是EC2实例正常工作

为什么索引一维数组的实例是BinaryExpression而不是MethodCallExpression?

为什么这会编译对类而不是实例的引用?

为什么toBinaryString不是Integer类中的实例方法?

为什么在 Java 中不使用实例对象而不是 ThreadLocal?

为什么拆箱数组不是可折叠实例?

为什么要使页面对象实例化而不是静态?

为什么在原型而不是构造函数中声明实例属性?

为什么Free在Scalaz 7.1.5中不是monad实例?

为什么`_isurl`是实例方法而不是numpy`DataSource`的静态方法?

为什么在括号方法中索引 self 而不是实例变量

为什么ZipList不是List的默认应用实例

为什么反射的GetProperty()或GetField()不是实例或扩展方法?

为什么RWST ...可能不是MonadReader,MonadState,MonadWriter的实例

为什么x-= x + 4返回-4而不是4

为什么要自动注册apicontroller的所有实例而不是我指定的实例

为什么NumPy int不是Python int的实例,而NumPy float是Python float的实例?

为什么常量会约束结构实例而不是类实例的属性?

为什么方法应该返回一个新实例,而不是修改实例本身?

为什么以下代码的输出是 4 而不是元组 (4,)?

当使用execute而不是invoke运行任务时,为什么args不是Rake :: TaskArguments的实例?

为什么List <Number>不是List <Object>的子类型?