2016-12-03 20 views
6

Có một .toString() trên Symbol trong ES6 trả về biểu diễn chuỗi Symbol, nhưng tự hỏi tại sao '' + Symbol() không hoạt động (chạy biểu thức này ném ra TypeError mà tôi không mong đợi)? Sau đó, chỉ cần gọi số .toString() trên số Symbol mới và nối thêm (+) vào chuỗi trống không?Chuyển đổi biểu tượng JavaScript thành chuỗi?

+1

@Dai ''' + 123' hoạt động như chuyển đổi loại ẩn, nhưng tại sao' '' + Ký hiệu() 'không hoạt động ngay cả được coi là chuyển đổi ngầm? – Thomson

+0

Xin lỗi, tôi đã đọc sai câu hỏi của bạn. Bạn đang thực sự thấy hành vi nào? Bạn có nhận được 'TypeError' hay cái gì khác không? – Dai

+0

@Dai, xin lỗi vì câu hỏi gây nhầm lẫn. Đã sửa đổi một chút. Tôi thấy ''' + Symbol()' ném TypeError, và tự hỏi tại sao nó làm điều này bởi vì 'Symbol(). ToString()' hoạt động. – Thomson

Trả lời

8

là sau này chỉ gọi .toString() trên mới Symbol và nối thêm (+) nó để chuỗi rỗng?

Không thực sự, Biểu tượng không thể được ngầm đúc thành chuỗi hoặc số, mặc dù đủ thú vị bạn hoàn toàn có thể truyền chúng thành boolean.

MDN actually has a section trên một số những cạm bẫy:

Symbol loại chuyển đổi

Một số điều cần lưu ý khi làm việc với loại chuyển đổi các biểu tượng.

  • Khi cố gắng để chuyển đổi một biểu tượng cho một số, một TypeError sẽ được ném (ví dụ +sym hoặc sym | 0).
  • Khi sử dụng bình đẳng lỏng lẻo, Object(sym) == sym lợi nhuận true.
  • Symbol("foo") + "bar" ném một TypeError (không thể chuyển đổi biểu tượng để string). Điều này ngăn cản bạn âm thầm tạo một tên thuộc tính chuỗi mới từ một biểu tượng, ví dụ.
  • Chuyển đổi "an toàn hơn" String(sym) hoạt động giống như cuộc gọi đến Symbol.prototype.toString() có ký hiệu, nhưng lưu ý rằng new String(sym) sẽ bị ném.

Hành vi này được ghi chép lại trong spec dưới abstract ToString operation:

Đối số Loại: Symbol

Kết quả: Ném một ngoại lệ TypeError.

Và tương tự cho abstract ToNumber operation:

Đối số Loại: Symbol

Kết quả: Ném một ngoại lệ TypeError.

Để đúc một Symbol thành một chuỗi mà không có một TypeError, bạn phải sử dụng một trong hai phương pháp toString, hoặc String().

+1

Có ngầm đưa một đối tượng vào chuỗi có nghĩa là gọi 'Object.prototype.toString()' trên đối tượng không? – Thomson

+0

@Thomson Có, ngầm đúc một đối tượng vào một chuỗi sẽ gọi phương thức 'toString', hoặc trên bản thân cá thể nếu một được đặt, hoặc từ nguyên mẫu. –

+0

như bình luận của bạn, ngầm đúc 'Symbol' thành' String' sẽ thành công vì có một 'toString()' có thể thực hiện được trên cá thể 'Symbol' (' Symbol() ')? – Thomson

1

Từ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toString.

Đối tượng biểu tượng ghi đè phương thức toString của đối tượng đối tượng; nó không kế thừa Object.prototype.toString(). Đối tượng Symbol, phương thức toString trả về một biểu diễn chuỗi của đối tượng.

+0

Điều này không trả lời câu hỏi, đó là lý do tại sao ''' + symbol' không hoạt động. –

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