[英]Why do array functions work like tagged template literals and what can I do with it?
就在最近,我發現這是可行的:
const str = "foo bar";
const arr = str.split` `; // <- no parens
console.log(arr);
// -> ["foo", "bar"]
似乎split
原型是一個標記的模板文字。 我還看到它與indexOf
等其他數組函數一起使用。
實施此行為是否有特定原因? 我可以用它做一些我以前做不到的事情,或者我可以用更簡單的方式解決一些任務嗎?
似乎已經為實現付出了一些努力,而我能想到的每個用例都會使事情變得過於復雜。 在我看來,讓它成為可能是浪費時間。 還是零成本? 如果是這樣:如何?
這對於.split
方法沒什么特別的,這就是標記模板文字的工作方式。 您可以使用任何function 標記模板文字,並且它將作為其第一個參數給出插值塊之外的模板字符串部分。 在這種情況下,數組[" "]
將用作.split
的第一個參數(之后將[" "]
點轉換為字符串: " "
)。
您可以將任何function 用作模板標簽來調用它。
模板標簽函數接收以下參數:
因此,您的電話展開為:
const arr = str.split([' ']);
String#split()
期望它的第一個參數是字符串或正則表達式。 數組不是這些,因此.split()
通過調用其.toString()
方法將其轉換為字符串。
Array#toString()
返回以逗號分隔的數組元素。 如果是單個元素,則返回轉換為字符串的元素。
由於' '
已經是一個字符串,它被返回,並被.split()
用來分割輸入字符串。
盡管在某些情況下可以這樣工作,但不鼓勵這種用法(將函數用作並非為此設計的標記函數),因為它不可讀,性能較低(創建額外的 arrays 等)並且僅保存 2 個字符( ` `
而不是(' ')
),但是,它被一些壓縮器和混淆器使用。
String.prototype.split
實際上並不是為使用標記的模板文字而設計的。
當您使用標記模板調用split
時,傳遞給 function 的第一個參數是模板中的字符串數組,所以
str.split` `;
相當於
str.split([" "]);
. 該數組只有一個字符串,並且沒有更多參數,因為模板文字中沒有占位符 ( ${}
)。
規范說split
方法首先將第一個參數轉換為字符串,然后使用它,所以
str.split([" "]);
相當於
str.split(" ");
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.