2012-01-26 36 views
22

Tại wtfjs, tôi nhận thấy rằng đây là javascript hợp pháp.Ký hiệu "tuple" Javascript: điểm của nó là gì?

",,," == Array((null,'cool',false,NaN,4)); // true 

Đối số (null,'cool',false,NaN,4) giống như một bộ dữ liệu đối với tôi, nhưng javascript không có bộ dữ liệu!

Một số kiểm tra nhanh trong bảng điều khiển javascript của tôi mang lại những điều sau đây.

var t = (null,'cool',false,NaN,4); // t = 4 
(null,'cool',false,NaN,4) === 4; // true 
(alert('hello'), 42); // shows the alert and returns 42 

Nó dường như y hệt như một dấu chấm phẩy ; danh sách tách ra các báo cáo, chỉ cần trở về giá trị của báo cáo kết quả cuối cùng.

Có một tham chiếu nào đó mô tả cú pháp này và ngữ nghĩa của nó không? Tại sao nó tồn tại, tức là khi nào nó nên được sử dụng?

+0

Đây là toán tử dấu phẩy: http://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/ – Lepidosteus

+1

Toán tử dấu phẩy cũng có thể được (ab) được sử dụng để chạy một loạt các hàm bên trong nhánh thứ ba, vì nó sẽ trả về kết quả của câu lệnh cuối cùng: 'var a = isTrue? (b = f (c), g (b)): (b = g (c), f (b)) '. Hiếm khi khôn ngoan, nhưng đôi khi hữu ích nếu mã rất ngắn gọn được ưa thích hơn khả năng đọc, hoặc cho các mục đích gỡ lỗi nhanh chóng. – Fx32

+0

Đây được gọi là 'biểu thức' trong JavaScript, đây không chỉ đơn giản là tác dụng của toán tử dấu phẩy mặc dù nó đóng một phần nhỏ; Biểu thức này được giải quyết vì toán tử dấu phẩy. Bạn có thể đặt giá trị cho bất kỳ biến có thể thay đổi nào của bất kỳ biểu thức được đánh giá nào. Ngay cả khi biểu thức đó không được xác định. – Relic

Trả lời

30

Bạn đang nhìn thấy ảnh hưởng của comma operator .

Toán tử dấu phẩy đánh giá cả hai toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng thứ hai.

Giá trị kết quả khi a,b,c,...,n được đánh giá sẽ luôn luôn là giá trị của biểu thức ngoài cùng bên phải, tuy nhiên tất cả biểu trong chuỗi vẫn được đánh giá (từ trái sang phải).

+0

Cảm ơn, thuật ngữ 'toán tử dấu phẩy' là những gì tôi đang tìm kiếm. – Grilse

1

Hãy thử điều này alert((null,'cool',false,NaN,4)) và sau đó bạn có thể thấy.

demo

Lý do là vì các nhà điều hành dấu phẩy đánh giá tất cả các báo cáo và trả lại người cuối cùng.

Hãy suy nghĩ về dòng này: a = 1, b = 2, c = 3; nó sẽ chạy mỗi biểu như vậy trong bản chất nó sẽ thiết lập các biến với những gì bạn muốn và trả về giá trị cuối cùng (trong trường hợp này 3)

8

Như đã giải thích, hành vi này là do nhà điều hành , gây ra. Do đó, biểu thức (null,'cool',false,NaN,4) sẽ luôn được đánh giá là 4. Vì vậy, chúng tôi có

",,," == Array(4) 

Array(4) - tạo mảng mới với 4 phần tử được phân bổ. Tại thời điểm so sánh với chuỗi, mảng này được chuyển thành chuỗi giống như với Array(4).toString(). Đối với mảng toString hoạt động như phương thức join(',') được gọi trên mảng này. Vì vậy, cho mảng trống của 4 yếu tố tham gia sẽ sản xuất chuỗi ",,,".

Các vấn đề liên quan