var fnTest = /xyz/.test(function(){xyz;}) ? /b_superb/ : /.*/;對于其中正則表達式匹配函數test的用法,我很是迷惑: /xyz/.test(function(){xyz;})我查閱了Mozilla developer center中關于test函數的描述: Executes the search for a match between a regular expression and a specified string. Returns true or false. 字符串中是否有匹配正則表達式的子字符串。返回true或false。 其語法格式: regexp.test([str])注意這里的參數是字符串,根本沒有提到test函數的參數可以是函數的說法。 我試著修改這段奇怪的代碼,得到了一些運行結果: 復制代碼代碼如下:
/xyz/.test("xyz"); // true
/xyz/.test(function(){"xyz";}); // false
/xyz/.test(function(){return "xyz";}); // true
/xyz/.test(function(){return xyz;}); // true
/xyz/.test(function(){return axyz;}); // true
/xyz/.test(function(){return "axyz";}); // true
/xyz/.test(function(){return "xayz";}); // false怎么回事?
華麗的分割線 ======================================= 我終于知道了,卻原來在test內部進行了類型轉換,下面代碼: 復制代碼代碼如下:
/xyz/.test(function(){xyz;});
等價于: 復制代碼代碼如下:
/xyz/.test((function(){xyz;}).toString());
又等價于: 復制代碼代碼如下:
/xyz/.test("function(){xyz;}");
那么為什么下面的代碼返回false呢? 復制代碼代碼如下:
/xyz/.test(function(){"xyz";});
我們執行下這行代碼就知道了: 復制代碼代碼如下:
// 這行代碼的執行結果是:"function(){}"
(function(){"xyz";}).toString();
所以我們可以寫出更加詭異的代碼來迷惑大家了 復制代碼代碼如下:
/function/.test(function(){}); // true
// b 表示文字邊界(對英文而言的)
/b_superb/.test(function(){this._super();}); // true