Javascript 扩展js原型时,参数被强制类型
我有一个函数,它的开头是这样的:Javascript 扩展js原型时,参数被强制类型,javascript,types,Javascript,Types,我有一个函数,它的开头是这样的: Object.prototype.search=function(str){ var o=this; var keys=Object.keys(o); var obj={}; str=str.toLowerCase(); var regEx=new RegExp(str,"ig"); ... etc. 注意-这只是一个快速而肮脏的函数,用于搜索某些数据。 我确信我想要的可以更有效地实现,但我只是想了解一些事情,等等 我创建了函数的其余部
Object.prototype.search=function(str){
var o=this;
var keys=Object.keys(o);
var obj={};
str=str.toLowerCase();
var regEx=new RegExp(str,"ig");
... etc.
注意-这只是一个快速而肮脏的函数,用于搜索某些数据。
我确信我想要的可以更有效地实现,但我只是想了解一些事情,等等
我创建了函数的其余部分,在控制台中第一次尝试时,我碰巧传递了一个数字。现在,数字作为字符串传递,我希望它是一个字符串,当我在控制台中运行“555.toLowerCase()
时,没有问题,会像预期的那样返回未更改的字符串。但是,当我尝试执行该函数时,它会抛出一个异常:
uncaught TypeError: str.toLowerCase is not a function
at Number.Object.search
所以我可以看到它正在把我的字符串转换成一个数字,但我不明白为什么。是因为我在处理一个内置对象吗?在我尝试str=str.toLowerCase()
的行中抛出错误。似乎解决方案是显式地将其声明为字符串,但我可以理解为什么需要这样做
有什么想法吗
编辑:这是我的代码-我知道这很恶心,但现在我有其他问题,我只是好奇,因为我不知道发生了什么:
Object.prototype.search=function(str){
const o=this;
var keys=Object.keys(o);
var values=Object.values(o);
var obj={};
var regex=new RegExp(str.toLowerCase(),"ig");
values=values.map((value,index)=>{
if(value){
value=value.toString();
return value.search(regex) !==-1 ? index : false;
}
return false;
}).filter(e=>!!e);
values.forEach((e,i)=>{
var key=keys[i];
var value=o[key];
obj[key]=value;
});
return obj;
};
编辑:下面是它的作用:
var x={"cat":"23","hat":"45"};
x.search("2");
Expected result: {"cat":"23"};
Not:在我包含值的null检查之后,我不再得到错误,但是我也没有得到我期望的结果。换句话说,我得到了一个对象,它被过滤了,但是如果参数被传递,它返回的值是“错误的”
编辑:好的-它现在是固定的。问题出在这行:
var key=keys[i]代码>。我使用的是键的索引,而不是值的索引。所以现在是正确的。但我仍然无法理解为什么我会在空检查之前出现错误。如果人们认为我应该关闭,我会关闭它,但我仍然不明白为什么会出现错误。你函数的更干净版本:
Object.defineProperty(Object.prototype,'search'{
值:函数(regex){
let found={};
for(让k在这里){
如果(this.hasOwnProperty(k)和®ex.test(this[k].toString())发现[k]=this[k];
}
发现退货;
},
可枚举:false
});
log({cat:23,hat:45}).search(/2/);
log({cat:23,hat:45}).search(/.*/)代码>其余的代码是什么样子的?请举例说明如何调用Object.prototype.search
是否确定在调用Object.search
时,传递的参数是字符串而不是数字?的确如此。@zynth666-updated这的确更干净