Ven*_*t.R 27 javascript rawstring ecmascript-6 template-strings
String.rawECMAScript 6中引入的Raw String Access 的实际用途是什么?
// String.raw(callSite, ...substitutions)
function quux (strings, ...values) {
strings[0] === "foo\n"
strings[1] === "bar"
strings.raw[0] === "foo\\n"
strings.raw[1] === "bar"
values[0] === 42
}
quux `foo\n${ 42 }bar`
String.raw `foo\n${ 42 }bar` === "foo\\n42bar"
Run Code Online (Sandbox Code Playgroud)
http://es6-features.org/#RawStringAccess
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/raw
http://www.2ality.com/2015/01/es6-strings.html
https://msdn.microsoft.com/en-us/library/dn889830(v=vs.94).aspx
唯一能理解的是,它用于获取模板字符串的原始字符串形式,并用于调试模板字符串.
什么时候可以用于实时开发?他们称之为标签功能.那是什么意思?
我错过了哪些具体的用例?
T.J*_*der 13
String.raw我能想到的最佳,也几乎唯一的用例是,如果你正在尝试使用Steven Levithan的XRegExp库来接受带有重要反斜杠的文本.使用String.raw允许你在语义上清晰地写出一些内容,而不是在加倍反斜杠方面进行思考,就像在JavaScript本身的正则表达式文字中一样.
例如,假设我在网站上进行维护,我发现:
var isSingleUnicodeWord = /^\w+$/;
Run Code Online (Sandbox Code Playgroud)
...这是为了检查一个字符串是否只包含"字母".两个问题:A)人类语言领域中有数以千计的"单词"字符\w无法识别,因为它的定义是以英语为中心的; 和B)它包括_,许多(包括Unicode联盟)认为不是"字母".
因此,如果我们在XRegExp网站上使用,因为我知道它支持\pL(\p对于Unicode类别和L"字母"),我可能会快速交换它:
var isSingleUnicodeWord = XRegExp("^\pL+$"); // WRONG
Run Code Online (Sandbox Code Playgroud)
然后我想知道为什么它不起作用,facepalm,然后回去逃避反斜杠,因为它被字符串文字所消耗.
在这个简单的正则表达式中很容易,但是在复杂的东西中,记住将所有这些反斜杠加倍是一种维护痛苦.(只要问Java程序员试图使用Pattern.)
输入String.raw:
let isSingleUnicodeWord = XRegExp(String.raw`^\pL+$`);
Run Code Online (Sandbox Code Playgroud)
例:
let isSingleUnicodeWord = XRegExp(String.raw`^\pL+$`); // L: Letter
console.log(isSingleUnicodeWord.test("???????")); // true
console.log(isSingleUnicodeWord.test("???")); // true
console.log(isSingleUnicodeWord.test("???????")); // true
console.log(isSingleUnicodeWord.test("foo bar")); // falseRun Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.min.js"></script>Run Code Online (Sandbox Code Playgroud)
现在我回过头来写下我的意思.我甚${...}至不必担心模板文字中使用的构造进行替换,因为我想要将量词{...}应用于行尾断言($)的几率很低.所以我可以愉快地使用替换,但仍然不担心反斜杠.可爱.
尽管如此,如果我做了很多,我可能想要编写一个函数并使用标记模板而不是String.raw自己.但是正确地做到令人惊讶的尴尬:
// My one-time tag function
function xrex(strings, ...values) {
let raw = strings.raw;
let max = Math.max(raw.length, values.length);
let result = "";
for (let i = 0; i < max; ++i) {
if (i < raw.length) {
result += raw[i];
}
if (i < values.length) {
result += values[i];
}
}
console.log("Creating with:", result);
return XRegExp(result);
}
// Using it, with a couple of substitutions to prove to myself they work
let category = "L"; // L: Letter
let maybeEol = "$";
let isSingleUnicodeWord = xrex`^\p${category}+${maybeEol}`;
console.log(isSingleUnicodeWord.test("???????")); // true
console.log(isSingleUnicodeWord.test("???")); // true
console.log(isSingleUnicodeWord.test("???????")); // true
console.log(isSingleUnicodeWord.test("foo bar")); // falseRun Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.min.js"></script>Run Code Online (Sandbox Code Playgroud)
如果你在很多地方使用它,也许麻烦是值得的,但对于一些快速的,String.raw它是更简单的选择.
小智 5
首先,有几点:
String.raw `foo\n${ 42 }bar\`是一个带标签的模板文字。\.\。尝试将包含换行符的字符串\n放入使用换行符的函数中。
console.log("This\nis\nawesome"); // "This\nis\nawesome"
console.log(String.raw`This\nis\nawesome`); // "This\\nis\\nawesome"
Run Code Online (Sandbox Code Playgroud)
如果您想知道,console.log 不是其中之一。但是alert。尝试通过http://learnharmony.org/运行这些。
alert("This\nis\nawesome");
alert(String.raw`This\nis\nawesome`);
Run Code Online (Sandbox Code Playgroud)
但是等等,这不是 的用途String.raw。
方法的可能用途String.raw:
\。\\无需使用太多即可打印 Windows 目录/子目录位置。(他们使用\记住。另外,哈哈)在这里,我们可以在单个警报窗口中显示它的输出和代码:
alert("I printed This\nis\nawesome with " + Sring.raw`This\nis\nawesome`);
Run Code Online (Sandbox Code Playgroud)
不过,如果它的主要用途是取回原始字符串,那就太好了。喜欢:
var original = String.raw`This is awesome.`;
Run Code Online (Sandbox Code Playgroud)
哪里original会变成:This\tis \tawesome.。可悲的是,情况并非如此。
参考: