2013-03-07 34 views
6

Cuốn sách "JavaScript: The Definative Hướng dẫn, tái bản lần thứ 6" trong phần 4.13.5 bang đó -dấu phẩy JavaScript và đánh giá biến

"i=0, j=1, k=2; evaluates to 2" 

Nhưng khi tôi hiển thị giá trị như thế này -

var x = i=0, j=1, k=2; alert(x); 

hoặc

alert(i=0, j=1, k=2); 

Giá trị 0 được hiển thị. Tôi đã thử nghiệm và bất kỳ giá trị nào của i được đặt thành, được hiển thị.

Sách có vẻ sai. Bất cứ ai có thể giải thích những gì các cuốn sách có nghĩa là bằng cách nói tuyên bố evaluates to 2? Cái này sai rồi hả?

Cảm ơn!

Trả lời

6

Trong alert(i = 0, j = 1, k = 2); dấu phẩy đang tách các đối số hàm.

Trong một biểu thức tổng quát nó hoạt động như các cuốn sách nói:

alert((i = 0, j = 1, k = 2)); 

Lưu ý rằng tất cả các cuốn sách được nói là sự biểu hiện "i = 0, j = 1, k = 2""evaluates to 2" Trong nhiều trường hợp bạn cần phải đặt biểu thức bên trong dấu ngoặc cho nó sẽ được một biểu hiện độc lập như cuốn sách dự định.

Trong khai báo biến, dấu phẩy lại có hành vi đặc biệt. Nó cho phép bạn viết các khai báo ngắn hơn vì bạn không phải lặp lại var:

var a; var b; var c;var a, b, c; bằng nhau. Vì vậy, là var a = 5; var b = 6; var c = 7;var a = 5, b = 6, c = 7;

Comma có hành vi cũng đặc biệt trong mảng và đối tượng literals:

var a = [1,2,3] //Creates an array with elements 1, 2 and 3 
    var a = [(1,2,3)] //Creates array with one element: 3 

    var b = { 
     key: value, //Comma is separating the key-value pairs. 
     key2: value2 
    } 
4

này là về các ưu tiên của báo cáo kết quả javascript, nó làm tất cả = trước khi đánh giá một tuyên bố mà con nhạn biển dấu phẩy bạn đã đặt.

Hãy thử var x = (i=0, j=1, k=2); và bạn sẽ nhận được những gì bạn muốn.

EDIT

Với dòng mã của bạn var x = i=0, j=1, k=2; nó thực sự giải thích như ba tuyên bố:

  1. var x=i=0
  2. var j=1
  3. var k=2

Dự kiến ​​alert(x); sản lượng là 0.Lưu ý rằng toán tử dấu phẩy có mức độ ưu tiên thực thi tương đối thấp trong báo cáo, do đó, nó chia sẻ các từ khóa trước trong hầu hết các trường hợp, chỉ với một vài ngoại lệ như var (một trong những từ khóa ưu tiên thấp nhất) giữ các biến trong phạm vi hiện tại. .

+0

Cảm ơn Vicary! Đây là một câu trả lời rất hay! –

1

ở đây dấu phẩy sẽ chỉ có nghĩa là bạn đã vượt qua 3 đối số không phải một, vì vậy hãy cảnh báo một cách duyên dáng bỏ qua hai đối số khác, nó không đánh giá bất kỳ thứ gì. sử dụng

alert((i=0, j=1, k=2)); 

var x = (i=0, j=1, k=2); alert(x); 
Các vấn đề liên quan