簡體   English   中英

為什么數組函數像標記的模板文字一樣工作,我能用它做什么?

[英]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 用作模板標簽來調用它。

模板標簽函數接收以下參數:

  1. static 弦樂部件陣列
  2. 無窮大。 替代值

因此,您的電話展開為:

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.

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