24/05/2018, 19:37

Các biểu thức trong JavaScript

Để sử dụng các biến hiệu quả, ta phải có thể thao tác và tính toán chúng mỗi khi cần thiết. Chúng ta thực hiện được điều này nhờ sử dụng các biểu thức (expression). Một biểu thức là một tập hợp hợp lệ gồm các literals, các biến và các toán tử để tính ...

Để sử dụng các biến hiệu quả, ta phải có thể thao tác và tính toán chúng mỗi khi cần thiết. Chúng ta thực hiện được điều này nhờ sử dụng các biểu thức (expression).

Một biểu thức là một tập hợp hợp lệ gồm các literals, các biến và các toán tử để tính toán và trả về một giá trị đơn. Giá trị này có thể là một số, một chuỗi hay bất kỳ một giá trị logic nào đó.

Có hai dạng biểu thức. Ta có thể gán một giá trị vào một biến, chẳng hạn như a = 10, nó trở thành một câu lệnh gán. Lúc khác, ta có thể viết một biểu thức như x*y. Đây là một biểu thức nhưng nó không thực hiện phép gán.

Dưới đây là một số dạng biểu thức có sẵn trong JavaScript.

  • Số học: trả về giá trị là một số
  • Logic: trả về một giá trị boolean
  • Chuỗi: trả về giá trị là một chuỗi

Các biểu thức liên kết các biến và literals với nhau thông qua toán tử.

Biểu thức quy tắc là một mẫu tìm kiếm dùng để tìm kiếm các chuỗi kí tự cùng dạng trong một xâu. Dùng biểu thức quy tắc ta có thể tìm kiếm theo mẫu trong các chuỗi kí tự do người dùng nhập vào. Ví dụ, ta tạo ra một mẫu tìm kiếm gồm từ « cat » và sẽ tìm kiếm tất cả các xuất hiện của từ này trong một xâu nào đó. Trong JavaScript, một biểu thức quy tắc cũng được xem là một đối tượng.

Mẫu tìm kiếm của biểu thức quy tác có thể bao gồm:

  • Các mẫu đơn giản (Simple pattern). Thực hiện việc tìm kiếm chính xác theo những kí tự được chỉ ra trong mẫu.

    Ta có một mẫu tìm kiếm như sau:

    /cat/

    Nó sẽ tìm kiếm từ ‘cat’ trong một chuỗi. Nó sẽ trả về từ‘cat’ trong câu: “The cat sat on the mat” hoặc “Please hurry or we will not catch the train”.

    Ký tự ( / ) chỉ ra vị trí bắt đầu và kết thúc của biểu thức cần tìm kiếm

  • Kết hợp các ký tự đơn giản và đặc biệt.

    Được dùng khi ta muốn tìm kiếm các chuỗi cùng dang. Ví dụ, ta muốn tìm kiếm một chuỗi có một kí tự xuất hiện nhiều lần hay có nhiều kí tự trắng. Thông thường, dữ liệu do người dùng nhập vào thường có nhiều từ.

    Biểu thức /xy*z/ sẽ tìm kiếm các chuỗi bắt đầu bẵng x, có thể có nhiều kí tự y hay không có bên trong nó, kết thúc bởi z. Trong chuỗi xxzzzyzxyyyzz, biểu thức sẽ trả về chuỗi con ‘xyyyz’

Dưới đây là bảng liệt kê một số ký tự đặc biệt có thể sử dụng trong các biểu thức quy tắc.

Ký tự Nghĩa Ví dụ
Giải thoát nghĩa hằng (literal) của ký tự /b/ tương xứng với ký tự 'b'. // có thể kết hợp với bất kỳ từ nào bắt đầu bằng với b./a*/ tương xứng với 0 hoặc nhiều kí tự a. /a*/ tương xứng với 'a*'.
^ Tương xứng ký tự đầu chuỗi nhập hay đầu dòng /^A/ sẽ tìm kiếm "An apple."
$ Tương xứng ký tự cuối chuỗi nhập hay cuối dòng /t$/ sẽ tìm kiếm các ký tự t trong "eat" mà không phải “eater”.
* Tương xứng ký tự phía trước là 0 hoặc nhiều lần /o*ch/ tương xứng 'oooouch'
+ Tương xứng ký tự phía trước là 1 hoặc nhiều lần /r+/ tương xứng ‘r’ trong “break” và tất cả ký tự r trong “brrrrrreak”
? Tương xứng ký tự phía trước là 0 hoặc 1 lần. /e?le?/ tương xứng le 'el' trong "angel" và 'le' trong "bangle."
. (Dấu chấm thập phân) tương xứng bất kỳ ký tự đơn ngoại trừ ký tự newline /.n/ tương xứng ‘no’ và 'on' trong “There are no apples on any of the trees” nhưng không phải là ‘any’.
(x) Tương xứng 'x' và ghi nhớ ký tự tương xứng đó. Ví dụ, /(boo)/ tương xứng 'boo' trong "boo said Casper" và ghi nhớ ‘boo’
x|y Tương xứng 'x' hoặc 'y'. Ví dụ, /green|ripe/ tương xứng là 'green' trong "green mangoes" và 'ripe' trong "ripe mangoes."
{n,m} Tương xứng ít nhất n và nhiều nhất m số lần xuất hiện của kí tự phía trước.n và m là số nguyên dương. Ví dụ, /o{1,3}/ không tương xứng trong"cld", ký tự 'o' trong "cold," hai ký tự oo đầu tiên trong "coold," và ba ký tự o đầu tiên trong "cooooold" Mặc dù có nhiều hơn ba ký tự o xuất hiện nhưng nó chỉ trả về ba ký tự xuất hiện đầu tiên.
[xyz] Tương xứng bất kỳ nào nằm trong dấu ngoặc. Dấu nối được dùng để xác định một khoảng [vxyz] tương tự như [v-yz][0-9]
[^xyz] Tương xứng với bất kỳ ký tự nào không nằm trong dấu ngoặc. Dấu nối được dùng để xác định một khoảng [^xyz] tương tự như [^x-z].
d Tương xứng ký tự số / d / sẽ tương xứng 7 trong chuỗi “This is Bond7”
s
  • Tương xứng với ký tự trắng đơn bao gồm space, tab, form feed, line feed.
  • Tương tự [ f v].
  • /sw*/ tương xứng ' fun' trong "good fun."
    Tương xứng một tab
    w
  • Tương xứng ký tự alphanumberic bao gồm ký tự gạch dưới.
  • Tương tự [A-Za-z0-9].
  • /w/ tương xứng 'm' trong "mangoes", '6' trong "62.50" và '2' trong "2D."

    Biểu thức quy tắc
    Một biểu thức quy tắc là một mẫu tìm kiếm để tìm kiếm dữ liệu cùng dạng.

    JavaScript xem một biểu thức quy tắc như một đối tượng. Vì vậy, chúng ta phải tạo một biểu thức quy tắc trước khi sử dụng chúng. Chúng ta có thể tạo một biểu thức quy tắc bằng một trong hai cách sau:

    1. Sử dụng khởi tạo đối tượng (Object initializer).

      Cách này trước đây được gọi là tạo đối tượng bằng cách sử dụng các kí hiệu nguyên dạng. Sau đó nó được chuyển thành object initializer để giống với thuật ngữ của C++. Nếu ta muốn tạo ra một thể hiện của một đối tượng, ta phải dùng một object initializer.

      Cú pháp của việc khởi tạo đối tượng:

       Objectname = {expression}

      Trong đó objectname là tên của đối tượng mới.

    2. Expression là một khuôn mẫu để tạo đối tượng.
    3. re = /xy+z/
          

      Trong định nghĩa trên, một biểu thức quy tắc “xy+z” được tạo và gán cho đối tượng re. Bây giờ, chúng ta có thể dùng đối tượng re để tìm kiếm các mẫu theo yêu cầu.

      Khi chúng ta khởi tạo đối tượng, biểu thức quy tắc được dịch khi script được đánh giá. Nếu biểu thức quy tắc không thay đổi, sử dụng khởi tạo đối tượng thì hiệu quả.

    1. Gọi hàm khởi tạo của đối tượng RegExp

      JavaScript cung cấp đối tượng biểu thức định nghĩa trước đó là, RegExp. Một hàm khởi tạo được dùng để tạo một kiểu đối tượng và định nghĩa các thuộc tính của đối tượng. Ví dụ, chúng ta có thể tạo một đối tượng gọi là “employee”. Các thuộc tính của đối tượng là empID, join_dt, salary.

      function employee(empID, join_dt, salary) 
          { this.empID = empID this.joint_dt = join_dt this.salary = salary }
          

      Sau khi hàm được tạo, chúng ta phải dùng hàm để tạo một thể hiện của đối tượng bằng toán tử new.

      employee1=new employee("100", "11/11/02", 3000)
          

      Khi chúng ta dùng hàm khởi tạo, biểu thức được dịch trong thời gian thực thi. Nếu biểu thức quy tắc thay đổi hoặc nếu nó phụ thuộc vào dữ liệu nhập vào từ người dùng, sử dụng hàm khởi tạo là hợp lý nhất.

      Hàm getdetails() tìm kiếm một mẫu dữ liệu được nhập từ người dùng.

      Dữ liệu nhập bời dùng rất đa dạng. Chọn mẫu tìm kiếm là (w+) s (d+). Có nghĩa là , một hoặc nhiều ký tự bất kỳ xuất hiện theo sau một ký tự trắng hoặc xuất hiện bất kỳ một ký tự số nào. Dấu cộng (+) chỉ ra một hoặc nhiều ký tự xuất hiện Dấu sao (*) chỉ tra 0 hoặc nhiều ký tự xuất hiện.

      function getdetails()
          {
          re = /(w+)s(d+)/
          re.exec();
          window.alert(RegExp.$1 + ", your age is " + RegExp.$2);
          }
          

    Một khi chúng ta tạo một biểu thức quy tắc, chúng ta có thể đặt nó để dùng. Một số phương thức trong bảng dưới đây có thể dùng với biểu thức quy tắc.

    Phương thức Mô tả
    Exec Tìm kiếm một mẫu tương xứng trong một chuỗi. Nó trả về một mảng thông tin.
    Test Kiểm tra tương xứng trong một chuỗi. Trả về giá trị đúng hoặc sai
    Match Tìm kiếm tương xứng trong một chuỗi . Trả về một mảng thông tin hoặc giá trị null nếu sai.
    Search Kiểm tra sự tương xứng trong một chuỗi. Trả về giá trị chỉ số của tương xứng nếu tồn tại, -1 nếu bị sai
    Replace Tìm kiếm sự tương xứng trong một chuỗi, và thay thế chuỗi con tìm kiếm tương xứng bằng một chuỗi con thay thế khác.
    Split Dùng để tách một chuỗi thành một mảng các chuỗi con.

    Để dùng một phương thức, chúng ta phải xác định đối tượng được sử dụng. Cú pháp là:

  • objectname.method = function_name
  • Sau đó chúng ta có thể gọi phương thức trong ngữ cảnh của đối tượng. Cú pháp là:

  • objectname.methodname(parameters)
  • Chúng ta có thể dùng các cờ với biểu thức quy tắc. Hai cờ “g” và “i” được chọn tuỳ ý. Rồi chúng ta có thể dùng riêng hoặc dùng cả hai cờ. Cờ “g” được dùng để chỉ dẫn tìm kiếm toàn cục. Cờ “i” dùng để chỉ dẫn tìm kiếm có phân biệt chữ hoa và chữ thường.

     re = /w+s/g; //use a global search

    Đoạn mã dưới đây dùng để kiểm tra phương thức tìm kiếm một mẫu trong chuỗi. Nếu mẫu được tìm thấy, giá trị trả về “True” và ngược lại thì trả về “false”.

    <HTML>
        <HEAD>
           <SCRIPT LANGUAGE="JavaScript">
        	re = /Time/
        	str = re.test ("Time and Tide wait for none");
        	window.alert(str);
           </SCRIPT>
        </HEAD> 
    </HTML>
        
    JavaScript: Biểu thức

    Đoạn mã sau đây tìm kiếm sự xuất hiện của ký tự x, y hoặc z.

    <HTML>
        <HEAD>
           <SCRIPT LANGUAGE="JavaScript">
        	re = /[xyz]/
        	str = re.exec("It is very coooooold");
        	window.alert(str);
           </SCRIPT>
        </HEAD>
    </HTML>
        
    JavaScript: Các biểu thức (1)

    0