So sánh tiền tố trong html jva năm 2024

Bài viết này là một phần của series JavaScript dành cho người không mới, giúp các bạn đã có kinh nghiệm code trong các ngôn ngữ khác nhanh chóng làm quen với JS.

Nếu được rất mong nhận được sự ủng hộ và đóng góp ý kiến của mọi người để hoàn thiện series.

A. Data types

Trong JS có 6 kiểu dữ liệu cơ bản:

  • Number
  • Boolean
  • String
  • Null
  • Undefined
  • Object

So sánh tiền tố trong html jva năm 2024

Mặc dù JS là ngôn ngữ weak type, không có nghĩa là nó không có khái niệm kiểu dữ liệu. JS chỉ không phải chỉ định rõ ràng kiểu và có khả năng ép kiểu linh hoạt, nên nó được gọi là weak typing (kiểu yếu).

Primitive types

Trong 6 kiểu trên, 5 kiểu đầu còn được gọi là primitive types (kiểu nguyên thủy), và kiểu object là non-primitive. Kiểu nguyên thủy chỉ thuần chứa dữ liệu, ví dụ.

let x = 10;
let s = "Hello";
let z = true;

Và các kiểu primitive cũng có thể có method và property như object, nhưng thực sự không phải. Đó là trick của JS, khi chúng ta dùng tới bất kì property hoặc method nào, JS sẽ biến đối tượng primitive thành một wrapper. Wrapper là kiểu primitive, được gói thành một object và sử dụng như object, do đó nó có thuộc tính và phương thức.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

Tuy nhiên, không nên sử dụng dạng như trên. Nó vừa gây rối code, vừa dài dòng không cần thiết, lại vừa sinh ra một số vấn đề khác. Ví dụ như phép so sánh hai kiểu wrapper sẽ luôn trả về false, vì JS không so sánh value chứa bên trong. Nếu bạn không hiểu rõ, bạn sẽ gặp lỗi. Do đó, primitive thì cứ dùng như bình thường thôi.

Và đối với wrapper, có thể dùng method

let x = 100 / "Apple";
isNaN(x);  // true

0 để lấy ra nội dung primitive được gói bên trong.

Object types

Kiểu dữ liệu còn lại là object, có thể chứa thuộc tính (property) và phương thức (method). Object phải được khởi tạo bằng từ khóa new và Object constructor.

let obj = new Object();
...

Các phiên bản JS mới hơn cho phép sử dụng cú pháp dấu ngoặc {} để tạo object gọn gàng hơn.

let obj = {
    ...
}

Từ kiểu object, có thể phát sinh thêm nhiều kiểu object khác, như mảng (array) cũng là object, function cũng là object (mặc dù tên kiểu là function), Date cũng là object,...

B. Number

1. Overview

Number trong JavaScript dùng cho cả số nguyên (integer) và số thực (float), và luôn là số có dấu (signed). Kiểu dữ liệu được xác định trên giá trị gán cho nó (value) chứ không cần chỉ định rõ ràng.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

Vì không phân biệt số nguyên và số thực, nên có thể viết số nguyên dạng có chấm hoặc không chấm như nhau.

Số thực có thể viết dạng thập phân hoặc khoa học, số dạng

let x = 100 / "Apple";
isNaN(x);  // true

1 được viết gọn lại thành

let x = 100 / "Apple";
isNaN(x);  // true

2.

let x = 0xff;
let y = 017;

Có thể viết số dạng hexa (hệ 16) với tiền tố

let x = 100 / "Apple";
isNaN(x);  // true

3 ở đầu, hoặc một số phiên bản JS cho phép số hệ octal (hệ 8) bằng cách viết chữ số đầu tiên là 0. Do đó, không nên viết số với chữ số 0 ở đầu, trừ khi bạn hiểu rõ bạn đang làm gì.

2. Operators

Các toán tử trong JS tương tự trong các ngôn ngữ khác. Từ ES6 trở đi có thêm toán tử ** để tính lũy thừa.

Phép cộng trong JS có điểm đặc biệt, là khi cộng một number với một string sẽ cho kết quả là string (phép nối chuỗi).

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

Đối với phép tính khác như nhân chia,... giữa hai string có nội dung số, JS sẽ cố gắng chuyển đổi thành số và thực hiện tính. Ví dụ.

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

3. Special values

Hai value number đặc biệt trong JS là NaN (not a number) và Infinity. Hai giá trị đặc biệt này thuộc kiểu number, khi dùng typeof cho ra kết quả number.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

NaN value

Giá trị NaN được trả về khi thực hiện phép tính không hợp lệ, chẳng hạn chia một chuỗi cho một số (chuỗi không có nội dung là số). Khi đó kết quả phép tính là NaN.

let x = 100 / "Apple";
isNaN(x);  // true

Sử dụng hàm

let x = 100 / "Apple";
isNaN(x);  // true

4 để kiểm tra xem một số có mang giá trị NaN hay không.

Trong những biểu thức có chứa NaN, thì kết quả cuối cùng là NaN. Nếu kết quả dạng chuỗi, JS sẽ chuyển đổi NaN thành chuỗi "NaN" và ghép lại cho phù hợp.

Infinity value

Số vô cực dương (Infinity) và vô cực âm (-Infinity) được trả về khi kết quả biểu thức quá lớn so với giới hạn của JS. Infinity cũng được trả về nhờ phép chia một số cho 0, hoặc tính toán biểu thức có Infinity.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

0

Dùng hàm

let x = 100 / "Apple";
isNaN(x);  // true

5 để kiểm tra số có hữu hạn hay không, nếu là số vô hạn (Infinity và -Infinity) sẽ trả về false. NaN cũng trả về false.

4. Number methods

Mặc dù number là kiểu primitive (nguyên thủy), nhưng JS thực hiện một số trick để làm number hoạt động tương tự object, nghĩa là có các thuộc tính (property) và phương thức (method).

Các property và method bên dưới không nhất thiết phải gọi từ biến number, có thể gọi từ value, const hoặc biểu thức tính ra number. Ví dụ.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

1

5. Number properties

Các thuộc tính bên dưới chỉ được truy cập qua Number, không phải qua biến, hằng hoặc biểu thức như method bên trên. Nếu cố tình vi phạm, thì kết quả trả về là undefined.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

2

Bên dưới là danh sách các thuộc tính. Có lẽ không cần nói nhiều nữa, chỉ cần đọc qua tên thôi các bạn cũng có thể hiểu được rồi.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

3

C. Boolean

1. Overview

Boolean lưu trữ hai giá trị đúng (true) và sai (false). Biến kiểu boolean có thể được dùng thay cho điều kiện trong các câu lệnh khác.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

4

Các biểu thức so sánh (comparison) và logic đều trả về một giá trị boolean.

2. Truthy & falsy

Trong JS, mọi thứ đều có thể được xem như một kiểu boolean, và có hai giá trị là truthy và falsy:

  • Falsy: chứa giá trị rỗng, ví dụ như 0, false, "", null, undefined và NaN
  • Truthy: ngược lại các trường hợp trên, và thêm Infinity và -Infinity nữa.

Sử dụng toán tử

let x = 100 / "Apple";
isNaN(x);  // true

6 phía trước một đối tượng sẽ biến nó thành Boolean, như ví dụ sau đây.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

5

3. Properties & methods

Boolean không có nhiều property và method, chủ yếu là hai method

let x = 100 / "Apple";
isNaN(x);  // true

7 (chuyển thành string) và

let x = 100 / "Apple";
isNaN(x);  // true

0 (lấy giá trị primitive - trong trường hợp này không có nhiều ý nghĩa).

4. Boolean tricks

Một số trick liên quan tới boolean, giúp viết code nhanh hơn.

Shorthand evaluate

Thay vì viết.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

6

Thì có thể viết nhanh thành

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

7

Trick này được thực hiện nhờ JS tối ưu hóa phép so sánh AND. Nếu vế trái

let x = 100 / "Apple";
isNaN(x);  // true

9 là false, thì không thực hiện vế phải (tối ưu hơn), ngược lại

let x = 100 / "Apple";
isNaN(x);  // true

9 là true thì phải xét tiếp vế phải

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

01 nữa. Kết quả là

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

01 chỉ được thực thi khi

let x = 100 / "Apple";
isNaN(x);  // true

9 là true.

Default value

Đôi khi chúng ta muốn kiểm tra dữ liệu nhập vào, thường là kiểm tra dữ liệu có tồn tại hay không. Nếu có thì ok, nếu không có cần cho nó một giá trị mặc định (default value) thay thế. Do đó, chúng ta thường viết code như sau.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

8

Với boolean trong JS, có thể rút gọn code trên thành thế này.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

9

Giải thích là trong các phép so sánh logic, thì JS chuyển các phần thành boolean hết. Vế trái được kiểm tra có dữ liệu hay không, nghĩa là biến thành boolean. Nếu là true, thì không cần so sánh vế phải, toàn bộ phép OR trả về vế trái. Ngược lại nếu vế trái là false, nghĩa là không có dữ liệu, thì xét vế phải. Vế phải phép OR luôn là true (do là string có dữ liệu), nên lúc này giá trị trả về là vế phải.

Trong code nên, phép so sánh OR bắt JS lựa chọn: Nếu

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

04 có dữ liệu thì chọn nó, nếu không có dữ liệu thì chọn vế phải biểu thức là chuỗi

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

05.

Number tricks

Hai phép and và or cũng dùng đượ với các số, như sau.

let obj = new Object();
...

0

D. String

1. Overview

String (chuỗi) dùng lưu dữ liệu dạng text. Nội dung của string được bao lại trong cặp nháy kép hoặc nháy đơn tùy trường hợp. Nếu nội dung chứa nháy kép, thì dùng nháy đơn, và ngược lại. Một số trường hợp code JS trong HTML event, thì phải bắt buộc dùng nháy đơn do nháy kép bị HTML attribute lấy rồi.

let obj = new Object();
...

1

Khác với các ngôn ngữ khác, việc truy cập ngoài phạm vi mảng hoặc chuỗi không xảy ra lỗi. Khi đó giá trị bên ngoài phạm vi có value là undefined.

Chuỗi về cơ bản là một mảng các kí tự, có index đếm từ 0.

Escape character

String không thể trực tiếp chứa một số kí tự, do không gõ được trên bàn phím hoặc gây nhầm lẫn (như trường hợp trên). Do đó cần thoát nó bằng cách chèn dấu \ (backslash) trước kí tự đặc biệt trên. Ví dụ.

let obj = new Object();
...

2

Kí tự

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

06 trong chuỗi phải ghi thành

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

07 gọi là escape character (escape sequense)

Ngoài ra các kí tự khác như tab (

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

08), new line (

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

09),... cũng được viết như trên, tương tự các ngôn ngữ khác.

Line breaking

Khi viết code không nên dài quá 80 kí tự một dòng, khi đó nên ngắt xuống dòng mới ngay tại toán tử, không ngắt giữa string như sau là sai.

let obj = new Object();
...

3

Trong trường hợp nếu muốn ngắt ngay giữa string, nghĩa là chia chuỗi thành 2 dòng, thì phải viết như sau với dấu \ ở cuối dòng.

let obj = new Object();
...

4

ES6 có template string nhưng tạm thời không nói tới ở đây.

2. Properties & methods

Vì phần property của string chỉ có mỗi cái length, nên mình gộp chung vào đây luôn.

Length property

Thuộc tính length trả về độ dài chuỗi, chú ý length là thuộc tính nên không có ngoặc () tham số.

let obj = new Object();
...

5

Access character

Dùng hai method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

10 và

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

11 để lấy kí tự và mã tại một vị trí (index) nào đó.

let obj = new Object();
...

6

Chú ý chuỗi mã hóa UTF-16, nên có thể chứa tiếng Việt và có mã trong khoảng 0 - 65535.

ES5 giới thiệu cách dùng [] để truy xuất kí tự trong chuỗi, tương tự như mảng. Khi không tìm thấy kí tự, [] trả về undefined trong khi

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

10 trả về rỗng.

Ngoài ra không thể thay đổi nội dung của string, vì JS string là immutable (bất biến). Mọi thay đổi vào string phải tạo chuỗi mới, do đó các method tiếp theo sẽ trả về chuỗi mới thay vì thay đổi trực tiếp lên chuỗi cũ.

Nếu cố tình thay đổi chuỗi, thì không có lỗi nhưng không có gì xảy ra cả.

String concat

Có nhiều cách nối chuỗi, gồm dùng phép +, dùng method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

13 hoặc gom thành mảng rồi

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

14. Phần này chỉ nó về method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

13.

let obj = new Object();
...

7

Trim method

Dùng method này để loại bỏ các khoảng trắng (space) ở đầu và cuối chuỗi.

let obj = new Object();
...

8

Uppercase, lowercase

Dùng hai method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

16 và

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

17 để chuyển chuỗi thành hoa/thường toàn bộ.

let obj = new Object();
...

9

Find substring position

Để tìm vị trí chuỗi con (substring) trong chuỗi đã cho thì có 3 method như sau. Các method này trả về index (vị trí) tìm thấy, nếu không có trả về -1.

let obj = {
    ...
}

0

Đúng, đó là 3 method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

18,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

19 và

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

20. Khác biệt như sau:

  • let x = new Number(10); let s = new String("Hello"); let z = new Boolean(true);

    18,

    let x = new Number(10); let s = new String("Hello"); let z = new Boolean(true);

    19 tìm chính xác chuỗi đã cho.

    let x = new Number(10); let s = new String("Hello"); let z = new Boolean(true);

    18 tìm từ trái sang phải, trong khi

    let x = new Number(10); let s = new String("Hello"); let z = new Boolean(true);

    19 tìm ngược lại.
  • let x = new Number(10); let s = new String("Hello"); let z = new Boolean(true);

    20 hỗ trợ tìm chuỗi chính xác và cả regex, như ví dụ trên chuỗi

    let x = new Number(10); let s = new String("Hello"); let z = new Boolean(true);

    26 là một regex trong JS.

Ngoài ra

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

20 không có param (tham số) thứ 2 là vị trí bắt đầu tìm, trong khi hai method còn lại có. Vị trí này chỉ định tìm từ index trở đi, không phải tìm từ đầu, giúp tối ưu hơn trong một số bài toán.

Extract substring

Dùng 3 method sau để trích xuất (extract) một phần chuỗi và trả về chuỗi mới.

let obj = {
    ...
}

1

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

28 không cho phép chỉ số là số âm, trong khi hai method còn lại cho phép. Method này cắt chuỗi từ start index và kết thúc tại end index (kí tự end không được lấy).

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

29 bắt đầu tìm tại index và lấy ra chuỗi con có độ dài yêu cầu.

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

30 khá giống

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

28, nhưng chấp nhận chỉ số index âm (chỉ số âm sẽ đếm ngược từ cuối chuỗi lên đầu, -1, -2,....).

Replace method

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

32 dùng để thay thế một phần của chuỗi bằng một chuỗi mới.

let obj = {
    ...
}

2

Tham số 1 là chuỗi cũ, tham số 2 là chuỗi cần thay thế.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

32 chấp nhận tham số 1 là chuỗi regex.

Split method

Dùng tách chuỗi thành một mảng các chuỗi con, dựa trên chuỗi phân tách (separator).

let obj = {
    ...
}

3

Khi tách theo dấu phân cách như trên, sẽ gặp trường hợp nhiều dấu phân cách liền nhau. Khi đó split sẽ không hoạt động như mong đợi, ví dụ.

let obj = {
    ...
}

4

Để xử lý trường hợp nhiều dấu phân tách liền kề nhau, chúng ta sử dụng regex.

let obj = {
    ...
}

5

Chuỗi regex trên đại diện cho 1 hoặc nhiều kí tự space liền kề, do đó regex có thể làm dấu phân tách chuỗi, kết quả cho ra sẽ đúng với những gì bạn nghĩ.

ES6 new methods

ES6 bổ sung thêm một số method xử lý string mới.

let obj = {
    ...
}

6

Mặc dù các method này có thể được thay thế bằng cách so sánh

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

18, nhưng dùng những method mới sẽ rõ ràng hơn.

E. Array 1

1. Overview

Array (mảng) cho phép lưu trữ nhiều giá trị trong một biến duy nhất (biến mảng). Các phần tử (element) trong array được truy cập theo chỉ số (index) tính từ 0.

Khác với nhiều ngôn ngữ khác, array trong JS cho phép chứa nhiều kiểu dữ liệu khác nhau. Và array không bị giới hạn số phần tử như một số ngôn ngữ strong type.

Array declaration

let obj = {
    ...
}

7

Khai báo mảng gồm tên mảng và danh sách các value trong cặp [], cách nhau bởi dấu phẩy.

Access array element

Sử dụng chỉ số (index) để truy cập phần tử. Chỉ số được tính từ 0.

let obj = {
    ...
}

8

Nếu vượt quá phạm vi mảng, thì không có lỗi mà giá trị nhận được là undefined.

2. Array and object?

Array is an object

Array thực sự là một object, nếu dùng typeof cho một mảng thì kết quả trả về là object.

Mảng trong JS dùng index truy cập các phần tử, đây là cách tốt nhất. Tuy nhiên tương tự các object khác, những phần tử có thể được truy cập thông qua tên thuộc tính.

Creating array as an object

Array thay vì được khai báo bằng cách gán giá trị thông thường, còn có thể được khai báo bởi từ khóa new và Array constructor.

let obj = {
    ...
}

9

Array constructor nhận vào danh sách các đối số làm giá trị khởi tạo cho mảng. Tuy nhiên, không nên dùng cách này vì rối rắm và gây lỗi. Ví dụ.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

0

Nghĩa là gì, tạo mảng a có một giá trị 10, hay mảng a có 10 giá trị ban đầu??? Do đó, nên khai báo array với [] như bình thường thôi.

Associative array

Như đã nói, thì array trong JS thực sự là một object, nó sẽ có tên thuộc tính và value của thuộc tính đó. Thay vì truy cập value qua index, thì dạng object sẽ sử dụng tên thuộc tính để truy cập.

Do đó, array dạng này gọi là associative array, có index được đặt tên (named index).

Khi khai báo với [] thì chỉ tạo value và index. Để thực sự có tên thuộc tính, cần phải gán thêm giá trị cho mảng.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

1

Lúc này, chúng ta có thể gọi

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

35 thay vì

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

36 để truy cập value. Index là số, trong trường hợp này đã được đặt tên là "John".

Chú ý, lúc này một số method, property sẽ cho giá trị không đúng. Và nên hạn chế dùng array dạng này, nếu muốn có tên thuộc tính thì dùng object thay thế.

Compare array

Vì array là object, nên việc so sánh hai array thực chất là so sánh hai object. Mà so sánh hai object dù bằng cách nào đi nữa, bằng toán tử

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

37 hay

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

38 hoặc cả

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

39 thì đều là so sánh địa chỉ của chúng.

Hai object khác nhau sẽ có địa chỉ khác nhau, array cũng thế, nên các phép so sánh trên luôn trả về false.

Để so sánh nội dung hai array có giống nhau hay không, phải sử dụng các phép lặp kiểm tra từng phần tử và kèm thêm so sánh độ dài.

3. Properties & methods 1

Length property

Trả về độ dài mảng. Chú ý

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

40 là thuộc tính, không phải method, nên viết như sau là sai.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

2

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

40 có một số hành vi kì lạ, cụ thể giá trị của length là giá trị index cao nhất có value + 1. Ví dụ mảng

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

42 có chỉ số cao nhất là 3, nên

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

40 được tính là 3 + 1 = 4.

Điều này dẫn tới một vấn đề sau đây.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

3

Bạn nghĩ

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

44 sẽ có giá trị bao nhiêu? Nếu là 5 thì bạn sai rồi đó, bây giờ length là 7 (index cao nhất 6 + 1 = 7). Rõ ràng nó không đúng với logic suy nghĩ của mình, khi mảng chỉ có 5 phần tử mà length lại là 7.

Thực ra, cấu trúc mảng a bây giờ như sau.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

4

Xuất hiện những khoảng empty (chưa có value) bên trong mảng, và nó làm thuộc tính

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

40 bị tính sai.

Do đó, thay vì gán trực tiếp như trên, nên sử dụng các method được trình bày tiếp theo đây để thêm phần tử vào mảng một cách an toàn.

Unshift & push method

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

5

Hai method này thêm element vào mảng và trả về độ dài mảng mới.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

46 thêm vào cuối còn

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

47 thêm vào đầu mảng (các phần tử khác bị đẩy về sau).

Shift & pop method

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

6

Hai method này xóa element ra khỏi mảng, và return giá trị vừa xóa.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

48 xóa ở cuối còn

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

49 xóa ở đầu (các phần tử khác bị dời về trước 1 đơn vị).

Delete element

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

7

Xóa element của array nhưng không dời chỗ các element khác. Xem lại ví dụ vấn đề của length, thì có thể dùng lệnh này để xóa đi một phần tử, xem như nó chưa từng có value.

Xóa toàn bộ mảng

Có hai cách, gán cho nó mảng rỗng [] hoặc đặt

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

40 thành 0.

F. Array 2

1. Methods 2

Array concat

Dùng method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

13 để gộp hai mảng thành 1, method trả về một mảng mới.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

8

Ngoài ra còn cách khác là dùng spread operator (ES6) để nối nhanh hơn, nhưng không bàn tới ở đây.

Splice method

Method này vừa xóa các phần tử đã có, vừa thêm các phần tử mới vào.

let a = 5, b = 2.5;  // Khai báo nhiều biến trên cùng dòng
let c = 12e-3;  // Số thực dạng khoa học
let d = .25;  // Rút gọn cho 0.25
let e =
    10;  // Viết trên nhiều dòng

9

Ngoài ra,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

52 còn có thể dùng chỉ để xóa hoặc chèn thêm.

Slice method

Giống với string, method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

30 dùng cắt một phần mảng và trả về mảng mới.

let x = 0xff;
let y = 017;

0

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

30 có thể có 1 hoặc 2 tham số, nếu tham số 2 không có thì nó sẽ cắt tới hết mảng. Nếu có đối số thứ 2 thì đó là vị trí dừng, phần tử ở vị trí end không được lấy.

Chú ý tên method là

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

30, khác với

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

52 ở trên.

Join & toString method

Hai method này dùng chuyển mảng thành một chuỗi duy nhất.

let x = 0xff;
let y = 017;

1

let x = 100 / "Apple";
isNaN(x);  // true

7 chuyển thành chuỗi, phân tách các phần tử bởi dấu phẩy và viết sát nhau. Phần tử cuối không có phẩy (no trailing comma).

Trong khi đó

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

14 thì nâng cao hơn một chút. Method này nhận vào một chuỗi làm dấu phân tách tùy chỉnh, ví dụ muốn đẹp hơn thì dùng

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

14.

let x = 0xff;
let y = 017;

2

Nếu

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

14 không có tham số thì giống như

let x = 100 / "Apple";
isNaN(x);  // true

7.

IndexOf, lastIndexOf method

Dùng tìm vị trí một value trong mảng, tương tự như của string. Kết quả trả về là -1 nếu không tìm thấy, là vị trí nếu tìm thấy element.

Hai method trên nhận vào một tham số thứ 2, là vị trí bắt đầu tìm.

Includes method

Method trả về boolean, cho biết một value có tồn tại trong mảng hay không.

let x = 0xff;
let y = 017;

3

Mặc dù có thể sử dụng phép so sánh

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

62 nhưng nên dùng

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

63 vì làm code rõ ràng hơn.

Fill method

Method dùng để điền (fill) một phần tử vào một đoạn liên tục của mảng. Method nhận vào ba đối số:

  • Đối 1 là value cần điền
  • Đối 2 là vị trí bắt đầu (vị trí này được điền)
  • Đối 3 là vị trí kết thúc (vị trí này không được điền)

Kết quả trả về là chính mảng đó.

let x = 0xff;
let y = 017;

4

Hai đối số sau có thể bỏ qua, nếu đối 3 bỏ qua thì điền từ vị trí bắt đầu cho tới hết, nếu hai đối sau bị bỏ qua thì điền toàn bộ mảng.

let x = 0xff;
let y = 017;

5

2. Array constructor methods

Những method với array bên trên như

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

13,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

14 đều dùng thông qua biến array. Bên cạnh đó JS còn hỗ trợ thêm một số method trong

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

66 constructor, có dạng

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

67 để xử lý một số thao tác trên mảng.

Array.isArray method

Dùng kiểm tra một đối tượng có phải array hay không.

let x = 0xff;
let y = 017;

6

Vì array là object, nên chúng ta có cách thứ 2 là dùng toán tử

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

68 như sau.

let x = 0xff;
let y = 017;

7

Ngoài ra còn có một cách là tìm chữ "Array" trong code constructor (thuộc tính constructor) của biến đó. Nhưng chúng ta không dùng cách này vì hơi nhảm và chậm.

Array.of method

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

69 nhận vào một số lượng đối số bất kì và trả về một mảng mới. Ví dụ hai lệnh sau là tương đương.

let x = 0xff;
let y = 017;

8

Array.from method

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

69 lấy các phần tử trong một thứ giống mảng và trả về một mảng mới. Nói nôm nay là method này biến một danh sách giống mảng thành một mảng. Ví dụ như bên dưới,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

71 trả về một HTMLcollection, và dùng

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

69 để tạo một mảng từ nó.

let x = 0xff;
let y = 017;

9

Cách thứ hai là nó cũng hoạt động như method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

73, dùng để map phần tử từ mảng sang mảng nhưng với giá trị được tính toán khác đi (ví dụ mỗi phần tử nhân đôi). Phần method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

73 phần sau sẽ được bàn tới.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

0

3. Sorting

String sort

Array có hai method để sắp xếp và đảo ngược mảng là

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

75 và

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

76.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

1

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

75 sắp xếp tăng dần, nếu muốn giảm dần thì dùng thêm

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

76 để đảo lại.

Nhưng có vấn đề,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

75 mặc định sẽ sắp xếp chuỗi (string sort), nên các số bị xếp sai (ví dụ 11 nhỏ hơn 2). Do đó, để sắp xếp các mảng số thì cần dùng numberic sort như bên dưới.

Numberic sort

Ở đây chúng ta cũng dùng method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

75 với 1 tham số là hàm callback tùy chỉnh cách so sánh, gọi là compare function. Function này nhận vào hai số, và kết quả trả về sẽ quyết định cách sort.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

2

Kết quả trên cho mảng sắp xếp tăng dần. Để xếp giảm dần, không cần dùng

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

76 trong trường hợp này, chỉ cần sửa

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

82 thành

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

83 trong code trên là được.

4. Find max, min

Tìm max, min trong mảng nhanh chóng thì dùng method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

84 và

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

85. Chú ý không gọi như cách bình thường được, vì các method trên không nhận mảng, do đó cần gọi với

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

86 như sau.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

3

Tham số null không cần quan tâm, vì chúng ta không truyền object gì vào cho

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

86 cả.


G. Array iteration methods

1. Overview

ES5 có thêm một số iteration methods, là những method dùng để lặp, duyệt qua tất cả phần tử của iterable object, hiểu đơn giản là những đối tượng có thể lặp qua (iterable). Trong phần này chỉ xét tới array.

Các iteration method đều yêu cầu truyền 1 param dạng callback function. Function này có dạng như sau.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

4

Qua mỗi lần duyệt một phần tử, thì thông tin sẽ được cập nhật và hàm callback trên được gọi một lần, với thông tin mới. Do đó, chúng ta đặt các xử lý bên trong chúng, và return về một giá trị phù hợp với chức năng từng method.

Nếu vẫn chưa hiểu, không sao cả, hãy đi vào ví dụ bên dưới.

Không nhất thiết các method này duyệt hết mảng, một số method chỉ duyệt đủ điều kiện là dừng ngay, như

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

88 hoặc

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

89.

2. Iteration methods

Array looping

Để lặp qua các phần tử của mảng thì chúng ta có thể dùng vòng lặp for như bình thường, lặp qua các index và truy cập phần tử qua index.

Hoặc ES5 có thêm vòng lặp for of như sau.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

5

Trong mỗi lần lặp như vậy e sẽ lần lượt mang từng giá trị của phần tử trong mảng. Nhược điểm cách này là không biết được index cua phần tử là bao nhiêu, muốn biết cần thêm vài dòng code rườm rà nữa.

Do đó, method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

90 ra đời như một cách thức nâng cao hơn để lặp mảng.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

6

Chú ý tới function ẩn danh (không có tên) có chứa 3 tham số

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

91. Các bạn sẽ gặp lại nó trong suốt phần này.

Hàm callback trên có 3 tham số, nhưng có thể bỏ đi hai tham số sau nếu không cần thiết, chỉ cần giữ lại value. Với method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

90 có tới 3 tham số như trên, chúng ta có thể vừa biết value, vừa biết được index đang ở vị trí nào, vừa có thể truy cập array. Quá tiện phải không, nhưng bù lại thì tốc độ sẽ chậm hơn.

Map method

Tạo mảng mới có độ dài giống mảng ban đầu, nhưng các phần tử có giá trị được tính toán, biến đổi mới lại theo một cách nào đó.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

7

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

73 tạo array mới, với từng phần tử trong array cũ sẽ được áp dụng một số phép biến đổi (trong code là nhân 2) để thành phần tử mới. Thao tác này gọi là map.

Chú ý return trong callback là return từng giá trị mới cho mảng mới được tổng hợp.

Filter method

Trả về mảng mới, gồm các phần tử nào trong mảng cũ khớp với điều kiện gì đó.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

8

Method

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

94 duyệt từng phần tử, với mỗi phần tử xét xem nó có được thêm vào mảng mới hay không.

Return của filter là return boolean, true thì phần tử được nhận, false thì phần tử bị bỏ qua.

Every, some method

Toàn bộ method trả về boolean,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

89 kiểm tra mảng có tất cả phần tử hợp điều kiện, trong khi

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

88 chỉ cần một phần tử khớp điều kiện cho là ok.

let x = 5;
let y = "Hi " + x;  // y = "Hi 5"

9

Cả hai method duyệt từng element,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

89 tất cả element phải return true thì every mới true, còn

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

88 chỉ cần một element true là true ngay.

Find, findIndex method

Dùng trả về vị trí một value trong mảng.

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

99 trả về value, trong khi

let obj = new Object();
...

00 trả về index của value tìm thấy (phần tử đầu tiên). Nếu không có,

let x = new Number(10);
let s = new String("Hello");
let z = new Boolean(true);

99 trả về undefined và

let obj = new Object();
...

00 trả về -1.

Lưu ý "find" ở đây không chỉ đơn thuần là tìm một giá trị trong mảng, mà chính xác hơn nó tìm phần tử đầu tiên khớp với một điều kiện nào đó.

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

0

Bên trong callback, chúng ta return một boolean mô tả điều kiện tìm thấy, ví dụ như bằng 5 (tìm số 5 trong mảng), nhỏ hơn 5 (tìm số đầu tiên nhỏ hơn 5),...)

Nếu đang tìm giữa chừng mà tìm thấy value khớp điều kiện, thì dừng lại luôn không xét nữa.

Reduce, reduceRight

Reduce là thao tác từ một array nhiều phần tử "giảm" (reduce) xuống còn một giá trị duy nhất. Thường dùng cho tính tổng tất cả phần tử trong mảng, ta gọi là "giảm dần mảng thành một tổng" thay vì "tính tổng của toàn bộ mảng".

let obj = new Object();
...

03 và

let obj = new Object();
...

04 hơi khác với các iteration method khác, là callback của nó có thêm một tham số

let obj = new Object();
...

05 đầu tiên.

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

1

Giá trị

let obj = new Object();
...

05 là giá trị được "gom" lại trước đó. Trong đoạn code trên thì giá trị trước đó được cộng thêm value vào, và return thành giá trị mới. Giá trị này trong vòng lặp tiếp theo sẽ trở thành

let obj = new Object();
...

05.

Tóm lại, sau khi lặp hết mọi phần tử,

let obj = new Object();
...

05 từ 0 được cộng dần lên, và cuối cùng thành tổng của mảng. Tổng này được trả về cho method

let obj = new Object();
...

03 hoặc

let obj = new Object();
...

04.

Hai method trên còn nhận vào param 2 phía sau hàm callback, là khởi tạo giá trị ban đầu cho

let obj = new Object();
...

05. Và đặc biệt, JS rất thông minh khi dùng phép cộng (tính tổng) thì mặc định giá trị ban đầu là 0, nhưng khi dùng phép nhân (tính tích) thì giá trị ban đầu lại là 1. Thông minh chưa

So sánh tiền tố trong html jva năm 2024
.
let obj = new Object();
...

04 tương tự

let obj = new Object();
...

03, nhưng được chạy từ cuối mảng lên đầu, vậy thôi.

3. Arrow function

Thường thì người ta sẽ dùng arrow function (ES6) trong trường hợp này để viết code ngắn hơn. Ví dụ thay vì.

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

2

thì sẽ viết với arrow function là

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

3

hoặc

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

4

Nếu bạn chưa biết arrow function thì đừng lo, các bài sau sẽ có nói tới. Trong các code phía trên mình viết function callback dạng thường cho dễ hiểu.

H. Date

1. Date object

Để thực hiện các thao tác với thời gian, chúng ta sử dụng đối tượng Date. Chú ý thời gian ở đây gồm ngày tháng (date) và thời gian (time).

Có 4 cách để tạo date object, bằng các tham số khác nhau được truyền cho Date constructor.

Current datetime

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

5

let obj = new Object();
...

14 constructor không có param sẽ lấy thời gain hiện tại lưu vào biến. Chú ý thời gian lưu vào là cố định, không tự động thay đổi trừ khi bạn cập nhật lại cho nó.

Custom datetime

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

6

Nhận 7 tham số lần lượt là năm (year), tháng (month), ngày (day), giờ (hour), phút (minute), giây (second) và mili giây (milisecond - msec).

Có hai chú ý sau:

  • Năm nếu có 1 hoặc 2 chữ số, thì hiểu là năm 19AB.
  • Tháng trong JS đếm từ 0, do đó số 7 sẽ là tháng 8.

Miliseconds

JS thực sự lưu trữ thời gian dưới dạng số nguyên cực lớn, là số mili giây trôi qua từ thời điểm gốc.

Thời điểm được chọn làm mốc của JS là 1/1/1970, 00:00:00.

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

7

Số miliseconds có thể là số âm, như vậy thì thời điểm sẽ được lùi về quá khứ.

String datetime

JS cũng cho phép nhận chuỗi ngày tháng và tự động phân tích ra thời gian phù hợp. Chuỗi datetime này phải tuân theo một số chuẩn nhất định để JS nhận diện chính xác, đọc thêm phần tiếp theo.

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

8

2. Date format

JS cho phép nhận diện chuỗi ngày tháng theo một quy tắc nhất định, gồm ngày chuẩn ISO, ngày dài (long date) hoặc ngày ngắn (short date) được chấp nhận.

ISO date

let s1 = "2000";
let s2 = "10";
let result = s1 / s2;  // result = 200

9

Bên trên là một số ví dụ chuỗi ISO date được chấp nhận.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

0

Thời gian trên có chữ "T" phân tách ngày tháng và thời gian. Chữ "Z" ở cuối cho biết đây là thời gian UTC, múi giờ GMT (0). Hoặc có thể bỏ Z đi và chỉ định độ lệch múi giờ như sau.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

1

Thay chữ "Z" bằng

let obj = new Object();
...

15 hoặc

let obj = new Object();
...

16 đều được.

Long date

Long date trong JS có dạng

let obj = new Object();
...

17, trong đó dùng dấu space để tách ra. Năm luôn ở cuối cùng và tháng và ngày có thể đổi chỗ cho nhau.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

2

Tháng có thể viết tắt hoặc đầy đủ đều được, và không phân biệt hoa thường.

Short date

Cú pháp chuỗi short date trong JS chấp nhận có dạng

let obj = new Object();
...

18.

3. Date get, set methods

Date object có một số method dạng

let obj = new Object();
...

19 và

let obj = new Object();
...

20, dùng để đọc (get) hoặc thay đổi (change) các thành phần của thời gian.

Get methods

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

3

Chú ý các method lấy thời gian cần có

let obj = new Object();
...

21.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

4

Ngoài ra còn có các method dạng

let obj = new Object();
...

22 tương tự để lấy thời gian tại mốc GMT.

Set methods

Tương tự như

let obj = new Object();
...

19, nhưng nhận vào các tham số là giá trị mới để gán, thay vì để trống. Ví dụ

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

5

4. Date actions

Display date

Method

let x = 100 / "Apple";
isNaN(x);  // true

7 chuyển date object thành một chuỗi mô tả thời gian, gồm thứ, tháng ngày, năm, giờ, phút, giây, (không có miligiây), múi giờ và tên múi giờ.

Bên cạnh đó ocnf có method

let obj = new Object();
...

25 để lấy chuỗi thời gian tại GMT.

Get miliseconds

Nếu chri muốn lấy số miligiây của một chuỗi ngày cụ thể mà không cần tạo date object, có thể dùng method

let obj = new Object();
...

26 để parse chuỗi và lấy ra số miliseconds.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

6

So sánh

Vì các date object lưu trữ số mili giây, nên có thể xác định thời điểm nào trướ thời điểm nào bằng cách so sánh.

Current time

Khi bạn muốn cập nhật lại thời gian hiện tại cho date object, sử dụng method

let obj = new Object();
...

27 và method

let obj = new Object();
...

28 của đối tượng cần update như sau.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

7

let obj = new Object();
...

27 trả về số mili giây hiện tại, do đó để gán giá trị miligiây cần dùng

let obj = new Object();
...

28.

Cộng trừ thêm ngày

Dùng kết hợp method

let obj = new Object();
...

31 và

let obj = new Object();
...

32 để cộng trừ một số ngày nhất định.

let x = NaN;
let y = Infinity;
typeof x;  // number
typeof(y);  // number

8

Tính số ngày giữa hai ngày

Thực sự không có hàm, method nào hỗ trợ việc này cả. Có một giải pháp là tìm hiệu số miligiây, rồi chia cho số miligiây của một ngày như sau.