![](/img/trans.png)
[英]Can someone please explain the type of params array in my case in JavaScript?
[英]Can someone please explain this regex filtering of an array
我正在過濾一個數組,並在這里找到一個正則表達式。 我試圖理解這個:
filterArray.filter(/./.test.bind(new RegExp(key, 'g')))
但是我不明白數組如何測試它對正則表達式的價值,或者為什么你必須從/./開始而不是只寫正則表達式。 在這種情況下綁定是如何工作的?
編輯:鍵只是一個我要匹配的字符串,“嗨”或“狗”或“任何真的”。
.bind()
方法將返回一個函數,其中包含您傳遞的任何內容,作為第一個參數綁定為this
的值。
因為你從.test()
調用.bind()
,所以你得到的是.test()
方法,並將this
綁定到new RegExp(key, 'g')
。
/./
在這里無關緊要。 這只是獲得RegExp.prototype.test
方法的RegExp.prototype.test
方法。
結果是你將有效地做:
var regexp = new RegExp(key, 'g');
filterArray.filter(function(val) {
return regexp.test(val);
});
您應該注意這有點危險,因為具有g
修飾符的正則表達式對象是有狀態的。 這意味着它總是開始一個新的搜索,前一個搜索停止。
鑒於這種過濾方案, g
似乎根本不需要,並且實際上只會導致問題。
這里有一個使用g
的危險的例子:
var re = /./.test.bind(new RegExp("foo", 'g'));
var str = "foobar";
console.log(re(str)); // true
console.log(re(str)); // false
因此,在同一個字符串上調用相同的正則表達式會產生兩個不同的結果。 如果我們再次召集它,它將再次成為true
。
因此,如果使用.filter()
回調,讓我們說key
是"foo"
,那么可以說一個val
是"foobar"
。 它將被允許通過過濾器。
但是,讓我們說下一個val
是"foobaz"
。 搜索將在第四個字符上重新開始,而不是從第一個字符開始,因此將找不到"foo"
。
以下是顯示實際問題的具體示例:
演示: http : //jsfiddle.net/s9PzL/
var filterArray = [
"foobar",
"foobaz",
"foobuz",
"foobix"
];
var result = filterArray.filter(/./.test.bind(new RegExp("foo", 'g')));
所有字符串都有"foo"
,所以它們都應該通過。 但結果表明不會發生。
document.body.textContent = result.join(", "); // foobar, foobuz
我認為這樣做的原因是因為你想對數組中的每個項執行測試方法。 只是將測試方法傳遞給過濾器(可能)會搞亂方法的綁定。
這就是你的例子中的原因:
/./
生成一個空的正則表達式
/./.test
是該正則表達式的測試方法
/./.test.bind(new Regex(..))
將該方法綁定到所請求的方法,並返回一個執行test
的新方法,其中this
是您提供的基於key
正則表達式。
它似乎可以寫得更清楚:
RegExp.prototype.test.bind(new RegExp(key, 'g'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.