gpt4 book ai didi

javascript - 为什么 4 不是 Number 的实例?

转载 作者:行者123 更新时间:2023-12-03 09:46:12 24 4
gpt4 key购买 nike

只是好奇:

  • 4 instanceof Number => false
  • new Number(4) instanceof Number => true?

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

  • 'some string' instanceof String 返回 false
  • new String('some string') instanceof String => true
  • 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

最佳答案

value instanceof ConstructorConstructor.prototype.isPrototypeOf(value)相同并且都检查 value 的 [[Prototype]]-链对于特定对象的出现。

字符串和数字是原始值,而不是对象,因此没有 [[Prototype]],因此只有将它们包装在常规对象(称为“装箱”)中时它才会起作用在 Java 中)。

此外,正如您所注意到的,String(value)new String(value)做不同的事情:如果你调用内置类型的构造函数而不使用 new运算符,他们尝试将参数转换('cast')为特定类型。如果您使用 new运算符,他们创建一个包装器对象。

new String(value)大致相当于Object(String(value)) ,其行为方式与 new Object(String(value)) 相同.


关于 JavaScript 类型的更多信息:ECMA-262 定义了以下基本类型:UndefinedNullBooleanNumber 字符串。此外,Object 类型用于具有属性的事物。

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

此外,JavaScript 对象还有一个名为 [[Class]] 的属性。您可以通过 Object.prototype.toString.call(value) 获取(这将返回 '[object Classname ]' )。数组和函数是对象类型,但它们的类是数组函数

instanceof 时,上面给出的对象类测试有效。失败(例如,当对象在窗口/框架边界之间传递并且不共享相同的原型(prototype)时)。


此外,您可能想查看 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' ,对于 class Number 的包装器对象(例如 new Number(5) ),它将返回 'Number' ;

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

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

已知的错误是IE中的一些内置函数,被认为是'Object'返回值为 'unknown'与某些 COM+ 对象一起使用时。

关于javascript - 为什么 4 不是 Number 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20008430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com