Operator trong JavaScript

Operator trong JavaScript

Chúng ta đang từng bước nắm các kỹ thuật tính toán trên JavaScript, làm cách nào để có thể sử dụng các toán tử, và toán hạng trong JavaScript. Hôm nay hãy cùng chúng tôi tìm hiểu về operator trong JavaScript.

Các bài viết liên quan:

Thuật ngữ: “unary”, “binary”, “operand”

Trước khi bắt đầu vào bài học, chúng ta hãy cùng điểm danh qua các thuật ngữ cần thiết về toán học.

Operator hay có tên gọi khác là toán tử, là phép tính toán được sử dụng trong một biểu thức.

Operand hay có tên gọi khác là toán hạng. Trong máy tính, toán hạng là một phần của lệnh máy tính chỉ định dữ liệu sẽ được vận hành hoặc thao tác theo toán tử.

Một operator mà có một operand được gọi là unary.

Một operator mà có hai operand được gọi là binary.

Một Operand còn có một tên khác ít sử dụng hơn đó là “đối số”.

Ví dụ:

Biểu thức 6*7 : operator là “*”, có 2 operand là 6, 7, và đây được gọi là binary;

Biểu thức -(6) : operator là “-“, có 1 operand là 6, và đây được gợi là unary.

Một operator là một ngôi nếu nó sử dụng 1 operand. Ví dụ, toán tử một ngôi –, toán tử NOT trong boolean:

let x = 7;
x = -x;
alert (x); // -7, phép toán  một ngôi đã được áp dụng

Một operator được gọi là hai ngôi nếu nó có sử dụng 2 operand( đối số)

let x = 6, y = 7;
alert (y + x); // 2, toán tử 2 ngôi đã được sử dụng

Toán học trong JavaScript

Các operator sau được hỗ trợ trong JavaScript:

  • Phép cộng(add) +,
  • Phép trừ -,
  • Phép nhân *,
  • Phép chia /,
  • Phép chia lấy dư %,
  • Phép luỹ thừa **.

Toán tử modulo (%)

Toán tử chia lấy dư % không liên quan đến khái niệm phần trăm.

Kết quả của a % b là số nguyên dư của phép chia số của a và b.

Ví dụ:

alert (5% 3); // 2, phần dư của 5 chia cho 3</p>
alert (8% 5); // 3, phần dư của 8 chia cho 5</p>

Toán tử luỹ thừa **

Toán tử lũy thừa a ** b là phép tính lũy thừa trong toán học a**b = a*a*…*a( với số lần nhân bằng b)

Trong C phép tính này có dạng là a^b

Ví dụ:

alert (3 ** 4); // 3^4
alert (4 ** 5); // 4^5
alert (5 ** 6); // 5^6

Cũng giống toán học phổ thông, phép toán lũy thừa được sử dụng cho không phải là số nguyên.

Ví dụ, a** ½: (1/2 không phải là số nguyên

alert (7 ** (1/2)); // 2 (lũy thừa của 1/2 giống với căn bậc hai)
alert (6 ** (1/3)); // 2 (lũy thừa của 1/3 giống với căn bậc hai)

Nối chuỗi với operator + hai ngôi

Trong toán học phổ thông, ta thường biết dấu + thường là phép tính toán số học.

Ví dụ: 5+6 =11; 5+4 =9,…

Tuy nhiên trong JavaScript dấu + còn làm nhiều hơn như thế, operator + còn là phép tính 2 ngôi dùng để nốt chuỗi.

Nếu dấu + hai ngôi sử dụng cho các operand chuỗi, nó sẽ tiến hành thực hiện nối chuỗi:

let s = "hello" + "world";
alert(s); // helloworld

Lưu ý rằng trong JavaScript, nếu bất kỳ operand nào là một giá trị chuỗi, thì operand còn lại cũng được biến thành dạng chuỗi.

Ví dụ:

alert ('2' + 4); // "24"
alert (2 + '2'); // "22"

Hãy xem, trên cả 2 ví dụ trên thì đều thực hiện nối chuỗi trong khi operand thứ 2 của biểu thức 1 và operand 1 của biểu thức 2 đều là số.

Đây là một ví dụ phức tạp hơn:

alert (3 + 4 + '1'); // "71" chứ không phải "331"

Tại đây, các phép tính tính toán một cách lần lượt. operator + đầu tiên tính tổng giá trị 3,4 và trả về 7, sau đó + thêm một chuỗi “1”, vì vậy kết quả của phép tính này 7 + ‘1’ = ’71’.

alert ('1' + 3 + 4); // "134"

Và trong ví dụ trên kết quả 134 thì thật là dễ hiểu đúng không?

Ở đây, operand đầu tiên là một kiểu chuỗi, javaScriot sẽ coi hai operand còn lại là chuỗi. “3” được nối với “1”, vì vậy kết quả sẽ là ‘1’ + ‘3’ = “13” và “13” + ‘3’ = “133”.

+ là operator duy nhất hỗ trợ nối chuỗi trong JavaScript. Các operator số học khác thường làm việc với số và luôn chuyển đổi các operand thành số.

Đây là ví dụ cho phép trừ và phép chia:

alert (7 - '2'); // 5, chuyển đổi '2' thành một số
alert ('7' / '2'); // 3, chuyển đổi cả hai toán hạng thành số

Chuyển đổi số, dấu + một ngôi

Dấu cộng + trong đa phần ngôn ngữ lập trình sẽ tồn tại ở hai dạng: dạng hai ngôi(binary) mà chúng ta đã sử dụng ở trên và dạng một ngôi (unary).

Cộng một ngôi hay nói cách khác, toán tử cộng + được sử dụng cho một operand duy nhất. Nhưng nếu các operand là dạng dữ liệu khác không phải là một số, thì phép cộng một ngôi này sẽ chuyển nó thành dạng số và thực thi.

Ví dụ:

Let x = 2;
alert (+ x); // 2
let y = -2;
alert (+ y); // -2
alert (+ true); // 1
alert (+ ""); // 0

Trong lập trình JavaScript, việc đổi từ dạng chuỗi qua số là ngu cầu thường xuyên. Vì các thuộc tính value của html thường là dạng chuỗi, và việc lấy các giá trị value này trong tính toán số đòi hỏi chúng ta phải biết convert từ chuỗi sáng số.

Dấu cộng hai ngôi với 2 operand là chuỗi sẽ là phép nối chuỗi.

let a = "2";
let b = "3";
alert (a + b); // "23", chuỗi nhị phân cộng với nối

Nếu chúng ta muốn xử lý dưới dạng số, chúng ta cần sử dụng hàm convert và tính toán. Sử dụng dấu + một ngôi để convert từ chuỗi sang số

let a = "2";
let b = "3";
alert (+ a + + b); // 5
// cả hai giá trị được chuyển đổi thành số trước dấu cộng nhị phân
alert (Number (a) + Number (b))

Từ quan điểm của một lập trình viên, chúng tôi thấy phép tính toán dấu + một ngôi thật tuyệt vời trong việc xử lý dữ liệu, chúng giúp chúng chuyển đổi chuỗi thành số một cách nhanh chóng và sau đó cộng hai ngôi.

Và lưu ý dấu cộng 1 ngôi có độ ưu tiên cao hơn rất nhiều so với dấu cộng 2 ngôi. Và trong một biểu thức nếu không có dấu “()” thì chắc chắn những phép toán 1 ngôi sẽ được ưu tiên thực thi trước.

Thứ tự ưu tiên tính toán

Nếu một biểu thức có nhiều operator, thì việc thứ tự thực thi operator được xác định theo thứ tự ưu tiên của chúng, hay nói cách khác đây là quy ước thực thi được công ước sẵn

Operator trong JavaScript

Các bạn có thể theo dõi bảng thứ tự thực thi ở trên để có thể biết thêm chi tiết.

Phép gán

Phép gán hay là Assigment là một toán tử operator. Nó là một toán tử xuất hiện trong những ngày đầu của ngôn ngữ lập trình. Theo bản thứ tự, nó có độ ưu tiên rất thấp là 8.

Điều này dễ hiểu vì sao biểu thức trong JavaScript như x = 3*3 + 1 phép gán sẽ được thực hiện cuối cùng, sau khi tất cả các phép tính toán đã được thực thi. Phép gán sau đó sẽ lưu trữ kết quả tính toán trong biến x

let x = 2 * 2 + 1;
alert (x); // 5
  1. Assignment = trả về một giá trị

Công dụng đầu tiên của phép gán(Assignment) là giá trị trả về. Đây là chức năng cơ bản nhất của operator =

Tất cả các operator trong JavaScript đều trả về một kết quả. Điều này đúng với các phép toán + và -, và cả =.

Lời gọi x = value có nghĩ là lưu trữ giá trị value vào x và trả về.

Dưới đây là đoạn code sử dụng phép gán để trả về giá trị:

let a = 2;
let b = 3;
let c = 4 - (a = b + 1);
alert (a); 
let (c); 

Trong ví dụ trên, giá trị của biểu thức (a = b + 1) là kết quả của phép tính b+1 (đó là 1).

Sau đó, nó được gán cho giá trị a và tiếp tục sử dụng để tính toán thêm.

Mặc dù vậy, những đoạn code như này không phù hợp trong thực tế. Những thủ thuật như vậy sẽ làm cho code khó đọc hơn rất nhiều.

  1. Chuỗi gán

Một tính năng vô cùng thú vị khác là khả năng chuỗi phép gán. Ví dụ như trường hợp này

let a, b, c;
a = b = c = 3 + 3;
alert (a); // 4
alert (b); // 4
alert (c); // 4

Trong đoạn code trên, phép tình được tính từ phải sang trái, đầu tiên phép toán 3+3 = 6 được tính toán, giá trị này được gán và biến c, sau đó biến c được gán và biến b, và cuối cùng biến b gán vào biến a. Và kết quả là chúng ta có a,b,c đều có giá trị bằng 4.

Một lần nữa, vì mục đích dòng code dễ đọc, chúng tôi nên khuyên các bạn không nên sử dụng kiểu viết code này. Mà hãy viết code như chúng tôi viết ở phía dưới.

let a,b,c;
c = 2 + 2;
b = c;
a = c;

Điều đó khiến người đọc dễ dàng nắm được logic code.

  1. Sửa và gán

Chúng ta thường hay sử dụng một loại operator cho một biến và kết quả sẽ được lưu tại chính biến đó. Operator này được gọi là Sửa và gán

Ví dụ:

let n = 2;// khai báo n =2
n = n + 5;n = n * 2; // tính n + 5 và lưu vào chính nó, tính n*5 và lưu vào chính nó

Ký hiệu có thể được viết tắt bằng các toán tử + = và * =:

let n = 2;
n + = 5; // bây giờ n = 7 (giống như n = n + 5)
n * = 2; // bây giờ n = 14 (giống như n = n * 2)
alert (n); // 14

Các toán tử “sửa đổi và gán” ngắn tồn trong tất operator số học và theo bit: / =, – =, v.v.

Các toán tử như vậy có mức độ ưu tiên như một phép gán, vì vậy chúng luôn chạy sau cùng sau khi thực hiện các phép tính khác.

let n = 2;
n * = 3 + 5;
alert (n); // 16 (phần bên phải được đánh giá đầu tiên, giống như n * = 8)

Toán tử tăng/giảm

Tăng hoặc giảm là một trong những operator phổ biến nhất.

Vì vậy, có việc cung cấp 1 toán tử đặc biệt cho nó là điều cần thiết:

Operator ++ tăng một biến lên 1:

let count = 2;
count ++; // works the same as counter = counter + 1, but is shorter</p>
alert( count ); // 3

Operator — giảm một biến đi 1:

let count = 2;
count--; // works the same as counter = counter - 1, but is shorter</p>
alert( count ); // 1

Quan trọng:

Tăng / giảm là một operate đặc biệt chỉ sử dụng cho các variable. Cố gắng sử dụng toán tử này trên một giá trị như 8 ++ sẽ gây ra lỗi.

Các toán tử như ++ và — có thể đặt phía trước hoặc sau 1 variable.

Khi toán tử phái sau variable, nó được gọi là “postfix”: counter ++.

“Dạng prefix” là khi operator đi trước variable: ++couter.

Cả hai câu lệnh này đều có ý nghĩa tương tự nhau: tăng biến couter lên 1.

Có sự khác biệt giữa 2 operator này không? Có, chúng ta chỉ thấy khác biệt khi ta sử dụng return giá tri là ++ / –.

Để thấy sự khác biệt, đây là một ví dụ:

let count = 1;
let a = ++count; // (*) prefix
alert(a); // 2

Trong dòng (*), dạng prefix ++ couter tăng giá trị counter và trả về giá trị mới, 2. Vì vậy, alert javaScript sẽ hiển thị số 2.

Bây giờ, hãy xem khi ta sử dụng dạng postfix:

let count = 1;
let a = count++; // (*)
alert(a); // 2

Trong dòng (*), couter dạng postfix ++ cũng tăng giá trị couter nhưng khi trả về giá trị sẽ trả về giá trị cũ (trước khi tăng). Vì vậy, alert JavaScript hiển thị giá trị 1.

Tóm lại:

Nếu kết quả của biểu thức tăng / giảm không được sử dụng để tính toán, thì không có sự khác biệt trong kết quả nào:

let counter = 0;
counter++;
++counter;
alert( counter ); // 2, kết quả như nhau

Nếu các bạn muốn tăng một giá trị và sử dụng ngay kết quả đó, chúng tôi cần sử dụng dạng prefix:

let count = 0;
alert( ++count ); // 1

Nếu chúng ta tăng một giá trị của một biến nhưng không cần sử dụng giá trị trước đó của nó, chúng ta cần postfix:

let count = 0;
alert( count++ ); // 0

Tăng / giảm giữa các toán tử khác

Các toán tử ++ / — cũng có thể sử dụng kết hợp trong các biểu thức. Mức độ ưu tiên của toán tử này cao hơn hầu hết các operator khác.

Ví dụ:

let count = 1;
alert( 2 * ++count ); // 4

Mặc dù, sử dụng các thủ thuật này trong lập trình, có thể khiến các bạn cảm thấy pro hơn, nhưng các cách sử dụng này thương khiến code thật khó đọc. Một dòng sử dụng quá nhiều phép toán gây khó chịu cho người đọc.

Trong khi đọc Code, quét mắt nhanh đoạn code khi các bạn sử dụng quá nhiều phép tăng giảm, điều này thật ác mộng.

Chúng tôi khuyến khích “một dòng – một hành động”:

let count = 1;
alert( 2 * count );
Count++;

Toán tử bitwise

Toán tử bitwise coi các toán hạng operand là 32 bit và tính toán hai ngôi.

Các toán tử này không chỉ có trong JavaScript. Chúng được hỗ trợ trong rất nhiều ngôn ngữ lập trình.

Danh sách các toán tử:

  • AND ( & )
  • OR ( | )
  • XOR ( ^ )
  • NOT ( ~ )
  • LEFT SHIFT ( << )
  • RIGHT SHIFT ( >> )
  • ZERO-FILL RIGHT SHIFT ( >>> )

Các toán tử này thao tác trên bit, xử lý tính toán trên các dòng bit. Trên lập trình web có lẽ các toán tử này không phù hợp lắm, chúng tôi chỉ nêu về mặt tổng quát. Các bạn có thể theo dõi bài viết về operator này sau.

Dấu phẩy

Toán tử dấu phẩy, là một trong những operator hiếm gặp nhất và ít sử dụng nhất. Đôi khi, nó thường dùng để rút gọn các dòng code, vì vậy chúng ta cần hiểu nó.

Toán tử dấu phẩy giúp tính toán một số kết quả biểu thức, chia chúng bằng dấu “,”. Mỗi biểu thức trong số chúng được tính toán nhưng chỉ kết quả của kết quả cuối cùng được trả về.

Ví dụ:

let a = (1 + 3, 3 + 4);
alert (a); // 7 (kết quả của 3 + 4)

Ở đây, biểu thức 1 + 3 đầu tiên được tính toán và kết quả của nó bỏ qua bởi dấu “,”. Sau đó, 3 + 4 được tính toán và trả về kết quả.

Dấu phẩy có mức độ ưu tiên rất thấp

Xin lưu ý rằng operator “,” có mức độ ưu tiên rất thấp, thấp hơn cả dấu =, vì vậy dấu ngoặc đơn – “()” rất quan trọng trong trường hợp ví dụ trên.

Nếu không có dấu “()” : kêt quả biểu thức a = 1 + 3, 3 + 4 tính + đầu tiên, tổng các số thành a = 4, 7, sau đó toán tử gán = gán a = 4, và bỏ qua phần còn lại. Nó giống như (a = 1 + 3), 3 + 4. Và điều này gây lỗi

Tại sao chúng ta cần một toán tử loại bỏ mọi thứ ngoại trừ biểu thức cuối cùng?

Đôi khi, mọi người thường sử dụng dấu “,” trong các biểu thức phức tạp để đặt một số dòng code trong một dòng.

Ví dụ:

//  ba phép toán trong một dòng
for (a = 1, b = 3, c = a * b; a < 10; a++) {
 ...
}

Các thủ thuật viết code như vậy sử dụng trong nhiều ngôn ngữ JavaScript. Đó là lý do tại sao có bài viết này.

Nhưng thông thường chúng không phù hợp trong thực tế, vì sự khó hiểu của chúng, vì vậy chúng ta nên suy nghĩ trước khi sử dụng.

Quý khách có thể tham khảo hơn ở các dịch vụ do websitehcm.com cung cấp như: dịch vụ seo, dịch vụ viết content , dịch vụ chăm sóc website, dịch vụ thiết kế website 

Leave a Reply