ES6 Raw String Access的实际用途是什么?

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"));      // false
Run 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"));  // false
Run 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 是一种方法。
  • String.raw `foo\n${ 42 }bar\`是一个带标签的模板文字。
  • 模板文字基本上是奇特的字符串。
  • 模板文字可以进行插值。
  • 模板文字可以是多行而不使用\.
  • 需要 String.raw 来转义转义字符\

尝试将包含换行符的字符串\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

  • 显示字符串而不解释反斜杠字符(\n、\t)等。
  • 显示输出的代码。(如下例所示)
  • 在正则表达式中使用而不转义\
  • \\无需使用太多即可打印 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.。可悲的是,情况并非如此。

参考: