DEV Community

Cover image for TIL: String.raw
Nicholas Jamieson
Nicholas Jamieson

Posted on • Updated on • Originally published at ncjamieson.com

TIL: String.raw

This article was originally published on my blog.


Something that's always annoyed me — because I always seem to mess it up — is having to escape the escape character (\) in some JavaScript string literals.

Well, it turns out there's a feature that means having to do this can be avoided entirely.

Other languages

C# uses the @ character as a verbatim identifier and when it's applied to a string literal, it works like this:

// These strings are equivalent:
const verbatim = @"C:\Windows\system.ini";
const escaped = "C:\\Windows\\system.ini";

This is part of the C# language syntax.

JavaScript

In JavaScript, the mechanism is a little different. It doesn't extend the syntax. Instead, it leverages template literals and their tags.

The String object has a static raw method that is intended to be used as a template-literal tag, like this:

// These strings are equivalent:
const raw = String.raw`C:\Windows\system.ini`;
const escaped = "C:\\Windows\\system.ini";

Having to put backslash-delimited Windows paths in JavaScript literals isn't something that I've ever had to do.

However, I often have to escape escape characters when I'm dynamically creating a regular expression using the RegExp constructor. And in these situations, not having to escape the escape characters makes things much clearer:

const regExp = new RegExp(String.raw`(\b|_)${word}(\b|_)`));

ES2018

It's worth noting that there are differences in how these 'raw' template literals are handled in different JavaScript runtimes.

In ES2016, this template literal will effect an error, because \u is interpreted as a Unicode escape sequence:

const directory = String.raw`C:\images\unsplash`;

In ES2018, this behaviour was changed and — as long as a tag function is applied — no error will be effected.

More template-literal tags

If template-literal tags are something you've not encountered before, you might also want to check out the common-tags package. It has a whole bunch of extremely useful tag functions.


Title photo by Icons8 Team on Unsplash.

Top comments (2)

Collapse
 
nickytonline profile image
Nick Taylor

TIL about String.raw!

Today I learned

Collapse
 
gypsydave5 profile image
David Wickes • Edited

Very nice. I love these little corners of the language which barely anyone knows about but which can be so useful.