Back to Home

Strings

In JavaScript, the textual data is stored as strings. There is no separate type for a single character. The internal format for strings is always UTF-16, it is not tied to the page encoding.

Quotes

Let’s recall the kinds of quotes. Strings can be enclosed within either single quotes, double quotes or backticks: Single and double quotes are essentially the same. Backticks, however, allow us to embed any expression into the string, by wrapping it in ${…}: Another advantage of using backticks is that they allow a string to span multiple lines: Looks natural, right? But single or double quotes do not work this way. If we use them and try to use multiple lines, there’ll be an error: Single and double quotes come from ancient times of language creation, when the need for multiline strings was not taken into account. Backticks appeared much later and thus are more versatile. Backticks also allow us to specify a “template function” before the first backtick. The syntax is: func`string`. The function func is called automatically, receives the string and embedded expressions and can process them. This feature is called “tagged templates”, it’s rarely seen, but you can read about it in the MDN: Template literals.

Special characters

It is still possible to create multiline strings with single and double quotes by using a so-called “newline character”, written as
, which denotes a line break: As a simpler example, these two lines are equal, just written differently: There are other, less common special characters: As you can see, all special characters start with a backslash character . It is also called an “escape character”. Because it’s so special, if we need to show an actual backslash \ within the string, we need to double it: So-called “escaped” quotes \‘, \“, \` are used to insert a quote into the same-quoted string. For instance: As you can see, we have to prepend the inner quote by the backslash \’, because otherwise it would indicate the string end. Of course, only the quotes that are the same as the enclosing ones need to be escaped. So, as a more elegant solution, we could switch to double quotes or backticks instead: Besides these special characters, there’s also a special notation for Unicode codes \u…, it’s rarely used and is covered in the optional chapter about Unicode.

String length

The length property has the string length: Note that
is a single “special” character, so the length is indeed 3.

Accessing characters

To get a character at position pos, use square brackets [pos] or call the method str.at(pos). The first character starts from the zero position: As you can see, the .at(pos) method has a benefit of allowing negative position. If pos is negative, then it’s counted from the end of the string. So .at(-1) means the last character, and .at(-2) is the one before it, etc. The square brackets always return undefined for negative indexes, for instance: We can also iterate over characters using for..of:

Strings are immutable

Strings can’t be changed in JavaScript. It is impossible to change a character. Let’s try it to show that it doesn’t work: The usual workaround is to create a whole new string and assign it to str instead of the old one. For instance: In the following sections we’ll see more examples of this.

Changing the case

Methods toLowerCase() and toUpperCase() change the case: Or, if we want a single character lowercased:

Searching for a substring

There are multiple ways to look for a substring within a string.

str.indexOf

The first method is str.indexOf(substr, pos). It looks for the substr in str, starting from the given position pos, and returns the position where the match was found or -1 if nothing can be found. For instance: The optional second parameter allows us to start searching from a given position. For instance, the first occurrence of “id” is at position 1. To look for the next occurrence, let’s start the search from position 2: If we’re interested in all occurrences, we can run indexOf in a loop. Every new call is made with the position after the previous match: The same algorithm can be layed out shorter: There is a slight inconvenience with indexOf in the if test. We can’t put it in the if like this: The alert in the example above doesn’t show because str.indexOf(“Widget”) returns 0 (meaning that it found the match at the starting position). Right, but if considers 0 to be false. So, we should actually check for -1, like this:

includes, startsWith, endsWith

The more modern method str.includes(substr, pos) returns true/false depending on whether str contains substr within. It’s the right choice if we need to test for the match, but don’t need its position: The optional second argument of str.includes is the position to start searching from: The methods str.startsWith and str.endsWith do exactly what they say:

Getting a substring

str.slice(start [, end])

Returns the part of the string from start to (but not including) end. For instance:


let str = "stringify";
alert( str.slice(0, 5) ); // 'strin', the substring from 0 to 5 (not including 5)
alert( str.slice(0, 1) ); // 's', from 0 to 1, but not including 1, so only character at 0
If there is no second argument, then slice goes till the end of the string:

let str = "st!ringify/!";
alert( str.slice(2) ); // 'ringify', from the 2nd position till the end
Negative values for start/end are also possible. They mean the position is counted from the string end:

let str = "strin!gif/!y";
// start at the 4th position from the right, end at the 1st from the right
alert( str.slice(-4, -1) ); // 'gif'
str.substring(start [, end])

Returns the part of the string between start and end (not including end). This is almost the same as slice, but it allows start to be greater than end (in this case it simply swaps start and end values). For instance:


let str = "st!ring/!ify";
// these are same for substring
alert( str.substring(2, 6) ); // "ring"
alert( str.substring(6, 2) ); // "ring"
// ...but not for slice:
alert( str.slice(2, 6) ); // "ring" (the same)
alert( str.slice(6, 2) ); // "" (an empty string)
Negative arguments are (unlike slice) not supported, they are treated as 0. str.substr(start [, length])

Returns the part of the string from start, with the given length. In contrast with the previous methods, this one allows us to specify the length instead of the ending position:

let str = "st!ring/!ify";
alert( str.substr(2, 4) ); // 'ring', from the 2nd position get 4 characters

The first argument may be negative, to count from the end:

let str = "strin!gi/!fy";
alert( str.substr(-4, 2) ); // 'gi', from the 4th position get 2 characters

This method resides in the Annex B of the language specification. It means that only browser-hosted Javascript engines should support it, and it’s not recommended to use it. In practice, it’s supported everywhere. Let’s recap these methods to avoid any confusion:

Comparing strings

As we know from the chapter info:comparison, strings are compared character-by-character in alphabetical order. Although, there are some oddities.

  1. A lowercase letter is always greater than the uppercase:
alert( 'a' > 'Z' ); // true
  1. Letters with diacritical marks are “out of order”:
alert( 'Österreich' > 'Zealand' ); // true
str.codePointAt(pos)
Returns a decimal number representing the code for the character at position pos:

// different case letters have different codes
alert( "Z".codePointAt(0) ); // 90
alert( "z".codePointAt(0) ); // 122
alert( "z".codePointAt(0).toString(16) ); // 7a (if we need a hexadecimal value)
String.fromCodePoint(code)
Creates a character by its numeric code

alert( String.fromCodePoint(90) ); // Z
alert( String.fromCodePoint(0x5a) ); // Z (we can also use a hex value as an argument)
Now let’s see the characters with codes 65..220 (the latin alphabet and a little bit extra) by making a string of them: See? Capital characters go first, then a few special ones, then lowercase characters, and Ö near the end of the output. Now it becomes obvious why a > Z. The characters are compared by their numeric code. The greater code means that the character is greater. The code for a (97) is greater than the code for Z (90).
let single = 'single-quoted';
let double = "double-quoted";

let backticks = `backticks`;
Example:

Follow the lesson from Microsoft Web-Dev-For-Beginners course

Tags: string