Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展js原型时,参数被强制类型_Javascript_Types - Fatal编程技术网

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这的确更干净