Trong nguy có cơ

 [Trong nguy có cơ] Dù có dịch bệnh hay không thì nhu cầu cơ bản của con người vẫn không thay đổi. Vẫn phải ăn, uống, học hành, chữa bệnh, yêu đương. Có chăng là các nhu cầu cao cấp sẽ giảm đi do số đông phải dùng tiền cho các nhu cầu thiết yếu trước. Vậy sẽ có một sự điều chỉnh trong nhu cầu tiêu dùng của loài người. Con người sẽ sống tiết chế lại, tập trung vào các nhu cầu thiết yếu. Con người sẽ phải tự điều chỉnh lối sống: sống vừa đủ, kiếm tiền vừa đủ (chả có nhiều nữa đâu mà kiếm), để lại tài nguyên cho người đến sau. Quan sát các điều chỉnh trong lối sống để làm gì đó phục vụ cho các điều chỉnh của xã hội. Vậy chắc ổn.

Nguyễn Văn Nhảm.


[2/3/2021]

Nhập môn lập trình (1) - Chương trình, mã máy, hợp ngữ

 

Lời nói đầu

Sau khi học xong môn Nhập Môn Công Nghệ Thông Tin, bạn đã có cái nhìn tổng quan về thông tin, biểu diễn và xử lý thông tin; đã có những kiến thức căn bản để có thể sử dụng máy tính, Internet một cách an toàn, hiệu quả; đã có thể sử dụng các phần mềm, email trong việc học, làm báo cáo và trình bày.

Môn học Nhập Môn Công Nghệ Thông Tin cũng đã giúp bạn có cái nhìn tổng quan về một số chuyên ngành, nghề nghiệp và vị trí công việc liên quan đến Công Nghệ Thông Tin. Bạn chưa nhất thiết phải chọn chuyên ngành cho mình mà hãy tập trung học tốt các môn thuộc phần Kiến Thức Đại Cương và Kiến Thức Cơ Sở Ngành. Lâu lâu ngó lại các chuyên ngành để chiêm nghiệm xem mình hợp với chuyên ngành nào hơn, điểm mạnh của mình là gì, chuyên ngành nào đang cần nhiều người làm, từ đó sẽ tự định hướng cho mình. Nếu lỡ chọn chưa đúng thì cứ chọn lại không sao hết, học cái gì cũng có lợi.

Nhập Môn Lập Trình là môn học tiếp theo bạn cần học. Môn học này giúp bạn có những khái niệm, kiến thức cơ bản liên quan đến lập trình như: thuật toán, lưu đồ, mã giả, ngôn ngữ lập trình, chương trình, trình dịch; cung cấp cho bạn các kĩ năng lập trình căn bản để giải quyết các bài toán đơn giản; làm quen với các thuật ngữ tiếng Anh chuyên ngành.

Một điều quan trọng các bạn cần biết là nên tập trung học các khái niệm quan trọng, các kiến thức nền tảng. Việc lấy ngôn ngữ lập trình nào để minh họa không thực sự quan trọng. Vì trong thực tế có hàng vài chục ngôn ngữ lập trình đang tồn tại, có cái mới sinh ra, có cái mất đi, nhưng nguyên lý chung nhất trong lập trình thì rất ít thay đổi.

Mục tiêu môn học:

– Hiểu các khái niệm: thuật toán, lưu đồ, mã giả, ngôn ngữ lập trình, chương trình, trình dịch

– Biết, hiểu và sử dụng được các kiểu dữ liệu, các cấu trúc điều khiển trong một ngôn ngữ lập trình

– Biết, hiểu và sử dụng được kiểu lập trình cấu trúc; tạo các hàm, thủ tục con để giải quyết các bài toán đơn giản

– Cài đặt được các chương trình bằng một ngôn ngữ lập trình cụ thể

– Nắm được các thuật ngữ chuyên ngành bằng tiếng Anh

Bạn nào còn yếu tiếng Anh thì theo dõi các bài giảng của các thầy, và đọc các tài liệu tiếng Việt. Bạn nào khá tiếng Anh hoặc có quyết tâm cao thì nên đọc, hiểu và làm theo cuốn sách tiếng Anh, đây là mục tiêu cao nhất của môn học.

Trong tài liệu này sẽ cố gắng ghi càng nhiều càng tốt các thuật ngữ tiếng Anh đi kèm, nhằm giúp các bạn có vốn từ vựng ban đầu, trước khi có thể đọc được các tài liệu bằng tiếng Anh. Bạn nào cẩn thận nên ghi lại các thuật ngữ tiếng Anh cùng với nghĩa của nó ra một tập tin Excel để tra lại khi cần.

Chúc các bạn kiên trì.

1.Tổng quan về lập trình cho máy tính

1.1       Chương trình

Chương trình (program) là một dãy các chỉ thị (instruction) hay các lệnh (statement), gọi chung là các lệnh, dùng để điều khiển máy tính thực hiện một công việc cụ thể.

Ví dụ, chương trình trong Bảng 1 sẽ xuất câu “Chao bac Teo” ra màn hình máy tính:





Người tạo ra (hay viết ra) các chương trình được gọi là lập trình viên (programmer, coder).

Một chương trình có thể tồn tại ở nhiều dạng, như chương trình mã máy, chương trình hợp ngữ, hoặc chương trình ngôn ngữ cấp cao (hay bậc cao). Tương ứng, cũng có nhiều cách để tạo ra một chương trình máy tính, ví dụ tạo ra bằng mã máy, tạo ra bằng hợp ngữ và tạo ra bằng ngôn ngữ cấp cao. Phần tiếp theo sẽ tìm hiểu lần lượt về ba cách tạo ra một chương trình máy tính.

1.2       Mã máy

Mã máy (machine code) là các lệnh tồn tại ở dạng các bit 0, 1; CPU có thể hiểu và thực thi trực tiếp các lệnh này. Mỗi lệnh thực hiện một tác vụ cụ thể như nạp (load), nhảy (jump) tới một vùng nhớ, các thao tác số học trên một đơn vị dữ liệu.

Chương trình mã máy (machine code program) là chương trình tồn tại ở dạng mã máy hay ở dạng ngôn ngữ máy (machine language).

Chương trình mã máy có tính phụ thuộc vào phần cứng, nghĩa là mỗi họ máy tính sẽ có tập lệnh riêng. Như vậy, một chương trình mã máy của họ máy tính này sẽ không thực thi được trên họ máy tính khác.

Con người rất khó để đọc và hiểu được chương trình mã máy, do vậy, con người ít khi tạo ra hoặc làm việc trực tiếp với các chương trình dạng mã máy. Thường thì CPU sẽ đọc, hiểu và thực thi các lệnh trong chương trình mã máy.

Chương trình mã máy được lưu trên đĩa dưới dạng các tập tin thực thi (executable program file), ví dụ các tập tin có phần mở rộng (extension) là EXE hoặc DLL.

Ví dụ một phần chương trình mã máy (Hình 1.1):





Quá trình máy tính thực thi một chương trình mã máy (xem Hình 1.2):

– Bước 1: người dùng, hệ điều hành hoặc một chương trình khác sẽ kích hoạt để thực thi một chương trình mã máy. Ví dụ, người dùng nhấp đúp chuột vào biểu tượng của chương trình trên màn hình Desktop;

– Bước 2: hệ điều hành sẽ tìm và nạp các lệnh của chương trình đang được lưu trên đĩa vào bộ nhớ chính (RAM);

– Bước 3: bộ đếm chương trình của CPU (program counter) sẽ trỏ tới lệnh đầu tiên của chương trình, cũng được gọi là đầu vào của chương trình (program entry point). CPU sẽ thực thi từng lệnh của chương trình cho tới khi gặp lệnh kết thúc.



Chương trình mã máy khi nằm trên đĩa cứng hoặc RAM sẽ là các bit 0, 1 liên tiếp nhau. Tuy nhiên, chúng được chia thành các lệnh riêng biệt với kích thước cụ thể, ví dụ mỗi lệnh sẽ là 16 bit, 32 bit, hoặc 64 bit tùy theo họ máy.

Mỗi lệnh riêng biệt lại được chia theo một cấu trúc cụ thể, gồm nhiều trường, mỗi trường có số bit và chức năng riêng. Ví dụ, một lệnh theo kiến trúc MIPS32 sẽ có chiều dài 32 bit, gồm các trường (Hình 1.3):


Do tính phức tạp, khó hiểu của chương trình mã máy, cộng với tính phụ thuộc phần cứng, nên mọi người hầu như không xây dựng các ứng dụng trực tiếp bằng mã máy mà sẽ dùng một ngôn ngữ lập trình khác, sau đó dịch thành chương trình mã máy.

Phần tiếp theo sẽ tìm hiểu một kiểu ngôn ngữ lập trình khác, để xây dựng chương trình cho máy tính, đó là hợp ngữ.

1.3       Hợp ngữ

Hợp ngữ (assembly language) là ngôn ngữ lập trình cấp thấp (hay bậc thấp) (low-level programming language). Nó đơn giản hơn chương trình mã máy nhờ vào việc dùng các từ viết tắt thay cho mã lệnh, mỗi từ viết tắt tương đương với một mã lệnh, ví dụ mã lệnh 100000 trong chương trình mã máy sẽ được thay bằng từ ADD (nghĩa là cộng) trong hợp ngữ. Địa chỉ vùng nhớ trong chương trình mã máy được thay bằng tên mô tả trong hợp ngữ.

CPU của máy tính không thể thực thi trực tiếp được mã hợp ngữ, do vậy lập trình viên cần phải dịch (assembling) chương trình viết bằng hợp ngữ sang chương trình mã máy. Chương trình dịch này được gọi là trình hợp dịch (nghĩa là chương trình dịch hợp ngữ) (assembler).

Cũng như chương trình mã máy, chương trình hợp dịch cũng có tính phụ thuộc vào họ máy tính cụ thể, mỗi họ máy tính có trình hợp dịch riêng.

Mỗi lệnh trong chương trình hợp ngữ sẽ được dịch thành một lệnh tương ứng trong chương trình mã máy. Ví dụ:

Mã hợp ngữ

add $s0, $s1, $s2

Mã máy

0000001000110010100000000100000

Quá trình dịch và thực thi một chương trình hợp ngữ được minh họa trong Hình 1.4:


Hợp ngữ được sử dụng nhiều trong các lĩnh vực hẹp, cần lập trình giao tiếp trực tiếp với phần cứng, yêu cầu tốc độ xử lý cao, ví dụ như các trình điều khiển thiết bị, hệ thống nhúng cấp thấp và các ứng dụng thời gian thực.

Hai điều nên để ý khi lập trình bằng hợp ngữ là tính phụ thuộc vào phần cứng và rất khó để tạo ra các chương trình lớn, phức tạp, có tính tương thích cao.

Để tạo ra các chương trình ứng dụng có tính tương thích tốt; tiết kiệm thời gian và công sức thì nên lựa chọn các ngôn ngữ lập trình cấp cao.

1.4       Ngôn ngữ lập trình cấp cao

Ngôn ngữ lập trình cấp cao (high-level programming language) thường được gọi ngắn gọn là ngôn ngữ lập trình, là một ngôn ngữ hình thức, gồm tập hợp các lệnh, cú pháp và ngữ nghĩa được sử dụng để điều khiển máy tính, thực hiện một công việc cụ thể.

Chương trình viết bằng các ngôn ngữ lập trình cấp cao có tính tương thích tốt, có thể chạy trên nhiều họ máy.

Có nhiều ngôn ngữ lập trình cấp cao khác nhau, tùy theo ứng dụng bạn muốn xây dựng là gì, để lựa chọn ngôn ngữ cho phù hợp. Ví dụ, sẽ có các ngôn ngữ chuyên để tạo ra các ứng dụng desktop, ứng dụng web, ứng dụng di động, ứng dụng nhúng. Cũng có những ngôn ngữ đa năng, có thể dùng để tạo ra nhiều loại ứng dụng khác nhau.

Một số ngôn ngữ lập trình phổ biến: C, C++, Java, C#, PHP, Python, JavaScript, Ruby, Go.

– Để viết ra hệ điều hành, hệ quản trị cơ sở dữ liệu, các chương trình hệ thống có thể sử dụng ngôn ngữ C, C++

– Để làm web có thể sử dụng ngôn ngữ C#, PHP, Java, JavaScript, Ruby, Python

– Để phát triển các ứng dụng quản lý cho các hệ thống lớn có thể sử dụng ngôn ngữ C++, C#, Java

Vì CPU của máy tính không thể trực tiếp thực thi được các lệnh của ngôn ngữ lập trình cấp cao, nên lập trình viên phải sử dụng một chương trình khác để dịch từ ngôn ngữ cấp cao sang dạng mã máy. Phần tiếp theo sẽ tìm hiểu về loại chương trình này.

-----//1

--------

Cập nhật: 28/1/2021

Bài tiếp theo:




Nụ cười stan shih

 Nụ cười Stan Shih

Học công nghệ thông tin không chỉ là học lập trình, học làm ra phần mềm, học về quản trị mạng, mà còn nhiều thứ khác rất hấp dẫn và nhiều thách thức. Các bạn đang là sinh viên Công nghệ Thông tin mà lại không đam mê lập trình, không thích mạng, cũng không sao. Còn rất nhiều lựa chọn khác. Dưới đây là một ví dụ:

(Rút ra vài ý từ bài viết của tác giả Lương Hà Paris: https://www.luonghaparis.com/2017/08/04/khai-phong-tiem-luc-doanh-nghiep-bang-goc-nhin-moi-ve-nguon-goc-gia-tri/)

1         Nụ cười stan shih

Bản chất của mọi giao dịch trao đổi trên thị trường hiện nay không còn là trao đổi của hàng hóa hữu hình mà là trao đổi service[1].

Service là quá trình nguồn lực mềm (operant resources: kỹ năng, kiến thức, công nghệ) “nhào nặn” nguồn lực cứng (operand resources: đất đai, tài chính, nguồn khoáng sản) để tạo ra giá trị mới.

Nền tảng lý luận quan trọng của marketing hiện đại:

1.      Kỹ năng và kiến thức là đơn vị trao đổi cơ bản

2.      Hàng hóa là vật trung gian để cung cấp service

3.      Kiến thức là nền tảng cơ bản của lợi thế cạnh tranh

4.      Tất cả các nền kinh tế đều là nền kinh tế service

5.      Khách hàng luôn là người đồng sản xuất

6.      Doanh nghiệp không trực tiếp tạo ra giá trị mà chỉ có thể đưa ra các tuyên ngôn giá trị

7.      Lấy service làm trung tâm, hướng vào khách hàng và các mối quan hệ

Từ hoạt động thực tiễn, chủ tịch tập đoàn Acer, ông Stan Shih đã đưa ra đường cong nụ cười, qua đó ông cho rằng: trong chuỗi giá trị, giá trị gia tăng do sản xuất tạo ra luôn nằm ở đáy của đường cong. Phần giá trị còn lại thuộc về những phần việc đòi hỏi nhiều kỹ năng và chất xám như: ý tưởng, xây dựng thương hiệu, thiết kế, phân phối, marketing, bán hàng/dịch vụ hậu mãi.

Xem hình minh họa,



2         Đổi mới sáng tạo là động lực phát triển

Có mười loại hình đổi mới sáng tạo, trong đó hai loại hình liên quan đến cải tiến sản phẩm, bốn loại hình liên quan đến quản trị, và bốn loại hình liên quan đến trải nghiệm khách hàng.

Ngoài việc cải tiến sản phẩm thì nên tập trung nhiều vào các mảng dịch vụ. Thậm chí phát triển dịch vụ cho các sản phẩm có sẵn.

Tập trung vào các mảng cần nhiều nhân lực có trí tuệ, kỹ năng như công nghệ thông tin, giáo dục, công nghiệp sáng tạo.

Xem hình minh họa:



3         Nụ cười “Chu Hảo”[2]

Trong một bài viết của tác giả Huỳnh Thế Du có nhắc đến nụ cười “Chu Hảo”. Ông Chu Hảo là cựu thứ trưởng bộ Khoa học và Công nghệ Việt Nam đã lật ngược nụ cười Stan Shih khi nói về mức độ sử dụng lao động giản đơn. Ý nói rằng gia công/lắp ráp cần nhiều nhân lực hơn các khâu khác của vòng đời một sản phẩm, và phần việc này nên dành cho các lao động có ít kỹ năng, các lao động đang dư thừa tại các khu vực nông thôn.

Các sinh viên nên học để làm ở các khâu có yêu cầu cao về kỹ năng và tri thức, như xây dựng thương hiệu, thiết kế, phân phối, marketing, bán hàng/dịch vụ hậu mãi.

Xem hình minh họa về nụ cười “Chu Hảo”:





[1] https://www.luonghaparis.com/2017/08/04/khai-phong-tiem-luc-doanh-nghiep-bang-goc-nhin-moi-ve-nguon-goc-gia-tri/

[2] https://tranbathoaimdphd.files.wordpress.com/2018/11/chu-he1baa3o2.jpg

----

Cập nhật: 9/1/2021


React (3) - Đối tượng và mảng

 Bài trước: React (2) - Biến, hàm, biên dịch JS

-----

2.4       Đối tượng và mảng

2.4.1       Destructuring assigment

Trong tiếng Anh từ structure có nghĩa là cấu trúc.

Tiền tố “de” trong tiếng Anh có nghĩa là opposite, remove hoặc reduce.

Vậy destructure hay destructuring có nghĩa là phá vỡ cấu trúc.

Trong JavaScript, mảng (array) và đối tượng (object) là kiểu dữ liệu có cấu trúc, vậy destructuring một mảng hay đối tượng nghĩa là phá vỡ cấu trúc của mảng hoặc đối tượng ban đầu.

Việc phá vỡ cấu trúc được thực hiện bằng phép gán nên có thuật ngữ gọi là destructuring assigment.

Destructuring assigment là cú pháp viết dưới dạng một phép gán, cho phép gán giá trị của một mảng hoặc thuộc tính của một đối tượng vào trong các biến.

Xem một vài ví dụ về destructuring assigment:

Gán 2 giá trị của mảng vào hai biến,

let a, b, rest;

    [a, b= [10, 20];

    console.log(a); // xuat ra gia tri 10

    console.log(b); // xuat ra gia tri 20

Gán các giá trị của một mảng vào 3 biến,

 [a, b, ...rest= [10, 20, 30, 40, 50];

    console.log(a); // xuat ra gia tri 10

    console.log(b); // xuat ra gia tri 20

    console.log(rest); // xuat ra [30, 40, 50]

Gán giá trị thuộc tính của một đối tượng vào 2 biến,

    let a, b, rest;

    ({ a, b } = { a: 10, b: 20 });

    console.log(a); // xuat ra gia tri 10

    console.log(b); // xuat ra gia tri 20

 Gán giá trị thuộc tính của một đối tượng vào 3 biến,

    let a, b, rest;

    ({ a, b, ...rest } = { a: 10, b: 20, c: 30, d: 40, c: 50 });

    console.log(a); // xuat ra gia tri 10

    console.log(b); // xuat ra gia tri 20

    console.log(rest); // xuat ra gia tri { c: 30, d: 40, c: 50}

2.4.2       Destructuring trên đối tượng

Bạn có thể sử dụng destructuring assigment để lấy giá trị và xử lý các thuộc tính trong một đối tượng theo kiểu cục bộ. Ví dụ hãy xem xét đối tượng sinhVien, đối tượng này có bốn thuộc tính, nhưng giả sử chúng ta chỉ cần sử dụng tới hai thuộc tính thôi. Khi đó, bạn có thể tạo ra hai biến mới, có tên trùng với tên của thuộc tính và có giá trị là giá trị của hai thuộc tính tenMSSV.

const sinhVien = {

     ten: "Van Teo",

     MSSV: "01234",

     lop: "CNTT",

     monHoc: ["Toan", 'Lap trinh', "Tieng Anh"]

};

const { ten, MSSV } = sinhVien;

console.log(ten, MSSV); // Van Teo 01234

Có thể khai báo các biến tenMSSV bằng từ khóa let, để sau đó bạn có thể thay đổi giá trị của chúng mà không làm thay đổi giá trị của đối tượng sinhVien ban đầu.

const sinhVien = {

     ten: "Van Teo",

     MSSV: "01234",

     lop: "CNTT",

     monHoc: ["Toan", 'Lap trinh', "Tieng Anh"]

};

let { ten, MSSV } = sinhVien;

ten = "Van Ti";

MSSV = "43210"

console.log(ten); // Van Ti

console.log(MSSV); // 43210

console.log(sinhVien.ten, sinhVien.MSSV); // Van Teo 01234

2.4.3       Destructuring trên đối số của hàm

Đoạn mã thông thường để xuất tên của một sinh viên,

// dinh nghia mot arrow function voi parameter la SV

const xuatTen = SV => {

     console.log(`Ten cua sinh vien la: ${ SV.ten }`);

};

const sinhVien = {

     ho: 'Nguyen Van',

     ten: 'Teo'

};

xuatTen(sinhVien);

Trong phần khai báo tham số của hàm, thay vì dùng cú pháp truy cập tới đối tượng thông thường (ví dụ SV.ten), bạn có thể sử dụng cú pháp destructuring để lấy ra giá trị cụ thể của đối tượng.

// dinh nghia mot arrow function voi parameter la { ten }

const xuatTen = ({ ten }) => {

     console.log(`Ten cua sinh vien la: ${ ten }`);

};

const sinhVien = {

     ho: 'Nguyen Van',

     ten: 'Teo'

};

xuatTen(sinhVien);

Destructuring cho trường hợp đối tượng lồng trong đối tượng.

// dinh nghia mot arrow function voi parameter la { GVCN: { ten } }

const xuatTen = ({ GVCN: { ten } }) => {

     console.log(`Ten cua giao vien chu nhiem la: ${ ten }`);

};

const sinhVien = {

     ho: 'Nguyen Van',

     ten: 'Teo',

     GVCN: { ho: 'Tran Van', ten: "Ti" }

};

xuatTen(sinhVien);

2.4.4       Destructuring trên mảng

Ví dụ, bạn muốn lấy giá trị đầu tiên của mảng gán vào một biến.

const[firstAnimal] = ['Cat', 'Fish', 'Dog'];

console.log(firstAnimal); // Cat

Bạn cũng có thể sử dụng “mẫu khớp” (list matching) để bỏ qua các giá trị không cần thiết. Trong “mẫu khớp”, giá trị không lấy (bỏ qua) được đại diện bằng dấu phẩy (,).

 const[, , lastAnimal] = ['Cat', 'Fish', 'Dog'];

console.log(lastAnimal); // Dog

2.4.5       Object literal nâng cao

Object literal là đối tượng được tạo bằng cặp dấu ngoặc nhọn {}.

Object literal nâng cao (object literal enhancement) là cú pháp viết dưới dạng một object literal, được sử dụng để nhóm các biến toàn cục thành một đối tượng. Có thể thấy object literal nâng cao có chức năng ngược lại so với destructuring.

Ví dụ,

const tenSP = 'sach';

const maSP = '1234';

 

const sp = { tenSP, maSP };

console.log(sp); // {tenSP: "sach", maSP: "1234"}

Object literal nâng cao có thể gom cả phương thức và biến, để tạo ra đối tượng, ví dụ:

const tenSP = 'sach';

const maSP = '1234';

const print = function() {

     console.log(`Ten san pham la ${ this.tenSP }, co ma san pham la ${ this.maSP }`);

}

const sp = { tenSP, maSP, print };

sp.print(); // Ten san pham la sach, co ma so la 1234

Nhờ có object literal nâng cao, bạn có thể khai báo phương thức của một đối tượng mà không cần tới từ khóa function. Ví dụ,

Theo cách cũ, cần có từ khóa function,

var sanPham = {

     tenSP: 'sach',

     maSP: '1234',

     print: function() {

     console.log(`Ten san pham la ${ this.tenSP }, co ma san pham la ${ this.maSP }`);

     }

};

 

sanPham.print();

Theo cách mới, phương thức của đối tượng không cần từ khóa function, đối với thuộc tính thì chỉ cần lấy tên của biến toàn cục vào làm thuộc tính của đối tượng, giá trị của thuộc tính sẽ được tham chiếu ngầm tới giá trị của biến toàn cục. Ví dụ,

     const tenSP = "sach";

     const maSP = "1234";

var sanPham = {

     tenSP,

     maSP,

     print() {

     console.log(`Ten san pham la ${ this.tenSP }, co ma san pham la ${ this.maSP }`);

     }

};

 

sanPham.print();

2.4.6       Toán tử spread

Toán tử spread tạm dịch là toán tử mở rộng (spread có nghĩa là mở rộng), kí hiệu bằng ba dấu chấm (…).

Toán tử spread được dùng để thực hiện một số tác vụ khác nhau, cụ thể:

Nối mảng

Từ hai mảng cho trước, cho thể sử dụng toán tử spread để nối hai mảng lại thành một mảng mới. Ví dụ:

const sinhVien1 = ['Teo', 'Ti', 'Mui'];

const sinhVien2 = ['Quyet', 'Tam', 'Hoc'];

const sinhVien = [...sinhVien1, ...sinhVien2];

console.log(sinhVien);

Lấy phần tử cuối của mảng

Để lấy phần tử cuối của mảng, có thể dựa vào thuộc tính length để lấy phần tử cuối, hoặc sử dụng hàm đảo ngược chuỗi (reverse) kết hợp với destructuring như sau:

const sinhVien1 = ['Teo', 'Ti', 'Mui'];

const [last] = sinhVien1.reverse();

console.log(last); // Mui

// tuy nhien, mang sinhVien1 da bi thay doi, day la ket qua khong mong muon

console.log(sinhVien1); // Mui Ti Teo

Tuy nhiên, cách làm ở đoạn mã trên đã làm thay đổi thứ tự các phần tử trên mảng gốc, đây là kết quả không mong muốn, vì nó sẽ ảnh hưởng đến các xử lý khác.

Để khắc phục chuyện này, có thể sử dụng toán tử spread, nó sẽ nhân bản mảng gốc thành một mảng tạm và thực hiện đảo ngược mảng tạm, như vậy sẽ không làm ảnh hưởng đến mảng gốc, xem ví dụ,

const sinhVien1 = ['Teo', 'Ti', 'Mui'];

const [last] = [...sinhVien1].reverse();

console.log(last); // Mui

// mang sinhVien1 khong bi thay doi

console.log(sinhVien1); // Teo Ti Mui

Lấy các phần tử còn lại của mảng

Từ một mảng cho trước, có thể sử dụng toán tử spread để lấy các phần tử còn lại của một mảng, xem ví dụ,

const sinhVien1 = ['Teo', 'Ti', 'Mui', 'Dan', 'Ngo'];

const [first, second, ...others] = sinhVien1;

console.log(others); // Mui Dan Ngo

Ở đoạn mã trên, biến first sẽ chứa giá trị đầu tiên của mảng, biến second chứa giá trị thứ hai, tất cả các giá trị còn lại của mảng sẽ chứa trong biến others.

Tạo mảng để chứa các tham số của hàm

Có thể sử dụng toán tử spread để định nghĩa một hàm với số tham số không xác định trước. Xem ví dụ sau, hàm directions (chỉ đường) sẽ nhận n đối số thông qua tham số args và thực hiện một số thao tác trên các tham số truyền vào,

function directions(...args) { // chi duong

     let [start,...remaining] = args;

     let [finish, ...stops] = remaining.reverse();

 

     console.log(`Hanh trinh gom ${ args.length } tinh`);

     console.log(`Bat dau xuat phat tai ${ start }`);

     console.log(`Dich den la tinh ${ finish }`);

     console.log(`Dung lai nghi tai ${ stops.length } tinh`);

}

 

directions('Lam dong', 'Khanh hoa', 'Phu yen', 'Binh dinh', 'Quang ngai', 'Quang nam', 'Da nang');

Với cách viết ở đoạn mã trên, có thể truyền vào số tham số tùy ý, đoạn mã vẫn chạy đúng.

Toán tử spread và đối tượng

Các thao tác của toán tử spread áp dụng được trên mảng thì cũng áp dụng được trên đối tượng. Ví dụ sau sẽ kết hợp hai đối tượng có sẵn thành một đối tượng mới,

const thongTinSV = {

     ten: 'Van Teo',

     MSSV: '1234'

};

const lienHeSV = {

     diaChi: '123, BTX, Dalat',

     dienThoai: '0123456789'

};

const sinhVien = {

     ...thongTinSV,

     ...lienHeSV

};

console.log(sinhVien);

// {

//    MSSV: "1234"

//    diaChi: "123, BTX, Dalat"

//    dienThoai: "0123456789"

//    ten: "Van Teo"

// }

-----

[Cập nhật: 21/11/2020]