【发布时间】:2025-11-21 20:15:02
【问题描述】:
只是好奇:
- 4 instanceof Number => false
- new Number(4) instanceof Number => true?
这是为什么?与字符串相同:
-
'some string' instanceof String返回错误 -
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
【问题讨论】:
-
你必须使用
Number.prototype.isPrototypeOf(inp)- 如果正确使用你的方式也可以:inp.constructor === Number;它可能会失败,因为constructor只是原型的一个属性,可以被覆盖! -
我不确定我理解你所说的“可以被覆盖”是什么意思。这并不意味着我可以用其他构造函数覆盖构造函数(尝试过)。 Number.prototype.isPrototypeOf(4) 顺便返回 false,所以我不能用它来检查原始值的类型,对吗?
-
这就是重点(原始!== 包装原始)!检查构造函数是危险的,因为
obj['constructor'] = ???有效!我建议使用我的typeOf()函数;要同等对待基元和包装基元,请使用if(typeOf(x).toLowerCase() === 'string') -
根据我的经验,将任何内容分配给 Obj.constructor 不会更改其构造函数。事实上,这样的分配似乎根本没有任何作用。 ('hellowrld').constructor = Number 仍然返回带有 getType 的字符串。
-
当然试过你的 typeOf ,是的,它适用于原始类型。我想要所有类型的 1 个函数,无论是否原始。将尝试破坏 getType,如果我不能,我认为它是可用的。
标签: javascript