英文:
Javascript join/split alternative syntax
问题
我已经使用JS有一段时间了,但它似乎永远不会停止让我感到惊讶(和/或恐惧)。
我刚刚偶然发现了String.split()
/ String.join()
的另一种语法,而不是像正常人一样调用它,即:
const s = "abc-def-ghi"
const splitted = s.split("-") // ["abc", "def", "ghi"]
const joined = splitted.join("/") // "abc/def/ghi"
你可以这样做:
const splitted = s.split`-` // ["abc", "def", "ghi"]
const joined = splitted.join`/` // "abc/def/ghi"
所以我的问题是 - ?!?!??!?!!
我没有找到关于这个的任何文档,但至少在Node 8.1+中似乎可以工作。我不知道这是否是特定于Node的东西还是某种不常见的ES语法,但我想知道是否还有其他用法,以及它是否适用于其他方法。
英文:
I used JS for quite some time now, but it seems it will never cease to amaze (and/or horrify) me.
I just stumbled upon an alternative syntax for String.split()
/ String.join()
, where instead of calling it like a normal human being, i.e.:
const s = "abc-def-ghi"
const splitted = s.split("-") // ["abc", "def", "ghi"]
const joined = splitted.join("/") // "abc/def/ghi"
You do it like that:
const splitted = s.split`-` // ["abc", "def", "ghi"]
const joined = splitted.join`/` // "abc/def/ghi"
So my question is - ?!?!??!?!!
I didn't find any documentation on this, but it seems to work in Node 8.1+ at least. I don't know if this is something node-specific or some obscure ES syntax, but I would like to know if there's more to it and if it works with other methods.
答案1
得分: 1
When ES6 was introduced, it also introduced tagged template literals. 这意味着字符串值通过前缀函数处理。
所以,在您的情况下,它是这样的:
const splitted = s.split`-` // ["abc", "def", "ghi"]
const joined = splitted.join`/` // "abc/def/ghi"
split/join
作为一个函数,接受模板字符串字面量并进行处理。
英文:
When es6 was introduced it also introduced tagged template literals. Where a string value runs through a prefixed function.
So, in your case it is
const splitted = s.split`-` // ["abc", "def", "ghi"]
const joined = splitted.join`/` // "abc/def/ghi"
split/join
works as a function which takes the template string literals and processes it.
Take a sample demo:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function stronger(str){
return `<strong>${str}</strong>`;
}
let str = stronger`Let's get stronger.`;
document.body.innerHTML = str;
<!-- end snippet -->
答案2
得分: 1
这段代码是以一种巧妙的方式使用了“标记模板”(tagged templates)来将字符串参数应用于split/join函数。
标记模板函数的签名如下:
function tag(strings: String[], ...any)
当你调用Array.split()
或Array.join()
时,它们接收一个包含一个字符串的数组:['-']
或['/']
。这些函数期望一个字符串作为参数,因此会调用数组的toString()
方法,将其转换为字符串,并将其用作split/join的参数。
示例:
function tag(strs) {
console.log(strs.toString())
}
tag`-`
英文:
This code is using tagged templates in a hackish way to apply the string parameter to split/join.
The signature of a tagged template function is:
function tag(strings: String[], ...any)
When you call Array.split()
or Array.join()
they receive an array of one string: ['-']
or ['/']
. The functions expect a string, so the array's toString() method is called, which produces a string, and used a the parameter for the split/join.
Example:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-js -->
function tag(strs) {
console.log(strs.toString())
}
tag`-`
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论