2016-01-19 13 views
8

Đọc tài liệu trên Symbol s trong JavaScript và cũng thử nghiệm trong một vài môi trường (Chrome, Firefox, Node.js), tôi đã nhận ra rằng sự hiểu biết của tôi về chuyển đổi chuỗi ẩn là thiếu sót.Ký hiệu: Chuyển đổi chuỗi ngầm định hoạt động như thế nào trong JavaScript?

Tôi luôn ấn tượng rằng phương thức toString() của đối tượng được gọi khi cố gắng chuyển đổi thành chuỗi và nếu hàm đó không trả về nguyên thủy, thì phương thức đó được gọi là phương thức toPrimitive() của đối tượng làm việc nó sẽ gõ-lỗi. Tuy nhiên, lời giải thích này không bao gồm các TypeError rằng Symbol s ném:

var sym = Symbol("test"); 
 

 
try { 
 
    console.log(sym + "ing"); 
 
} catch (error) { 
 
    console.error(error); 
 
}

TypeError: Cannot convert a Symbol value to a string 

Nhưng nó rõ ràng rằng Symbol s có một phương pháp hợp lệ toString(). Vậy tại sao nó không được gọi?

Trả lời

5

Bạn nói đúng rằng một đối tượng được gọi là phương thức toString khi thực hiện chuyển đổi chuỗi ngầm định. Tuy nhiên, as the spec states, chuyển đổi chuỗi ngầm trên biểu tượng gây ra một TypeError.

Như Dr. Axel Rauschmayer put it:

Cho rằng cả hai chuỗi và biểu tượng có thể khóa bất động sản, bạn muốn bảo vệ người vô tình chuyển đổi một biểu tượng thành một chuỗi.

+0

Điều này không _really_ trả lời câu hỏi của tôi: Làm thế nào để 'Symbol' thực hiện khả năng loại lỗi và đi vòng quanh luồng công việc mặc định của một loại chuyển đổi ngầm định? –

+1

@PatrickRoberts Câu trả lời đơn giản là "vì spec nói như vậy". Câu trả lời thực sự là những người triển khai động cơ phải tuân thủ spec để họ thực hiện một cái gì đó trong nội bộ của họ để kiểm tra xem một 'Symbol' có liên quan đến việc chuyển đổi kiểu chuỗi không sau đó ném ngoại lệ. Bản thân 'Symbol' không xử lý hành vi này. –

+0

Vì vậy, lý do nó gõ lỗi không phải là do một thợ cơ khí có thể truy cập từ JavaScript? –

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