扩展js原型,参数被强制类型化

时间:2019-03-07 18:53:40

标签: 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.

注意-这只是用于搜索某些数据的快速而肮脏的功能。  我确定可以更有效地实现我想要的东西,但是我只是想了解一些东西,等等。

我创建了该函数的其余部分,在我第一次尝试在控制台中时,我碰巧将其传递了一个数字。现在,数字以字符串形式传递,我希望它是一个字符串,当我在控制台中运行"555".toLowerCase()时,没问题,返回的字符串不变。但是,当我尝试执行该函数时,它将引发异常:

uncaught TypeError: str.toLowerCase is not a function
at Number.Object.search

所以我可以看到它正在将我的字符串转换为数字,但是我不明白为什么。是因为我正在处理内置对象吗?错误在我尝试str=str.toLowerCase()的行上引发。似乎解决方案是将其显式声明为字符串,但是我明白了为什么需要这样做。

有什么想法吗?

编辑:这是我的代码-我知道它很讨厌,但是现在我遇到了其他问题,我只是好奇,因为我不知道发生了什么事情:< / p>

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"};

不:在包括了对值的空检查之后,我不再得到错误,但是我也没有得到我期望的结果。换句话说,我得到了一个对象,并对其进行了过滤,但是在给定参数传递的情况下,它返回的是“错误”的值。

编辑:好的-现在已修复。问题出在以下这一行:var key=keys[i];。我正在使用键的索引而不是值的索引。所以现在是对的。但是我仍然不明白为什么我会得到空检查之前的错误。如果人们认为应该这样做,我将关闭此窗口,但我仍然不明白为什么会收到错误消息。

1 个答案:

答案 0 :(得分:1)

函数的更清洁版本:

Object.defineProperty(Object.prototype, 'search', {
  value: function(regex) {
    let found = {};
    for (let k in this) {
      if (this.hasOwnProperty(k) && regex.test(this[k].toString())) found[k] = this[k];
    }
    return found;
  },
  enumerable: false
});

console.log(({ cat: 23, hat: 45 }).search(/2/));
console.log(({ cat: 23, hat: 45 }).search(/.*/));