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

我需要从数组中获取给定类型的所有元素,就像这样[{ a: 'a' }, 4, /a-z/, 6, [1, 2, 3], i=>i],当我提供类型 Number 作为 ofType(type) 的参数时,它返回 [ ] :


Array.prototype.ofType = function (type) {

    let newArr = []; 

    this.forEach(i => i instanceof type ? newArr.push(i) : newArr );

    return newArr

}

在其他情况下,就像[{ a: 'a' }, 4, /a-z/, 6, [1, 2, 3], i=>i].ofType(RegExp)它正常工作一样。


不负相思意
浏览 144回答 4
4回答

HUH函数

JavaScript 有数字原语和数字对象。数字原语不是instanceof任何东西,因为它不是对象,只有对象是某物的“实例”(“实例”是面向对象编程的艺术术语);所以instanceof对原语没有用。这就是typeof进来的地方。typeof原始数字的结果是"number"。由于instanceof期望构造函数作为右手操作数,因此您可以ofType根据它是获取函数还是字符串来使用函数分支,使用instanceof它是否是函数以及typeof是否是字符串。使用你的forEach循环:Array.prototype.ofType = function (type) {    let newArr = [];     if (typeof type === "string") {        this.forEach(i => typeof i === type ? newArr.push(i) : newArr );    } else {        this.forEach(i => i instanceof type ? newArr.push(i) : newArr );    }    return newArr;};但我不会forEach为此使用,我会使用filter:Array.prototype.ofType = function (type) {    let newArr;    if (typeof type === "string") {        newArr = this.filter(i => typeof i === type);    } else {        newArr = this.filter(i => i instanceof type);    }    return newArr;};另外,我强烈建议不要向 中添加可枚举属性Array.prototype,它会破坏错误地for-in在数组上使用循环的代码。改用Object.defineProperty:Object.defineProperty(Array.prototype, "ofType", {    value(type) {        let newArr;        if (typeof type === "string") {            newArr = this.filter(i => typeof i === type);        } else {            newArr = this.filter(i => i instanceof type);        }        return newArr;    },    writable: true,    configurable: true,    enumerable: false // This is the default, so you could leave it off});现场示例:Object.defineProperty(Array.prototype, "ofType", {    value(type) {        let newArr;        if (typeof type === "string") {            newArr = this.filter(i => typeof i === type);        } else {            newArr = this.filter(i => i instanceof type);        }        return newArr;    },    writable: true,    configurable: true,    enumerable: false // This is the default, so you could leave it off});console.log([1, "2", 3, "4"].ofType("number"));console.log([new Date, "2", new Date, "4"].ofType(Date));

蝴蝶刀刀

Javascript 有对象(即 new Number()、Array、Regexp, ....)和 Primitives('string', 1, true)。instanceof只适用于对象。因此,您的数字是原始数字,无法使用instanceof.请检查功能toType。toString这里借助 JavaScript 的-method的泛型版本call来获取对应变量的类。它以一种随意的方式解决您的问题。签出以下代码段:let data = [{ a: 'a' }, 4, /a-z/, 6, [1, 2, 3], i=>i, new Number(5)];Array.prototype.ofType = function (type) {  let toType = function(obj) {    return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()  }  return this.filter((item) => {    return toType(item) === type;  });}console.log(data.ofType('number'));console.log(data.ofType('array'));console.log(data.ofType('regexp'));

摇曳的蔷薇

只有对象可以instanceof <something>评估为true。每当你有x&nbsp;instanceof&nbsp;y如果x不是对象,它将始终评估为false.&nbsp;这在此处的规范中有所描述:如果 Type(O) 不是 Object,则返回 false。如果您使用数字对象而不仅仅是数字,它将按预期工作并评估为真:console.log( &nbsp;&nbsp;&nbsp;(new&nbsp;Number(5))&nbsp;instanceof&nbsp;Number&nbsp; &nbsp;&nbsp;&nbsp;);如果您想检查某些东西是否是特定的原始值,请typeof改用。

呼啦一阵风

您可以使用变量构造函数来确定类型(可用于基元和对象等),并对其进行过滤Array。就像是:Object.defineProperty(Array.prototype, "ofType", {&nbsp; value(isType = Number) {&nbsp; &nbsp; return this.filter(v => v.constructor === isType);&nbsp; },&nbsp; writable: true,&nbsp; configurable: true,});console.log([{a: 'a'}, 4, /a-z/, 6, [1, 2, 3], i => i].ofType());console.log([{a: 'a'}, 4, /a-z/, 6, [1, 2, 3], i => i].ofType(RegExp));.as-console-wrapper {&nbsp; top: 0;&nbsp; max-height: 100% !important;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript