2012-02-15 35 views
9

Thêm hai mảng trống: [] + [] dẫn đến một chuỗi rỗng. Tại sao?Tại sao kết quả của việc thêm hai mảng trống trong JavaScript là một chuỗi?

Và mọi liên kết trên một tập hợp các tính năng lạ như thế này?

+0

Có một screencast từ một phiên họp hội nghị gần đây khám phá những hành vi kỳ lạ của Ruby và Javascript, nhưng khi tôi hiểu nó, các đồng bộ hóa JavaScript được thực hiện cụ thể. –

+5

Tôi đã từng viết phần này của câu trả lời lớn hơn [ở đây] (http://stackoverflow.com/questions/7202157/can-you-explain-why-10/7202287#7202287). – pimvdb

+0

@BrianDriscoll đó thực sự là lý do tại sao tôi hỏi câu hỏi. –

Trả lời

12

Toán tử + chỉ tồn tại đối với int và chuỗi. Khi bạn sử dụng nó trên một kiểu khác, JavaScript sẽ cố chuyển đổi loại (đầu tiên thành chuỗi, sau đó là int).

Khi mảng được chuyển thành chuỗi, chúng được xuất dưới dạng chuỗi được phân cách bằng dấu phẩy.

Vì vậy, [] + [] =>"" + "" =>".

Một ví dụ khác: [1,2] + [3,4] =>"1,2" + "3,4" =>"1,23,4"

Spec liên quan:http://es5.github.com/#x11.6.1

+2

Câu trả lời hay. Liên kết đến phần liên quan của spec sẽ không bị tổn thương. Tầm quan trọng của "đầu tiên chuỗi" có thể được đánh dấu như thế này: '[3] + [3] //" 33 "' –

+0

@GGG: Tôi đang cố gắng tìm nó trong spec :-P –

+0

@GGG: Tìm thấy http://es5.github.com/#x11.6.1 –

0

Đầu cơ, nhưng tôi đoán JavaScript đang cố ghép ở đó, thay vì additon.

3

Bởi vì các nhà điều hành + serializes hai mảng và nối chúng lại hai kết quả. Serialization được thực hiện thông qua phương pháp Array.prototype.toString mà về cơ bản thực hiện điều này:

function() { return this.join(','); } 

Hai mảng là trống rỗng, do đó chuỗi trả về bởi toString cũng là trống rỗng và hai chuỗi rỗng làm cho một chuỗi rỗng là tốt.

0

Toán tử + sẽ cố chuyển đổi mảng thành chuỗi. Sử dụng lệnh concat, nếu bạn muốn tham gia hai hoặc nhiều mảng.

1

Trong JavaScript, có hai loại giá trị; nguyên thủy trong đó bao gồm null, undefined, boolean, stringnumber, mọi thứ khác là một object bao gồm array

Khi thêm điều gì đó, JavaScript chuyển đổi các giá trị đến các số, chuỗi hoặc nguyên thủy. JavaScript nội bộ, sử dụng phương thức toPrimitive để chuyển đổi biến thành nguyên thủy.

Đây là chữ ký của toPrimitive

toPrimitive(input, preferedType); 

Với:

[] + [] 

JS chuyển đổi [] đến một nguyên thủy, đầu tiên cố gắng valueOf() mà trả về mảng:

var arr = []; 
arr.valueOf() === arr // true 

Kết quả đó không phải là nguyên thủy, toString() được gọi và trả về chuỗi rỗng (chuỗi là nguyên thủy). Do đó, kết quả của [] + [] là kết nối của hai chuỗi rỗng.

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