LearnAI ToolsCareerPractice BuildsPlayContact
Lesson 1650 min read

JavaScript Strings

Learn how to create, access, compare, search, extract, modify, combine, format, and work with strings in JavaScript using properties, methods, template literals, escape sequences, Unicode, and real-world examples.

Introduction

Strings are one of the most frequently used data types in JavaScript. Almost every application works with text in some form, including names, messages, passwords, search queries, URLs, email addresses, product descriptions, form values, API responses, and user-generated content.

A JavaScript string is a sequence of characters used to represent textual data. Strings can contain letters, numbers, spaces, punctuation marks, symbols, Unicode characters, and emojis.

JavaScript provides many built-in properties and methods for inspecting, searching, extracting, replacing, formatting, splitting, comparing, and transforming strings.

Understanding strings is essential because text processing appears in frontend development, backend development, form validation, search systems, APIs, authentication, data formatting, and almost every real-world JavaScript application.

What You Will Learn
  • What strings are in JavaScript.
  • Why strings are important.
  • How to create strings.
  • How single quotes and double quotes work.
  • How template literals work.
  • How the String constructor works.
  • The difference between primitive strings and String objects.
  • How to create empty strings.
  • How to find string length.
  • How to access individual characters.
  • How bracket notation works.
  • How charAt() works.
  • How at() works.
  • Why strings are immutable.
  • How escape sequences work.
  • How to create multiline strings.
  • How to concatenate strings.
  • How template interpolation works.
  • How to compare strings.
  • How to perform case-insensitive comparisons.
  • How to change letter case.
  • How to search inside strings.
  • How to extract parts of strings.
  • How to replace text.
  • How to remove whitespace.
  • How to pad strings.
  • How to repeat strings.
  • How to split strings.
  • How to convert values to strings.
  • How to iterate through strings.
  • How Unicode and emojis affect strings.
  • How to solve common string problems.
  • How to build a complete text-processing application.

What is a String?

A string is a sequence of characters enclosed inside quotation marks or backticks.

Basic Strings
const firstName = 'Aarav';
const course = "JavaScript";
const message = `Welcome to PrograMinds`;
console.log(firstName);
console.log(course);
console.log(message);
Output

Click Run to see what this code prints.

Every character in a string has a position called an index. JavaScript string indexes begin at 0.

String Indexes
String: J a v a S c r i p t
Index: 0 1 2 3 4 5 6 7 8 9

Why Do We Need Strings?

Strings allow applications to store, display, receive, validate, search, and transform textual information.

User Information

Store names, usernames, addresses, phone numbers, and profile information.

Messages

Display notifications, alerts, chat messages, validation errors, and application feedback.

Forms

Process text entered into input fields, textareas, search boxes, and login forms.

Search

Search for words, products, users, articles, and other textual content.

URLs

Create, inspect, and transform website addresses and route paths.

API Data

Process text received from servers, databases, and external services.

Validation

Validate passwords, email addresses, usernames, and other input.

Dynamic Interfaces

Generate headings, labels, cards, menus, buttons, and other interface content.

Real-World Analogy

Think of a string like a train. The complete train is the string, while every coach represents one character.

Train Analogy
STRING: "CODE"
Complete Train
│
▼
┌───┬───┬───┬───┐
│ C │ O │ D │ E │
└───┴───┴───┴───┘
0 1 2 3
▲ ▲ ▲ ▲
│ │ │ │
Character Positions
Each character:
has an index
can be accessed
can be inspected
The original string:
cannot be changed directly

Creating Strings

JavaScript provides several ways to create strings. The most common approaches use single quotes, double quotes, or template literals.

Creating Strings
const first = 'Single Quotes';
const second = "Double Quotes";
const third = `Template Literal`;
console.log(first);
console.log(second);
console.log(third);
Output

Click Run to see what this code prints.

Single Quotes

Single quotes are commonly used to create simple strings.

Single Quote Strings
const language = 'JavaScript';
const message = 'Welcome to the course';
console.log(language);
console.log(message);
Output

Click Run to see what this code prints.

If the string itself contains an apostrophe, you can escape it or use another quotation style.

Apostrophe in String
const first = 'I\'m learning JavaScript';
const second = "I'm learning JavaScript";
console.log(first);
console.log(second);
Output

Click Run to see what this code prints.

Double Quotes

Double quotes work like single quotes. The choice between them is usually based on project style and readability.

Double Quote Strings
const title = "JavaScript Strings";
const message =
"This lesson explains text processing.";
console.log(title);
console.log(message);
Output

Click Run to see what this code prints.

Template Literals

Template literals use backticks instead of normal quotation marks. They support interpolation, expressions, and multiline text.

Template Literal
const name = 'Priya';
const message =
`Welcome, ${name}!`;
console.log(message);
Output

Click Run to see what this code prints.

Mini Challenge · JavaScript

This string uses single quotes, so ${name} is treated as literal text instead of being interpolated. Fix it so the greeting includes the actual name.

expected output: Hi Aarav, welcome!
Template Literal Advantages
  • Insert variables directly into strings.
  • Evaluate JavaScript expressions.
  • Create multiline strings naturally.
  • Build dynamic HTML more clearly.
  • Reduce complicated string concatenation.

String Constructor

The String constructor can convert values into strings. It can also create String objects when used with the new keyword.

String Constructor
const first = String(100);
const second = String(true);
const third = new String('JavaScript');
console.log(first);
console.log(second);
console.log(third);
Output

Click Run to see what this code prints.

Avoid new String()
  • String() creates or converts to a primitive string.
  • new String() creates an object.
  • String objects can produce confusing comparison behavior.
  • Use primitive strings in normal application code.

Primitive String vs String Object

Primitive and Object
const primitive = 'JavaScript';
const object =
new String('JavaScript');
console.log(typeof primitive);
console.log(typeof object);
Output

Click Run to see what this code prints.

Comparison Difference
const first = 'JavaScript';
const second =
new String('JavaScript');
console.log(first == second);
console.log(first === second);
Output

Click Run to see what this code prints.

Strict equality returns false because one value is a primitive and the other is an object.

Empty Strings

An empty string contains no characters and has a length of zero.

Empty String
const message = '';
console.log(message);
console.log(message.length);
console.log(Boolean(message));
Output

Click Run to see what this code prints.

Empty strings are falsy values and are commonly used as initial values for form fields and text variables.

String Length

The length property returns the number of UTF-16 code units in a string.

String Length
const language = 'JavaScript';
console.log(language.length);
Output

Click Run to see what this code prints.

Length Examples
console.log('Hello'.length);
console.log('Hello World'.length);
console.log(''.length);
Output

Click Run to see what this code prints.

Remember
  • Spaces count as characters.
  • Punctuation counts as characters.
  • String indexes begin at 0.
  • The final normal index is length - 1.
  • Some Unicode characters may use more than one UTF-16 code unit.

Accessing Characters

Individual characters can be accessed using bracket notation, charAt(), or at().

Accessing Characters
const language = 'JavaScript';
console.log(language[0]);
console.log(language.charAt(1));
console.log(language.at(2));
Output

Click Run to see what this code prints.

Bracket Notation

Bracket notation accesses a character using its zero-based index.

Bracket Notation
const word = 'CODE';
console.log(word[0]);
console.log(word[1]);
console.log(word[2]);
console.log(word[3]);
Output

Click Run to see what this code prints.

Invalid Index
const word = 'CODE';
console.log(word[10]);
Output

Click Run to see what this code prints.

charAt()

The charAt() method returns the character at a specified index.

charAt()
const word = 'JavaScript';
console.log(word.charAt(0));
console.log(word.charAt(4));
console.log(word.charAt(100));
Output

Click Run to see what this code prints.

Unlike bracket notation, charAt() returns an empty string for an invalid index.

at()

The at() method accesses characters using positive or negative indexes.

at() Method
const word = 'JavaScript';
console.log(word.at(0));
console.log(word.at(-1));
console.log(word.at(-2));
Output

Click Run to see what this code prints.

Why at() is Useful
  • Positive indexes count from the beginning.
  • Negative indexes count from the end.
  • at(-1) returns the final character.
  • It avoids writing string[string.length - 1].

Character Codes

JavaScript can return the numeric UTF-16 code unit associated with a character.

charCodeAt()
const letter = 'A';
console.log(letter.charCodeAt(0));
Output

Click Run to see what this code prints.

Create Character from Code
const letter =
String.fromCharCode(65);
console.log(letter);
Output

Click Run to see what this code prints.

Strings are Immutable

Strings are immutable, which means individual characters in an existing string cannot be changed directly.

Attempting to Modify a String
let word = 'JavaScript';
word[0] = 'Y';
console.log(word);
Output

Click Run to see what this code prints.

String methods return new strings instead of modifying the original string.

Creating a New String
const original = 'javascript';
const updated =
original.toUpperCase();
console.log(original);
console.log(updated);
Output

Click Run to see what this code prints.

Mini Challenge · JavaScript

Direct index assignment cannot capitalize the first letter because strings are immutable. Rewrite the assignment so it builds a new string instead.

expected output: Javascript

Escape Sequences

Escape sequences allow special characters to be included inside strings.

Escape Sequences
const quote =
'She said, "Hello!"';
const apostrophe =
'I\'m learning JavaScript';
const path =
'C:\\Users\\Documents';
console.log(quote);
console.log(apostrophe);
console.log(path);
Output

Click Run to see what this code prints.

Special Characters

Common Escape Sequences
Escape Sequence Meaning
--------------------------------
\n New line
\t Tab
\\ Backslash
\' Single quote
\" Double quote
\r Carriage return
\b Backspace
New Line and Tab
const message =
'Name:\tAarav\nCourse:\tJavaScript';
console.log(message);
Output

Click Run to see what this code prints.

Multiline Strings

Template literals allow multiline strings without manually adding newline escape sequences.

Multiline Template Literal
const message = `
Welcome to PrograMinds.
Learn JavaScript
Build Projects
Become a Developer
`;
console.log(message);
Output

Click Run to see what this code prints.

String Concatenation

Concatenation means combining multiple strings into one string.

The + Operator

String Concatenation
const firstName = 'Aarav';
const lastName = 'Sharma';
const fullName =
firstName + ' ' + lastName;
console.log(fullName);
Output

Click Run to see what this code prints.

The += Operator

The += operator appends text to an existing string variable.

Appending Text
let message = 'Hello';
message += ' ';
message += 'JavaScript';
console.log(message);
Output

Click Run to see what this code prints.

concat()

The concat() method combines multiple strings and returns a new string.

concat() Method
const first = 'Hello';
const second = 'JavaScript';
const message =
first.concat(' ', second, '!');
console.log(message);
Output

Click Run to see what this code prints.

Template Literal Interpolation

Template interpolation inserts variables into strings using the ${expression} syntax.

String Interpolation
const name = 'Priya';
const course = 'JavaScript';
const message =
`${name} is learning ${course}.`;
console.log(message);
Output

Click Run to see what this code prints.

Expressions in Template Literals

Any valid JavaScript expression can be evaluated inside ${}.

Template Expressions
const price = 1000;
const quantity = 3;
const message =
`Total: ₹${price * quantity}`;
console.log(message);
Output

Click Run to see what this code prints.

Function Call in Template
function formatName(name) {
return name.toUpperCase();
}
const userName = 'aarav';
console.log(
`Welcome, ${formatName(userName)}!`
);
Output

Click Run to see what this code prints.

Comparing Strings

Strings can be compared using equality and relational operators.

String Comparison
console.log(
'JavaScript' === 'JavaScript'
);
console.log(
'JavaScript' === 'javascript'
);
console.log('apple' < 'banana');
Output

Click Run to see what this code prints.

Case-Sensitive Comparison

JavaScript string comparisons are case-sensitive.

Case-Sensitive Comparison
const first = 'ADMIN';
const second = 'admin';
console.log(first === second);
Output

Click Run to see what this code prints.

Case-Insensitive Comparison

A common approach is to convert both strings to the same case before comparing them.

Case-Insensitive Comparison
const first = 'ADMIN';
const second = 'admin';
const isEqual =
first.toLowerCase() ===
second.toLowerCase();
console.log(isEqual);
Output

Click Run to see what this code prints.

Locale-Aware Comparison

The localeCompare() method compares strings according to language-aware sorting rules.

localeCompare()
console.log(
'apple'.localeCompare('banana')
);
console.log(
'banana'.localeCompare('apple')
);
console.log(
'apple'.localeCompare('apple')
);
Typical Output

Click Run to see what this code prints.

localeCompare() Result
  • A negative value means the first string comes before the second.
  • A positive value means the first string comes after the second.
  • Zero means the strings compare as equal.
  • The exact negative or positive number should not be relied upon.

Changing String Case

JavaScript provides methods for converting strings to uppercase or lowercase.

toUpperCase()

Uppercase Conversion
const language = 'JavaScript';
const result =
language.toUpperCase();
console.log(result);
Output

Click Run to see what this code prints.

toLowerCase()

Lowercase Conversion
const language = 'JavaScript';
const result =
language.toLowerCase();
console.log(result);
Output

Click Run to see what this code prints.

Searching Strings

JavaScript provides several methods for finding text inside strings.

Common Search Methods
Method Purpose
-------------------------------------
indexOf() Find first position
lastIndexOf() Find last position
includes() Check existence
startsWith() Check beginning
endsWith() Check ending
search() Search text or pattern

indexOf()

The indexOf() method returns the position of the first occurrence of a value.

indexOf()
const message =
'Learn JavaScript today';
console.log(
message.indexOf('JavaScript')
);
console.log(
message.indexOf('Python')
);
Output

Click Run to see what this code prints.

A result of -1 means the search value was not found.

lastIndexOf()

The lastIndexOf() method returns the position of the final occurrence of a value.

lastIndexOf()
const message =
'JavaScript is powerful. JavaScript is popular.';
console.log(
message.lastIndexOf('JavaScript')
);
Output

Click Run to see what this code prints.

includes()

The includes() method returns true when a string contains the specified value.

includes()
const message =
'Learn JavaScript today';
console.log(
message.includes('JavaScript')
);
console.log(
message.includes('Python')
);
Output

Click Run to see what this code prints.

Mini Challenge · JavaScript

includes() is case-sensitive, so searching for a lowercase term here misses the match. Fix the code so it prints true.

expected output: true

startsWith()

startsWith()
const url =
'https://programinds.com';
console.log(
url.startsWith('https://')
);
console.log(
url.startsWith('http://')
);
Output

Click Run to see what this code prints.

endsWith()

endsWith()
const fileName =
'profile-image.png';
console.log(
fileName.endsWith('.png')
);
console.log(
fileName.endsWith('.pdf')
);
Output

Click Run to see what this code prints.

search()

The search() method searches for a string or regular expression and returns the matching position.

search() Method
const message =
'Learn JavaScript Today';
console.log(
message.search(/javascript/i)
);
Output

Click Run to see what this code prints.

Extracting String Parts

JavaScript provides methods for extracting a section of a string without changing the original string.

slice()

The slice() method extracts characters from a start index up to, but not including, an end index.

slice()
const language = 'JavaScript';
console.log(
language.slice(0, 4)
);
console.log(
language.slice(4)
);
console.log(
language.slice(-6)
);
Output

Click Run to see what this code prints.

Mini Challenge · JavaScript

This should extract just the extension pdf without the dot, but slice(-4) grabs one character too many. Fix the starting index so it prints pdf.

expected output: pdf

substring()

The substring() method extracts characters between two indexes. Negative values are treated as 0.

substring()
const language = 'JavaScript';
console.log(
language.substring(0, 4)
);
console.log(
language.substring(4)
);
Output

Click Run to see what this code prints.

slice() vs substring()
Feature slice() substring()
-------------------------------------------------
Start Index Yes Yes
End Index Yes Yes
Negative Indexes Yes No
Recommended Yes Sometimes

substr() Legacy Method

The legacy substr() method extracts a specified number of characters beginning at a start position. It should generally be avoided in new code.

Legacy substr()
const language = 'JavaScript';
console.log(
language.substr(4, 6)
);
Output

Click Run to see what this code prints.

Legacy Method
  • substr() is considered legacy.
  • Avoid using it in new applications.
  • Use slice() instead.
  • Do not confuse substr() with substring().

Replacing Text

Strings can be transformed by replacing matching text with new text.

replace()

The replace() method replaces the first matching string when given a normal string search value.

replace()
const message =
'I love JavaScript';
const updated =
message.replace(
'JavaScript',
'Web Development'
);
console.log(updated);
Output

Click Run to see what this code prints.

Mini Challenge · JavaScript

replace() only replaces the first match, so the second JS is left unchanged. Fix the code so both occurrences become JavaScript.

expected output: JavaScript is fun. JavaScript is powerful.

replaceAll()

The replaceAll() method replaces every matching occurrence.

replaceAll()
const message =
'JavaScript is great. JavaScript is powerful.';
const updated =
message.replaceAll(
'JavaScript',
'JS'
);
console.log(updated);
Output

Click Run to see what this code prints.

Regular Expression Replacement

Regular expressions can perform flexible and case-insensitive replacements.

Global Replacement
const message =
'JavaScript javascript JAVASCRIPT';
const updated =
message.replace(
/javascript/gi,
'JS'
);
console.log(updated);
Output

Click Run to see what this code prints.

Removing Whitespace

Whitespace commonly appears around user input. JavaScript provides methods for removing it.

trim()

trim()
const input =
' JavaScript ';
const cleaned =
input.trim();
console.log(
`[${cleaned}]`
);
Output

Click Run to see what this code prints.

trimStart()

trimStart()
const input =
' JavaScript ';
console.log(
`[${input.trimStart()}]`
);
Output

Click Run to see what this code prints.

trimEnd()

trimEnd()
const input =
' JavaScript ';
console.log(
`[${input.trimEnd()}]`
);
Output

Click Run to see what this code prints.

Padding Strings

Padding adds characters to the beginning or end of a string until it reaches a specified length.

padStart()

padStart()
const number = '42';
const formatted =
number.padStart(5, '0');
console.log(formatted);
Output

Click Run to see what this code prints.

padEnd()

padEnd()
const label = 'Name';
const formatted =
label.padEnd(10, '.');
console.log(formatted);
Output

Click Run to see what this code prints.

Repeating Strings

A string can be repeated multiple times using repeat().

repeat()

repeat()
const separator =
'-'.repeat(20);
console.log(separator);
Output

Click Run to see what this code prints.

Rating Stars
const rating = 5;
const stars =
'⭐'.repeat(rating);
console.log(stars);
Output

Click Run to see what this code prints.

Splitting Strings

Splitting converts a string into an array based on a separator.

split()

split()
const languages =
'HTML,CSS,JavaScript';
const result =
languages.split(',');
console.log(result);
Output

Click Run to see what this code prints.

String to Array

Characters to Array
const word = 'CODE';
const characters =
word.split('');
console.log(characters);
Output

Click Run to see what this code prints.

Sentence to Words
const sentence =
'Learn JavaScript Today';
const words =
sentence.split(' ');
console.log(words);
Output

Click Run to see what this code prints.

Array to String

The join() method combines array elements into a string.

Array to String
const words = [
'Learn',
'JavaScript',
'Today'
];
const sentence =
words.join(' ');
console.log(sentence);
Output

Click Run to see what this code prints.

String Conversion

Numbers, booleans, arrays, and other values can be converted into strings.

String()

String() Conversion
console.log(String(100));
console.log(String(true));
console.log(String(null));
console.log(String(undefined));
Output

Click Run to see what this code prints.

toString()

toString()
const number = 500;
const text =
number.toString();
console.log(text);
console.log(typeof text);
Output

Click Run to see what this code prints.

Numbers and Strings

The + operator can perform numeric addition or string concatenation depending on the operand types.

Number and String
console.log(10 + 20);
console.log('10' + 20);
console.log(10 + '20');
Output

Click Run to see what this code prints.

Type Coercion
  • Number + Number performs addition.
  • String + Number usually performs concatenation.
  • Number + String usually performs concatenation.
  • Convert values explicitly when the intended behavior must be clear.

Booleans and Strings

Boolean Conversion
const isActive = true;
const text =
String(isActive);
console.log(text);
console.log(typeof text);
Output

Click Run to see what this code prints.

Objects and Strings

Directly converting a normal object to a string often produces a generic result.

Object String Conversion
const user = {
name: 'Aarav',
age: 25
};
console.log(String(user));
Output

Click Run to see what this code prints.

JSON.stringify() is commonly used when an object must be represented as structured text.

Object to JSON String
const user = {
name: 'Aarav',
age: 25
};
const text =
JSON.stringify(user);
console.log(text);
Output

Click Run to see what this code prints.

String Iteration

Strings are iterable, which means their characters can be processed one by one.

for Loop

Iterating with for
const word = 'CODE';
for (
let index = 0;
index < word.length;
index++
) {
console.log(
index,
word[index]
);
}
Output

Click Run to see what this code prints.

for...of Loop

Iterating with for...of
const word = 'CODE';
for (const character of word) {
console.log(character);
}
Output

Click Run to see what this code prints.

Spread Operator

The spread operator can expand a string into individual characters.

Spread String
const word = 'CODE';
const characters = [...word];
console.log(characters);
Output

Click Run to see what this code prints.

Unicode Strings

JavaScript strings use UTF-16 internally. Most common characters use one code unit, while some Unicode characters require two.

Unicode Characters
const message =
'Hello नमस्ते 你好 مرحبا';
console.log(message);
Output

Click Run to see what this code prints.

Emoji and Strings

Some emojis use multiple UTF-16 code units, so the length property may not always match the number of visible characters.

Emoji Length
const emoji = '😀';
console.log(emoji.length);
console.log([...emoji].length);
Output

Click Run to see what this code prints.

Unicode Awareness
  • length counts UTF-16 code units.
  • Some emojis use two code units.
  • Spread syntax handles many Unicode code points more naturally.
  • Complex emoji sequences can still contain multiple code points.
  • Visible character counting can require specialized segmentation.

Code Points

The codePointAt() method returns the Unicode code point of a character.

codePointAt()
const emoji = '😀';
console.log(
emoji.codePointAt(0)
);
Output

Click Run to see what this code prints.

fromCodePoint()
const emoji =
String.fromCodePoint(128512);
console.log(emoji);
Output

Click Run to see what this code prints.

Raw Strings

String.raw returns the raw form of a template literal, preserving backslashes.

String.raw
const path =
String.raw`C:\Users\Aarav\Documents`;
console.log(path);
Output

Click Run to see what this code prints.

Tagged Templates

A tagged template passes template literal parts and values to a function for custom processing.

Tagged Template
function highlight(
strings,
value
) {
return (
strings[0] +
value.toUpperCase() +
strings[1]
);
}
const course = 'javascript';
const message =
highlight`Learn ${course} today!`;
console.log(message);
Output

Click Run to see what this code prints.

Common String Patterns

Real-world applications repeatedly use certain string-processing patterns. Understanding these patterns improves problem-solving skills.

Capitalize First Letter

Capitalize First Letter
function capitalize(text) {
if (text.length === 0) {
return '';
}
return (
text[0].toUpperCase() +
text.slice(1)
);
}
console.log(
capitalize('javascript')
);
Output

Click Run to see what this code prints.

Mini Challenge · JavaScript

This capitalize function duplicates the first letter because it slices from index 0 instead of skipping it. Fix the slice call so it prints Code.

expected output: Code

Reverse a String

Reverse String
function reverseString(text) {
return [...text]
.reverse()
.join('');
}
console.log(
reverseString('JavaScript')
);
Output

Click Run to see what this code prints.

Count Characters

Count a Character
function countCharacter(
text,
target
) {
let count = 0;
for (const character of text) {
if (character === target) {
count++;
}
}
return count;
}
console.log(
countCharacter(
'JavaScript',
'a'
)
);
Output

Click Run to see what this code prints.

Count Words

Count Words
function countWords(text) {
const cleaned = text.trim();
if (cleaned === '') {
return 0;
}
return cleaned
.split(/\s+/)
.length;
}
console.log(
countWords(
'Learn JavaScript step by step'
)
);
Output

Click Run to see what this code prints.

Check Palindrome

A palindrome reads the same forward and backward.

Palindrome Checker
function isPalindrome(text) {
const cleaned = text
.toLowerCase()
.replace(/[^a-z0-9]/g, '');
const reversed =
[...cleaned]
.reverse()
.join('');
return cleaned === reversed;
}
console.log(
isPalindrome('Madam')
);
console.log(
isPalindrome('JavaScript')
);
Output

Click Run to see what this code prints.

Generate Slug

A slug is a URL-friendly version of text.

Slug Generator
function createSlug(title) {
return title
.trim()
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
}
console.log(
createSlug(
'JavaScript Strings Complete Guide'
)
);
Output

Click Run to see what this code prints.

Mask Sensitive Text

Mask Card Number
function maskCardNumber(number) {
const visible =
number.slice(-4);
const hidden =
'*'.repeat(
number.length - 4
);
return hidden + visible;
}
console.log(
maskCardNumber(
'1234567812345678'
)
);
Output

Click Run to see what this code prints.

Truncate Long Text

Truncate Text
function truncate(
text,
maximumLength
) {
if (
text.length <= maximumLength
) {
return text;
}
return (
text.slice(
0,
maximumLength
) + '...'
);
}
console.log(
truncate(
'JavaScript is a powerful programming language.',
20
)
);
Output

Click Run to see what this code prints.

Complete String Example

The following example builds a live text analyzer that uses several string properties and methods together.

index.html
<div class="text-analyzer">
<h2>Text Analyzer</h2>
<textarea
id="textInput"
rows="8"
placeholder="Enter your text..."
></textarea>
<div class="stats">
<p>
Characters:
<strong id="characterCount">
0
</strong>
</p>
<p>
Words:
<strong id="wordCount">
0
</strong>
</p>
<p>
Sentences:
<strong id="sentenceCount">
0
</strong>
</p>
</div>
<div class="actions">
<button id="uppercaseButton">
UPPERCASE
</button>
<button id="lowercaseButton">
lowercase
</button>
<button id="capitalizeButton">
Capitalize Words
</button>
<button id="clearButton">
Clear
</button>
</div>
<p id="preview"></p>
</div>
script.js
const textInput =
document.getElementById(
'textInput'
);
const characterCount =
document.getElementById(
'characterCount'
);
const wordCount =
document.getElementById(
'wordCount'
);
const sentenceCount =
document.getElementById(
'sentenceCount'
);
const uppercaseButton =
document.getElementById(
'uppercaseButton'
);
const lowercaseButton =
document.getElementById(
'lowercaseButton'
);
const capitalizeButton =
document.getElementById(
'capitalizeButton'
);
const clearButton =
document.getElementById(
'clearButton'
);
const preview =
document.getElementById(
'preview'
);
textInput.addEventListener(
'input',
updateAnalysis
);
uppercaseButton.addEventListener(
'click',
function () {
textInput.value =
textInput.value.toUpperCase();
updateAnalysis();
}
);
lowercaseButton.addEventListener(
'click',
function () {
textInput.value =
textInput.value.toLowerCase();
updateAnalysis();
}
);
capitalizeButton.addEventListener(
'click',
function () {
textInput.value =
capitalizeWords(
textInput.value
);
updateAnalysis();
}
);
clearButton.addEventListener(
'click',
function () {
textInput.value = '';
updateAnalysis();
textInput.focus();
}
);
function updateAnalysis() {
const text =
textInput.value;
const trimmedText =
text.trim();
characterCount.textContent =
text.length;
wordCount.textContent =
countWords(trimmedText);
sentenceCount.textContent =
countSentences(trimmedText);
preview.textContent =
createPreview(trimmedText);
}
function countWords(text) {
if (text === '') {
return 0;
}
return text
.split(/\s+/)
.length;
}
function countSentences(text) {
if (text === '') {
return 0;
}
const sentences =
text.match(/[^.!?]+[.!?]+/g);
return sentences
? sentences.length
: 1;
}
function capitalizeWords(text) {
return text
.split(' ')
.map(function (word) {
if (word === '') {
return '';
}
return (
word[0].toUpperCase() +
word.slice(1).toLowerCase()
);
})
.join(' ');
}
function createPreview(text) {
if (text === '') {
return 'Preview will appear here.';
}
if (text.length <= 80) {
return text;
}
return text.slice(0, 80) + '...';
}
updateAnalysis();
Browser Output

Click Run to see what this code prints.

What This Example Demonstrates
  • Reading text from a textarea.
  • Using the length property.
  • Removing unnecessary whitespace.
  • Splitting text into words.
  • Using regular expressions with strings.
  • Converting text to uppercase.
  • Converting text to lowercase.
  • Capitalizing words.
  • Extracting text with slice().
  • Creating text previews.
  • Updating browser content dynamically.
  • Combining strings with DOM events.

String Processing Flow

String Processing Flow
RAW TEXT
│
▼
┌───────────────────────────┐
│ RECEIVE STRING │
│ │
│ Form Input │
│ API Response │
│ Database Value │
│ User Message │
└─────────────┬─────────────┘
│
▼
┌───────────────────────────┐
│ CLEAN │
│ │
│ trim() │
│ replace() │
│ replaceAll() │
└─────────────┬─────────────┘
│
▼
┌───────────────────────────┐
│ VALIDATE │
│ │
│ length │
│ includes() │
│ startsWith() │
│ endsWith() │
└─────────────┬─────────────┘
│
▼
┌───────────────────────────┐
│ TRANSFORM │
│ │
│ toUpperCase() │
│ toLowerCase() │
│ slice() │
│ split() │
└─────────────┬─────────────┘
│
▼
┌───────────────────────────┐
│ OUTPUT │
│ │
│ Display │
│ Store │
│ Send to API │
│ Generate URL │
└───────────────────────────┘

Real-World Applications

Form Validation

Clean and validate names, emails, passwords, phone numbers, and other input.

Search Systems

Perform case-insensitive searches and keyword matching.

Chat Applications

Process, format, truncate, and display user messages.

URL Generation

Create slugs, routes, query values, and URL-friendly text.

E-Commerce

Format product names, descriptions, SKUs, and order information.

Email Systems

Build subjects, templates, greetings, and dynamic email content.

Security Interfaces

Mask card numbers, phone numbers, tokens, and other sensitive text.

Text Analytics

Count characters, words, sentences, and keyword occurrences.

API Processing

Clean and transform text received from backend services.

Dynamic HTML

Generate interface text using template literals and variables.

Common Beginner Mistakes

Avoid These Mistakes
  • Forgetting quotation marks around string values.
  • Mixing opening and closing quote types incorrectly.
  • Forgetting to escape apostrophes inside single-quoted strings.
  • Forgetting to escape double quotes inside double-quoted strings.
  • Confusing backticks with single quotes.
  • Using ${} outside a template literal.
  • Using normal quotes when interpolation is required.
  • Creating String objects with new String().
  • Confusing primitive strings with String objects.
  • Using loose equality because of String object conversion.
  • Forgetting that string indexes begin at 0.
  • Using length as the final valid index.
  • Forgetting that the final index is length - 1.
  • Trying to modify individual string characters directly.
  • Forgetting that strings are immutable.
  • Assuming string methods change the original string.
  • Not storing the returned value of a string method.
  • Confusing an empty string with a string containing spaces.
  • Forgetting that spaces count toward length.
  • Expecting bracket notation and charAt() to behave identically for invalid indexes.
  • Forgetting that at() supports negative indexes.
  • Using + for numeric addition when one operand is a string.
  • Creating complicated concatenation instead of using template literals.
  • Forgetting spaces while concatenating strings.
  • Assuming string comparison is case-insensitive.
  • Comparing user input without normalizing case.
  • Assuming localeCompare() always returns exactly -1 or 1.
  • Forgetting that indexOf() returns -1 when no match exists.
  • Using indexOf() when includes() would be clearer.
  • Assuming includes() ignores letter case.
  • Assuming startsWith() and endsWith() ignore case.
  • Confusing slice() with substring().
  • Using legacy substr() in new code.
  • Forgetting that the end index in slice() is excluded.
  • Expecting replace() with a string argument to replace every occurrence.
  • Using replace() when replaceAll() is required.
  • Forgetting regular expression flags during replacement.
  • Forgetting to trim user input before validation.
  • Assuming trim() removes spaces inside the string.
  • Using split() with the wrong separator.
  • Forgetting that split() returns an array.
  • Forgetting that join() belongs to arrays.
  • Calling toString() on null or undefined.
  • Assuming String(object) produces useful structured text.
  • Ignoring JSON.stringify() for object serialization.
  • Assuming length always equals the number of visible Unicode characters.
  • Breaking emojis by processing UTF-16 code units incorrectly.
  • Using split("") for all Unicode-sensitive character operations.
  • Forgetting to handle empty strings in utility functions.
  • Counting words with split(" ") without cleaning repeated whitespace.
  • Creating slugs without removing invalid characters.
  • Displaying long text without truncation.
  • Masking sensitive values without checking their length.
  • Using regular expressions without understanding what they match.
  • Repeating expensive string transformations unnecessarily.
  • Ignoring readability when chaining many string methods.
Common String Mistakes
// ❌ Missing quotes
// const language = JavaScript;
// ❌ Mixed quotes
// const message = 'Hello";
// ❌ Wrong final index
const word = 'CODE';
console.log(word[word.length]);
// undefined
// ❌ Trying to mutate a string
let name = 'Aarav';
name[0] = 'P';
console.log(name);
// Aarav
// ❌ Ignoring returned value
let course = 'javascript';
course.toUpperCase();
console.log(course);
// javascript
// ❌ Case-sensitive search
console.log(
'JavaScript'.includes('javascript')
);
// false
// ❌ replace() replaces one match
console.log(
'JS JS JS'.replace('JS', 'JavaScript')
);
// JavaScript JS JS
// ❌ Numeric string concatenation
console.log('10' + 20);
// 1020

Best Practices

  • Use consistent quotation style throughout a project.
  • Follow the project formatter or linting configuration.
  • Use template literals for dynamic strings.
  • Use template literals for readable multiline content.
  • Prefer primitive strings over String objects.
  • Avoid new String().
  • Use strict equality when comparing strings.
  • Remember that string indexes begin at zero.
  • Use length - 1 for the final normal index.
  • Use at(-1) when accessing the final character.
  • Remember that strings are immutable.
  • Store the return value of string transformations.
  • Use const for string variables that are not reassigned.
  • Use let only when the variable must receive a new string.
  • Trim user input before validation when surrounding whitespace is irrelevant.
  • Normalize letter case for case-insensitive comparisons.
  • Use includes() for clear existence checks.
  • Use startsWith() for prefixes.
  • Use endsWith() for suffixes and file extensions.
  • Use indexOf() when the matching position is required.
  • Use slice() for most string extraction tasks.
  • Avoid legacy substr().
  • Use replaceAll() when every literal occurrence must be replaced.
  • Use regular expressions only when pattern matching is genuinely required.
  • Keep regular expressions readable and documented when complex.
  • Use split() to convert structured text into arrays.
  • Use join() to combine array values into strings.
  • Use explicit String() conversion when intent should be obvious.
  • Be careful when combining strings and numbers with +.
  • Use JSON.stringify() for structured object serialization.
  • Handle empty strings in reusable utility functions.
  • Consider Unicode when processing international text.
  • Use for...of or spread syntax for many code-point-aware operations.
  • Do not assume length equals visible character count.
  • Use locale-aware comparison when sorting human-language text.
  • Validate input before applying transformations that assume a format.
  • Avoid unnecessarily long chains of string methods.
  • Break complex transformations into named steps.
  • Use descriptive names such as normalizedEmail or trimmedInput.
  • Keep original data when destructive-looking transformations may need to be reversed.
  • Test string utilities with empty values.
  • Test string utilities with spaces.
  • Test string utilities with uppercase and lowercase text.
  • Test string utilities with Unicode characters.
  • Test string utilities with emojis when relevant.
  • Never rely only on frontend string validation for security.
  • Escape or sanitize untrusted content before inserting it into HTML.
  • Use textContent instead of innerHTML when displaying plain user text.
  • Keep string-processing functions small and focused.
  • Prefer clear code over clever one-line transformations.
Well-Structured String Processing
function normalizeEmail(email) {
return email
.trim()
.toLowerCase();
}
function createUserSlug(name) {
return name
.trim()
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
}
function createGreeting(name) {
const cleanedName =
name.trim();
if (cleanedName === '') {
return 'Welcome!';
}
return `Welcome, ${cleanedName}!`;
}
const email =
normalizeEmail(
' USER@EXAMPLE.COM '
);
const slug =
createUserSlug(
'Aarav Sharma'
);
const greeting =
createGreeting('Aarav');
console.log(email);
console.log(slug);
console.log(greeting);
Output

Click Run to see what this code prints.

Frequently Asked Questions

A string is a sequence of characters used to represent textual data.

You can use single quotes, double quotes, or backticks.

They create the same type of primitive string. The difference is mainly syntax and project style.

Template literals are strings created with backticks that support interpolation, expressions, and multiline text.

Use ${expression} inside a backtick string.

Yes. Any valid JavaScript expression can be evaluated inside ${}.

Usually no. It creates a String object instead of a primitive string and can cause confusing behavior.

String() converts a value into a primitive string.

An empty string contains zero characters and is written as two quotes or backticks with nothing between them.

An empty string is falsy.

Use the length property.

Yes. Spaces are characters and contribute to the length.

String indexes begin at 0.

The final index is string.length - 1.

Use bracket notation, charAt(), or at().

It returns undefined.

It returns an empty string.

It supports negative indexes, making it easy to access characters from the end.

Use string.at(-1) or string[string.length - 1].

No. Strings are immutable.

Individual characters in an existing string cannot be changed directly.

Most string methods return a new string and leave the original unchanged.

An escape sequence represents special characters such as newlines, tabs, quotes, and backslashes.

Use the \n escape sequence.

Template literals are usually the clearest approach.

Concatenation means combining multiple strings into one.

Use the + operator, += operator, concat(), or template literals.

Template literals are usually more readable than complex concatenation.

Yes. JavaScript compares uppercase and lowercase letters as different characters.

Convert both strings to the same case before comparing them.

It performs locale-aware string comparison useful for sorting human-language text.

Use toUpperCase().

Use toLowerCase().

Use methods such as indexOf(), includes(), search(), or lastIndexOf().

It returns -1.

It returns true or false.

Use startsWith().

Use endsWith().

Use slice() or substring().

Yes.

No. Negative values are treated as 0.

Avoid it in new code because it is a legacy method.

Not when given a normal string search value. It replaces the first matching occurrence.

Use replaceAll() or an appropriate global regular expression.

Use trim().

It removes whitespace from the beginning of a string.

It removes whitespace from the end of a string.

Use padStart().

Use padEnd().

Use repeat().

Use split() or spread syntax depending on the desired result.

Use join().

Use String(number) or number.toString().

The + operator usually performs string concatenation.

Use JSON.stringify() when JSON representation is appropriate.

Yes. Use a for loop or for...of loop.

Yes. Spread syntax can expand many strings into an array of Unicode code points.

Some emojis require two UTF-16 code units.

No. Unicode and complex emoji sequences can make visible character counting more complicated.

It returns the Unicode code point beginning at a specified position.

It creates a string from one or more Unicode code points.

It returns the raw form of a template literal and preserves backslashes.

It is a template literal processed by a function.

Combine the uppercase first character with the remainder of the string.

A common approach is to convert it to an array, reverse the array, and join it again.

Trim the text and split it using a whitespace pattern.

A palindrome is text that reads the same forward and backward after appropriate normalization.

A slug is a URL-friendly text value commonly created from a title.

Keep only the required visible portion and replace the remaining characters with masking symbols.

Check the length, extract the required portion with slice(), and append an ellipsis when necessary.

Key Takeaways

  • Strings represent textual data.
  • Strings can use single quotes, double quotes, or backticks.
  • Template literals support interpolation and multiline text.
  • Primitive strings should usually be preferred over String objects.
  • The length property returns the number of UTF-16 code units.
  • String indexes begin at zero.
  • The final normal index is length - 1.
  • Bracket notation accesses characters by index.
  • charAt() returns a character at a specified position.
  • at() supports negative indexes.
  • Strings are immutable.
  • String methods usually return new strings.
  • Escape sequences represent special characters.
  • The + operator can concatenate strings.
  • Template literals simplify dynamic string creation.
  • String comparisons are case-sensitive.
  • Case normalization enables case-insensitive comparisons.
  • localeCompare() supports locale-aware comparison.
  • toUpperCase() converts text to uppercase.
  • toLowerCase() converts text to lowercase.
  • indexOf() returns a matching position or -1.
  • includes() returns true or false.
  • startsWith() checks prefixes.
  • endsWith() checks suffixes.
  • slice() extracts part of a string.
  • substring() is similar but does not support negative indexes.
  • substr() should be avoided in new code.
  • replace() replaces matching text.
  • replaceAll() replaces every matching occurrence.
  • trim() removes surrounding whitespace.
  • padStart() and padEnd() add padding.
  • repeat() repeats a string.
  • split() converts strings into arrays.
  • join() combines arrays into strings.
  • String() explicitly converts values to strings.
  • The + operator can cause unexpected string coercion.
  • for and for...of can iterate through strings.
  • Unicode can make string length more complex.
  • Some emojis use multiple UTF-16 code units.
  • String utility functions are common in real applications.
  • Text should be cleaned before validation.
  • User-generated content must be handled safely before HTML insertion.

Summary

Strings are sequences of characters used to represent text. They are one of the most important and frequently used data types in JavaScript.

JavaScript strings can be created with single quotes, double quotes, or template literals. Template literals are especially useful for dynamic content, expressions, and multiline text.

Characters can be accessed using indexes, bracket notation, charAt(), and at(). Strings are immutable, so methods and transformations create new string values instead of changing the original characters directly.

JavaScript provides methods for changing case, searching, extracting, replacing, trimming, padding, repeating, splitting, comparing, and converting strings.

Strings can also be iterated, converted into arrays, processed with regular expressions, and used to build practical features such as search systems, slugs, text previews, validation, masking, and text analysis.

Understanding Unicode is important because the length property counts UTF-16 code units rather than always counting visible characters exactly.

Mastering strings gives you the ability to process user input, format application content, validate text, generate dynamic interfaces, and solve many real-world programming problems.

Lesson 16 Completed
  • You understand what JavaScript strings are.
  • You can create strings using different syntaxes.
  • You understand template literals.
  • You understand primitive strings and String objects.
  • You can find string length.
  • You can access individual characters.
  • You understand bracket notation.
  • You can use charAt().
  • You can use at().
  • You understand string immutability.
  • You can use escape sequences.
  • You can create multiline strings.
  • You can concatenate strings.
  • You can use template interpolation.
  • You can compare strings.
  • You can perform case-insensitive comparisons.
  • You can change string case.
  • You can search inside strings.
  • You can extract parts of strings.
  • You can replace text.
  • You can remove whitespace.
  • You can pad and repeat strings.
  • You can split strings into arrays.
  • You can convert values into strings.
  • You can iterate through strings.
  • You understand basic Unicode behavior.
  • You understand emoji length differences.
  • You can capitalize text.
  • You can reverse strings.
  • You can count characters and words.
  • You can check palindromes.
  • You can generate URL slugs.
  • You can mask sensitive text.
  • You can truncate long text.
  • You can build a complete text analyzer.
  • You are ready to learn JavaScript Arrays.
Next Lesson →

JavaScript Arrays