簡體   English   中英

擴展js原型,參數被強制類型化

[英]Extending js prototype, argument is getting type coerced

我有一個像這樣的函數:

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

不:在包括了對值的空檢查之后,我不再得到錯誤,但是我也沒有得到我期望的結果。 換句話說,我得到了一個對象,並對其進行了過濾,但是根據給定的參數,它返回的是“錯誤”的值。

編輯:好的-現在已修復。 問題出在這一行: var key=keys[i]; 我正在使用鍵的索引而不是值的索引。 所以現在是對的。 但是我仍然不明白為什么我會得到空檢查之前的錯誤。 如果人們認為我應該關閉該窗口,但是我仍然不明白為什么會出現錯誤。

功能的更清潔版本:

 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(/.*/)); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM