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

Javascript 为什么数字不是typeof和instanceof的数字实例?,javascript,Javascript,我需要从数组中获取给定类型的所有元素,如[{a:'a'},4,/a-z/,6,[1,2,3],I=>I],当我提供type Number作为ofTypetype的参数时,它返回[]: 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],当我提供type Number作为ofTypetype的参数时,它返回[]:

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],在TypeRegExp中,它可以正常工作。

JavaScript有数字原语和数字对象。数字原语不是任何事物的实例,因为它不是一个对象,只有对象是某个事物的实例,实例是面向对象编程的一个术语;因此instanceof对基本体没有用处

这就是typeof的用武之地。基元数的typeof结果是number

由于instanceof需要一个构造函数作为右操作数,因此可以根据ofType函数是获取函数还是获取字符串来进行分支,如果它是函数,则使用instanceof;如果它是字符串,则使用typeof。使用forEach循环:

但我不会用forEach来做这个,我会用过滤器:

另外,我强烈建议不要将可枚举属性添加到Array.prototype中,因为它会破坏错误地用于阵列上in循环的代码。改用Object.defineProperty:

实例:

Object.definePropertyArray.prototype,类型为{ 值类型{ 让纽瓦尔; 如果typeof type==字符串{ newArr=this.filteri=>typeof i==type; }否则{ newArr=this.filteri=>i instanceof type; } 返回newArr; }, 可写:对, 对,, enumerable:false//这是默认值,因此可以将其禁用 }; 日志[1,2,3,4],类型号; log[new Date,2,new Date,4].ofTypeDate JavaScript有数字原语和数字对象。数字原语不是任何事物的实例,因为它不是一个对象,只有对象是某个事物的实例,实例是面向对象编程的一个术语;因此instanceof对基本体没有用处

这就是typeof的用武之地。基元数的typeof结果是number

由于instanceof需要一个构造函数作为右操作数,因此可以根据ofType函数是获取函数还是获取字符串来进行分支,如果它是函数,则使用instanceof;如果它是字符串,则使用typeof。使用forEach循环:

但我不会用forEach来做这个,我会用过滤器:

另外,我强烈建议不要将可枚举属性添加到Array.prototype中,因为它会破坏错误地用于阵列上in循环的代码。改用Object.defineProperty:

实例:

Object.definePropertyArray.prototype,类型为{ 值类型{ 让纽瓦尔; 如果typeof type==字符串{ newArr=this.filteri=>typeof i==type; }否则{ newArr=this.filteri=>i instanceof type; } 返回newArr; }, 可写:对, 对,, enumerable:false//这是默认值,因此可以将其禁用 }; 日志[1,2,3,4],类型号; log[new Date,2,new Date,4].ofTypeDate 只有对象才能将instanceof evaluate设置为true。只要你有

x instanceof y
如果x不是对象,它的计算结果将始终为false。规范中对此进行了描述:

如果TypeO不是Object,则返回false

如果使用数字对象而不仅仅是数字,它将按预期工作并计算为true:

console.log 新编号5实例编号 ; 只有对象才能将instanceof evaluate设置为true。只要你有

x instanceof y
如果x不是对象,它的计算结果将始终为false。规范中对此进行了描述:

如果TypeO不是Object,则返回false

如果使用数字对象而不仅仅是数字,它将按预期工作并计算为true:

console.log 新编号5实例编号
; Javascript具有对象,即新编号、数组、Regexp等。。。。原语'string',1,true。instanceof仅适用于对象。因此,您的数字是一个原语,无法使用instanceof进行测试

请将函数签出为type。这里,借助JavaScript的call方法,使用toString的通用版本来获取相应变量的类。它以一种随意的方式解决你的问题。签出以下代码段:

设data=[{a:'a'},4,/a-z/,6,[1,2,3],i=>i,新的数字5]; Array.prototype.ofType=函数类型{ 让toType=functionobj{ 返回{}.toString.callobj.match/\s[a-zA-Z]+/[1].toLowerCase } 返回此项。filteritem=>{ 返回类型项===类型; }; } console.logdata.of type'number'; console.logdata.ofType'array';
console.logdata.ofType'regexp' Javascript具有对象,即新编号、数组、Regexp等。。。。原语'string',1,true。instanceof仅适用于对象。因此,您的数字是一个原语,无法使用instanceof进行测试

请将函数签出为type。这里,借助JavaScript的call方法,使用toString的通用版本来获取相应变量的类。它以一种随意的方式解决你的问题。签出以下代码段:

设data=[{a:'a'},4,/a-z/,6,[1,2,3],i=>i,新的数字5]; Array.prototype.ofType=函数类型{ 让toType=functionobj{ 返回{}.toString.callobj.match/\s[a-zA-Z]+/[1].toLowerCase } 返回此项。filteritem=>{ 返回类型项===类型; }; } console.logdata.of type'number'; console.logdata.ofType'array'; console.logdata.ofType'regexp' 您可以使用变量构造函数来确定基本体和对象都可以使用的类型,并过滤其中的数组。比如:

Object.definePropertyArray.prototype,类型为{ valueisType=编号{ 返回this.filterv=>v.constructor==isType; }, 可写:对, 对,, }; log[{a:'a'},4,/a-z/,6,[1,2,3],i=>i]。of type; log[{a:'a'},4,/a-z/,6[1,2,3],i=>i].ofTypeRegExp; .作为控制台包装{ 排名:0; 最大高度:100%!重要; } 您可以使用变量构造函数来确定基本体和对象都可以使用的类型,并过滤其中的数组。比如:

Object.definePropertyArray.prototype,类型为{ valueisType=编号{ 返回this.filterv=>v.constructor==isType; }, 可写:对, 对,, }; log[{a:'a'},4,/a-z/,6,[1,2,3],i=>i]。of type; log[{a:'a'},4,/a-z/,6[1,2,3],i=>i].ofTypeRegExp; .作为控制台包装{ 排名:0; 最大高度:100%!重要;
}原语不是任何事物的实例。使用Object.prototype.toString.callvar查找变量的类,这里的var是您要检查其类型的目标。顺便说一句,修改内置原型通常不是一个好主意。此外,您似乎正在寻找.filter->.filterofTypeNumber的正式版本,其中ofType=type=>x=>x instanceOf typePrimitives不是任何实例。使用Object.prototype.toString.callvar查找变量的类,这里的var是您要检查其类型的目标。顺便说一句,修改内置原型通常不是一个好主意。此外,您似乎正在寻找.filter->.filterofTypeNumber的正式版本,其中of type=type=>x=>x instanceOf type注意,检查构造函数不一定匹配所有子体。若你们有B扩展了A,那个么使用A类型只会产生A并过滤掉B。我从来没有使用过类sugar的东西,也很少觉得有必要扩展它。为了公平起见,它的类层次结构通常比较肤浅,在JavaScript中更是如此。它也不完全是一个类层次结构,因为它都是原型继承。您甚至可以让B有效地扩展A,但B使用A的构造函数,在这种情况下,检查构造函数属性将起作用。尽管如此,我还是想指出构造函数和instanceof之间的区别——后者检查整个原型链。嗯,您可以始终向扩展另一个类的类添加getter get super{return super.constructor;},如果您希望能够调查类层次结构。请注意,检查构造函数不一定匹配所有子体。若你们有B扩展了A,那个么使用A类型只会产生A并过滤掉B。我从来没有使用过类sugar的东西,也很少觉得有必要扩展它。为了公平起见,它的类层次结构通常比较肤浅,在JavaScript中更是如此。它也不完全是一个类层次结构,因为它都是原型继承。您甚至可以让B有效地扩展A,但B使用A的构造函数,在这种情况下,检查构造函数属性将起作用。尽管如此,我还是想指出构造函数和instanceof之间的区别——后者检查整个原型链。嗯,如果您希望能够研究类层次结构,您始终可以向扩展另一个类的类添加getter get super{return super.constructor;}。
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
});
x instanceof y