Cách dùng chuỗi (String) trong JavaScript

Javascript căn bản | by Học Javascript

Trong JavaScript, chuỗi (String) là một trong những kiểu dữ liệu quan trọng và được sử dụng rộng rãi. Chuỗi không chỉ giúp hiển thị nội dung trên giao diện mà còn đóng vai trò quan trọng trong việc xử lý dữ liệu, giao tiếp với API và thao tác với văn bản.

JavaScript cung cấp nhiều cách để khai báo chuỗi, bao gồm dấu nháy đơn ('...'), dấu nháy đôi ("..."), và Template Literals (`...`) – một cú pháp linh hoạt giúp dễ dàng nội suy biến và tạo chuỗi nhiều dòng. Ngoài ra, JavaScript cũng cung cấp nhiều phương thức hữu ích để xử lý chuỗi như cắt, nối, tìm kiếm, thay thế và chuyển đổi kiểu dữ liệu.

Trong bài viết này, mình sẽ tìm hiểu chi tiết về chuỗi trong JavaScript, cách khai báo, các phương thức xử lý quan trọng, cũng như những lỗi thường gặp khi làm việc với chuỗi. Qua đó, bạn sẽ có cái nhìn toàn diện và áp dụng hiệu quả vào các dự án thực tế.

Khái niệm về chuỗi trong JavaScript

Định nghĩa Chuỗi (String) là gì?

Chuỗi (String) trong JavaScript là một kiểu dữ liệu dùng để lưu trữ và xử lý văn bản. Chuỗi bao gồm một tập hợp các ký tự được đặt trong dấu nháy đơn ('...'), dấu nháy đôi ("..."), hoặc dấu Template Literals (`...`).

Ví dụ về chuỗi:

let str1 = 'Hello, JavaScript!';
let str2 = "Chuỗi trong JavaScript";
let str3 = `Template Literals giúp nối chuỗi dễ dàng`;

Ứng dụng của chuỗi:

  • Hiển thị nội dung trên trang web.
  • Xử lý dữ liệu đầu vào của người dùng.
  • Giao tiếp với API thông qua dữ liệu JSON.
  • Thao tác với URL, đường dẫn file, v.v.

Cách khai báo chuỗi trong JavaScript

Dùng dấu nháy đơn ('...')

Chuỗi có thể được khai báo bằng dấu nháy đơn:

let message = 'Hello, World!';
console.log(message); // Output: Hello, World!

Lưu ý: Khi dùng nháy đơn, nếu chuỗi chứa dấu nháy đơn ('), ta cần dùng ký tự escape (') để tránh lỗi:

let text = 'I'm learning JavaScript';
console.log(text); // Output: I'm learning JavaScript

Dùng dấu nháy đôi ("...")

Tương tự dấu nháy đơn, nhưng cho phép chứa dấu nháy đơn mà không cần escape:

let message = "I'm learning JavaScript";
console.log(message); // Output: I'm learning JavaScript

Lưu ý: Nếu trong chuỗi có dấu nháy đôi (") thì cần escape (\"):

let quote = "He said: \"JavaScript is awesome!\"";
console.log(quote); // Output: He said: "JavaScript is awesome!"

Dùng Template Literals (`...`)

Template Literals (Template Strings) là một cách khai báo chuỗi hiện đại trong ES6 giúp:

  • Nội suy biến dễ dàng bằng cú pháp ${}.
  • Tạo chuỗi nhiều dòng mà không cần \n.
let name = "Alice";
let greeting = `Xin chào, tôi là ${name}`;
console.log(greeting); // Output: Xin chào, tôi là Alice

Chuỗi nhiều dòng với Template Literals:

let multiLine = `Dòng 1
Dòng 2
Dòng 3`;
console.log(multiLine);

Không cần dùng + để nối chuỗi:

let product = "Laptop";
let price = 1500;
let info = `Sản phẩm: ${product}, Giá: ${price} USD`;
console.log(info); // Output: Sản phẩm: Laptop, Giá: 1500 USD

So sánh dấu nháy đơn, nháy đôi và Template Literals trong JavaScript

Cách khai báo Ưu điểm Nhược điểm Khi nào nên dùng?
Nháy đơn '...' Ngắn gọn, phổ biến Phải escape (') nếu có dấu ' Khi không cần nội suy biến
Nháy đôi "..." Hỗ trợ dấu ' mà không cần escape Phải escape (\") nếu có dấu " Khi cần chứa dấu ' trong chuỗi
Template Literals `...` Nội suy biến ${}, dễ viết nhiều dòng Chỉ hỗ trợ từ ES6 (ES2015) Khi cần chèn biến hoặc chuỗi nhiều dòng

Lời khuyên:

  • Nếu cần nội suy biến hoặc chuỗi nhiều dòng → Dùng Template Literals.
  • Nếu chỉ cần khai báo chuỗi đơn giản → Dùng dấu nháy đơn ' hoặc nháy đôi ".

Tính chất bất biến của Chuỗi (Immutable Strings)

Chuỗi trong JavaScript là bất biến (Immutable), nghĩa là một khi đã tạo, nó không thể thay đổi nội dung.

let str = "Hello";
str[0] = "J"; // Không có tác dụng
console.log(str); // Output: Hello
  • Dù ta cố gắng thay đổi ký tự đầu tiên (str[0] = "J"), nhưng chuỗi vẫn giữ nguyên.
  • Nếu muốn thay đổi nội dung chuỗi, ta phải tạo chuỗi mới:
let str = "Hello";
str = "J" + str.slice(1);
console.log(str); // Output: Jello

Lưu ý:

  • Chuỗi trong JavaScript không thể thay đổi trực tiếp.
  • Khi cần chỉnh sửa chuỗi, phải tạo một chuỗi mới thay vì sửa đổi chuỗi cũ.

Các phương thức xử lý Chuỗi quan trọng trong JavaScript

JavaScript cung cấp nhiều phương thức giúp thao tác với chuỗi một cách dễ dàng. Dưới đây là những phương thức quan trọng thường được sử dụng.

Lấy độ dài chuỗi – length

Thuộc tính length trả về số ký tự trong chuỗi, bao gồm cả dấu cách.

let text = "JavaScript!";
console.log(text.length); // Output: 11

Ứng dụng:

  • Xác định độ dài mật khẩu hợp lệ.
  • Kiểm tra xem một chuỗi có rỗng hay không (text.length === 0).

Chuyển đổi chữ hoa, chữ thường

Dùng toUpperCase() để chuyển thành chữ hoa, toLowerCase() để chuyển thành chữ thường.

let message = "Hello JavaScript!";
console.log(message.toUpperCase()); // Output: HELLO JAVASCRIPT!
console.log(message.toLowerCase()); // Output: hello javascript!

Ứng dụng:

  • Kiểm tra dữ liệu nhập vào không phân biệt hoa/thường.
  • Xử lý tìm kiếm với dữ liệu nhập vào có thể khác nhau về kiểu chữ.

Cắt chuỗi

Phương thức Cú pháp Mô tả
slice(start, end) str.slice(2, 5) Cắt chuỗi từ vị trí start đến end (không lấy end).
substring(start, end) str.substring(2, 5) Giống slice(), nhưng không nhận giá trị âm.
substr(start, length) str.substr(2, 3) Cắt chuỗi từ vị trí start và lấy length ký tự. (Không khuyến nghị sử dụng vì bị loại bỏ ở ES6+)
let text = "JavaScript là ngôn ngữ lập trình!";
console.log(text.slice(0, 10));  // Output: JavaScript
console.log(text.substring(11, 17)); // Output: là ngôn
console.log(text.substr(11, 6)); // Output: là ngôn

Ứng dụng:

  • Cắt tiêu đề bài viết quá dài.
  • Lấy phần mở rộng của tên file (filename.slice(-3)).

Tìm kiếm trong chuỗi

Phương thức Cú pháp Mô tả
indexOf(substring) str.indexOf("JS") Trả về vị trí đầu tiên tìm thấy substring, -1 nếu không có.
lastIndexOf(substring) str.lastIndexOf("JS") Tìm vị trí xuất hiện cuối cùng của substring.
includes(substring) str.includes("JS") Kiểm tra chuỗi có chứa substring hay không (trả về true/false).
startsWith(substring) str.startsWith("JS") Kiểm tra chuỗi có bắt đầu bằng substring hay không.
endsWith(substring) str.endsWith("JS") Kiểm tra chuỗi có kết thúc bằng substring hay không.
let text = "Học JavaScript với ChatGPT!";
console.log(text.indexOf("JavaScript")); // Output: 4
console.log(text.lastIndexOf("t")); // Output: 22
console.log(text.includes("ChatGPT")); // Output: true
console.log(text.startsWith("Học")); // Output: true
console.log(text.endsWith("!")); // Output: true
  • Kiểm tra xem URL có bắt đầu bằng "https://" hay không.
  • Kiểm tra email có chứa "@".

Thay thế nội dung chuỗi

Phương thức Cú pháp Mô tả
replace(old, new) str.replace("JS", "JavaScript") Thay thế old bằng new (chỉ thay thế lần đầu tiên tìm thấy).
replaceAll(old, new) str.replaceAll("JS", "JavaScript") Thay thế tất cả các lần xuất hiện của old.
let text = "Học JS, thực hành JS";
console.log(text.replace("JS", "JavaScript")); // Output: Học JavaScript, thực hành JS
console.log(text.replaceAll("JS", "JavaScript")); // Output: Học JavaScript, thực hành JavaScript
  • Censor từ ngữ nhạy cảm trong văn bản.
  • Thay thế dấu phẩy , thành dấu . trong số liệu.

Tách chuỗi thành mảng split()

Phương thức split(separator) chia chuỗi thành một mảng các phần tử dựa trên ký tự phân tách.

let text = "HTML,CSS,JavaScript";
let arr = text.split(",");
console.log(arr); // Output: ["HTML", "CSS", "JavaScript"]
  • Chuyển đổi danh sách email thành mảng.
  • Phân tách câu thành từ để xử lý ngữ nghĩa.

Nối chuỗi

Cách nối chuỗi Cú pháp
Dùng + str1 + str2
Dùng concat() str1.concat(str2, str3)
Dùng Template Literals `${str1} ${str2}`
let firstName = "Alice";
let lastName = "Johnson";

console.log(firstName + " " + lastName); // Output: Alice Johnson
console.log(firstName.concat(" ", lastName)); // Output: Alice Johnson
console.log(`${firstName} ${lastName}`); // Output: Alice Johnson
  • Ghép tiêu đề và nội dung bài viết.
  • Tạo URL động với tham số.

Xóa khoảng trắng thừa

Dùng trim(), trimStart(), trimEnd() để xóa khoảng trắng thừa.

Phương thức Cú pháp Mô tả
trim() str.trim() Xóa khoảng trắng ở đầu và cuối chuỗi.
trimStart() str.trimStart() Xóa khoảng trắng ở đầu chuỗi.
trimEnd() str.trimEnd() Xóa khoảng trắng ở cuối chuỗi.
let text = "   JavaScript   ";
console.log(text.trim());  // Output: "JavaScript"
console.log(text.trimStart()); // Output: "JavaScript   "
console.log(text.trimEnd()); // Output: "   JavaScript"
  • Chuẩn hóa dữ liệu nhập từ người dùng (loại bỏ dấu cách dư thừa).
  • Xử lý form đăng nhập.

Làm việc với Template Literals trong JavaScript

Tổng quan về Template Literals ( )

Template Literals là một cách mới để làm việc với chuỗi trong JavaScript, được giới thiệu từ ES6. Thay vì sử dụng dấu nháy đơn ('...') hoặc nháy đôi ("..."), chúng ta có thể sử dụng dấu backtick (`...`).

let message = `Chào mừng đến với JavaScript!`;
console.log(message); // Output: Chào mừng đến với JavaScript!

Lợi ích của Template Literals:

  • Dễ dàng nội suy biến mà không cần dùng toán tử +.
  • Xuống dòng dễ dàng mà không cần ký tự \n.
  • Có thể chứa biểu thức trong {}.
  • Tăng tính dễ đọc và bảo trì mã nguồn.

Nội suy biến trong Chuỗi (${})

Template Literals cho phép chèn biến và biểu thức vào trong chuỗi bằng cú pháp ${} mà không cần dùng phép nối chuỗi (+).

let name = "Alice";
let age = 25;
console.log(`Tên tôi là ${name} và tôi ${age} tuổi.`);
// Output: Tên tôi là Alice và tôi 25 tuổi.

Chèn biểu thức vào chuỗi:

let a = 10, b = 5;
console.log(`Tổng của ${a} và ${b} là ${a + b}.`);
// Output: Tổng của 10 và 5 là 15.

Gọi hàm trong Template Literals:

function greet(name) {
    return `Xin chào, ${name}!`;
}

console.log(`Thông điệp: ${greet("John")}`);
// Output: Thông điệp: Xin chào, John!

Xuống dòng trong Chuỗi một cách dễ dàng

Với Template Literals, ta có thể viết chuỗi nhiều dòng mà không cần dùng \n.

let message = `Xin chào!
Đây là một chuỗi nhiều dòng
trong JavaScript.`;
console.log(message);

Output:

Xin chào!
Đây là một chuỗi nhiều dòng
trong JavaScript.

So sánh với cách cũ:
Cách cũ phải dùng \n:

let message = "Xin chào!\nĐây là một chuỗi nhiều dòng\ntrong JavaScript.";
console.log(message);

Cách mới dễ đọc hơn với Template Literals.

Ví dụ thực tế về Template Literals trong JavaScript

Hiển thị thông tin người dùng

let user = {
    name: "David",
    email: "[email protected]",
    age: 30
};

console.log(`Người dùng: ${user.name}
Email: ${user.email}
Tuổi: ${user.age}`);

Output:

Người dùng: David
Email: [email protected]
Tuổi: 30

Tạo HTML động với Template Literals

let product = {
    name: "Laptop",
    price: 1500,
    brand: "Dell"
};

let productHTML = `
    <div>
        <h2>${product.name}</h2>
        <p>Thương hiệu: ${product.brand}</p>
        <p>Giá: ${product.price} USD</p>
    </div>
`;

console.log(productHTML);

Ứng dụng: Dùng trong ReactJS, VueJS, hoặc khi render nội dung HTML từ JavaScript.

Tạo URL động

let baseUrl = "https://api.example.com/users";
let userId = 123;

let apiUrl = `${baseUrl}/${userId}`;
console.log(apiUrl);
// Output: https://api.example.com/users/123

Ứng dụng: Khi tạo API request động trong ứng dụng web.

Định dạng số với Template Literals

let price = 999.5;
console.log(`Giá sản phẩm: $${price.toFixed(2)}`);
// Output: Giá sản phẩm: $999.50
Ứng dụng: Hiển thị giá tiền, số liệu chuẩn xác trong các ứng dụng thương mại điện tử.

Chuyển đổi chuỗi và kiểu dữ liệu trong JavaScript

Trong lập trình JavaScript, chúng ta thường cần chuyển đổi dữ liệu giữa các kiểu như số (number), chuỗi (string)mảng (array) để xử lý dữ liệu hiệu quả hơn. Dưới đây là các cách phổ biến để chuyển đổi chuỗi và các kiểu dữ liệu liên quan.

Chuyển đổi số thành chuỗi

Trong một số trường hợp, chúng ta cần biến số thành chuỗi, ví dụ như khi hiển thị dữ liệu lên giao diện. Có hai cách phổ biến để làm điều này:

Cách 1: Dùng String()

Hàm String(value) có thể chuyển đổi một số thành chuỗi.

let num = 123;
let strNum = String(num);

console.log(strNum); // Output: "123"
console.log(typeof strNum); // Output: "string"

Ưu điểm: Hoạt động với bất kỳ kiểu dữ liệu nào, kể cả null hay undefined.

Cách 2: Dùng toString()

Phương thức toString() được gọi trực tiếp trên một số để chuyển thành chuỗi.

let num = 456;
let strNum = num.toString();

console.log(strNum); // Output: "456"
console.log(typeof strNum); // Output: "string"

Lưu ý: toString() không hoạt động với giá trị null hoặc undefined và sẽ gây lỗi nếu gọi trên null.

So sánh String()toString()

Phương thức Ưu điểm Nhược điểm
String(value) Chuyển đổi được mọi giá trị Không gọi trực tiếp trên số được
toString() Ngắn gọn, dễ đọc Không dùng được với null hoặc undefined

Chuyển đổi chuỗi thành số

Khi làm việc với dữ liệu nhập từ người dùng, số thường được nhập dưới dạng chuỗi. Để thực hiện các phép tính toán, ta cần chuyển đổi chuỗi thành số.

Cách 1: Dùng Number()

Hàm Number(value) chuyển đổi chuỗi thành số (nếu có thể).

let str = "123.45";
let num = Number(str);

console.log(num); // Output: 123.45
console.log(typeof num); // Output: "number"

Lưu ý: Nếu chuỗi chứa ký tự không hợp lệ, kết quả trả về sẽ là NaN (Not-a-Number).

let invalidNum = Number("123abc");
console.log(invalidNum); // Output: NaN

Cách 2: Dùng parseInt() – Chuyển Chuỗi Thành Số Nguyên

parseInt() chỉ lấy phần nguyên của số trong chuỗi.

let str = "123.45";
let intNum = parseInt(str);

console.log(intNum); // Output: 123
console.log(typeof intNum); // Output: "number"

Lưu ý:

  • parseInt() bỏ qua phần thập phân, chỉ lấy số nguyên.
  • Nếu chuỗi chứa ký tự chữ sau số, nó vẫn hoạt động (lấy số đầu tiên gặp phải).
console.log(parseInt("123abc")); // Output: 123
console.log(parseInt("abc123")); // Output: NaN

Cách 3: Dùng parseFloat() – Chuyển Chuỗi Thành Số Thực

parseFloat() hoạt động giống parseInt() nhưng giữ nguyên phần thập phân.

let str = "123.45";
let floatNum = parseFloat(str);

console.log(floatNum); // Output: 123.45
console.log(typeof floatNum); // Output: "number"

So sánh parseInt(), parseFloat()Number()

Phương thức Hoạt động Ví dụ Kết quả
Number("123.45") Chuyển đổi hoàn toàn "123.45" 123.45
parseInt("123.45") Lấy phần nguyên "123.45" 123
parseFloat("123.45") Giữ nguyên số thực "123.45" 123.45

Chuyển đổi chuỗi thành mảng

Một trong những thao tác quan trọng trong xử lý chuỗi là tách chuỗi thành mảng dựa vào dấu phân tách (delimiter).

Dùng split() để chuyển chuỗi thành mảng

Hàm split(separator) giúp tách chuỗi thành một mảng dựa trên ký tự phân tách.

let sentence = "JavaScript,HTML,CSS";
let words = sentence.split(",");

console.log(words); // Output: ["JavaScript", "HTML", "CSS"]
console.log(Array.isArray(words)); // Output: true
Tách chuỗi theo từng ký tự
let text = "Hello";
let chars = text.split("");

console.log(chars); // Output: ["H", "e", "l", "l", "o"]
Tách chuỗi theo khoảng trắng
let phrase = "Lập trình JavaScript rất thú vị";
let wordsArray = phrase.split(" ");

console.log(wordsArray);
// Output: ["Lập", "trình", "JavaScript", "rất", "thú", "vị"]

Giới hạn số phần tử khi tách

Hàm split(separator, limit) cho phép giới hạn số phần tử trong mảng kết quả.

let sentence = "JavaScript,HTML,CSS,React";
let limitedWords = sentence.split(",", 2);

console.log(limitedWords); // Output: ["JavaScript", "HTML"]

So sánh split()join()

Phương thức Chức năng Ví dụ Kết quả
split(",") Tách chuỗi thành mảng "A,B,C".split(",") ["A", "B", "C"]
join(",") Nối mảng thành chuỗi ["A", "B", "C"].join(",") "A,B,C"

Duyệt qua các ký tự trong Chuỗi trong JavaScript

Trong JavaScript, để duyệt qua từng ký tự trong chuỗi, chúng ta có thể sử dụng vòng lặp hoặc các phương thức truy xuất ký tự. Dưới đây là các cách phổ biến:

Dùng vòng lặp for

Vòng lặp for duyệt qua từng chỉ mục (index) của chuỗi và truy xuất từng ký tự.

let str = "JavaScript";

for (let i = 0; i < str.length; i++) {
    console.log(str[i]);
}

Ưu điểm: Kiểm soát được chỉ mục (i) của từng ký tự.

Nhược điểm: Cú pháp dài hơn so với for...of.

Dùng vòng lặp for...of

for...of giúp lặp qua từng ký tự trong chuỗi một cách đơn giản hơn.

let str = "JavaScript";

for (let char of str) {
    console.log(char);
}

Ưu điểm: Ngắn gọn, dễ đọc hơn for.

Nhược điểm: Không truy xuất được chỉ mục trực tiếp.

Dùng charAt() và charCodeAt()

Phương thức charAt(index) lấy ký tự tại vị trí index.
Phương thức charCodeAt(index) lấy mã Unicode của ký tự tại vị trí index.

let str = "Hello";

console.log(str.charAt(0)); // Output: "H"
console.log(str.charCodeAt(0)); // Output: 72 (Mã Unicode của 'H')

Các lỗi thường gặp khi làm việc với chuỗi trong JavaScript

Nhầm lẫn giữa slice(), substring()substr()

JavaScript có 3 phương thức để cắt chuỗi, nhưng cách hoạt động của chúng khác nhau.

Phương thức Cách hoạt động Ví dụ ("JavaScript".slice(1, 4)) Output
slice(start, end) Cắt từ start đến end (không bao gồm end). Chấp nhận số âm. "ava" "ava"
substring(start, end) Giống slice(), nhưng không hỗ trợ số âm. "ava" "ava"
substr(start, length) Cắt từ start với số ký tự length. Bị loại bỏ từ ES6. "ava" "ava"

Lỗi phổ biến:

let text = "JavaScript";
console.log(text.slice(1, 4)); // Output: "ava"
console.log(text.substring(1, 4)); // Output: "ava"
console.log(text.substr(1, 4)); // Output: "avaS" (lấy 4 ký tự từ vị trí 1)

Giải pháp: Nên dùng slice() vì nó linh hoạt hơn.

Quên rằng Chuỗi là Bất Biến (Immutable)

Chuỗi trong JavaScript không thể thay đổi trực tiếp.

Lỗi sai (thay đổi ký tự trực tiếp):

let str = "Hello";
str[0] = "Y";  
console.log(str); // Output: "Hello" (Không thay đổi)

Cách đúng: Dùng phép nối chuỗi để thay đổi giá trị:

str = "Y" + str.slice(1);
console.log(str); // Output: "Yello"

Sử dụng == thay vì === khi so sánh Chuỗi

Trong JavaScript, == có thể tự động chuyển đổi kiểu dữ liệu, gây ra lỗi không mong muốn.

Lỗi sai:

console.log("123" == 123); // Output: true (Do JavaScript chuyển đổi kiểu)

Cách đúng: Luôn dùng === để kiểm tra chính xác kiểu dữ liệu.

console.log("123" === 123); // Output: false

Quên kiểm tra null hoặc undefined khi xử lý chuỗi

Nếu một biến chưa được khởi tạo, việc gọi phương thức chuỗi trên biến đó sẽ gây lỗi.

Lỗi sai:

let name;
console.log(name.length); //  Lỗi: Cannot read properties of undefined

Cách đúng: Kiểm tra null hoặc undefined trước khi sử dụng.

if (name) {
    console.log(name.length);
}

Kết bài

Chuỗi (String) là một trong những kiểu dữ liệu quan trọng và được sử dụng rộng rãi trong JavaScript. Việc hiểu rõ cách khai báo, xử lý, và thao tác với chuỗi giúp lập trình viên dễ dàng thao tác dữ liệu văn bản, làm việc với đầu vào của người dùng, tạo URL động, và xử lý dữ liệu từ API.

Qua bài viết này, chúng ta đã tìm hiểu các phương thức xử lý chuỗi phổ biến như cắt chuỗi, tìm kiếm, thay thế, nối chuỗi, chuyển đổi kiểu dữ liệu, cũng như các lỗi thường gặp khi làm việc với chuỗi. Đồng thời, các ứng dụng thực tế của chuỗi trong JavaScript giúp bạn áp dụng hiệu quả vào các dự án của mình.

Bài viết liên quan

  • 2