Nhận xét về 2014-04-14
Dường như Chrome console.log
in tất cả các Symbol-type-phím, đây là một ví dụ:
var o = {};
o[Symbol.iterator] = function() {};
o[Symbol.unscopables] = {};
var s = Symbol('s');
o[s] = 3;
console.log(o);
mà in:
Đối tượng {Ký hiệu (Symbol.unscopables): Đối tượng, Ký hiệu (Symbol.iterator): chức năng, Ký hiệu: 3}
Tôi không biết tại sao chrome hoạt động theo cách này, là để gỡ lỗi hay gì đó khác?
May mắn là nó không ảnh hưởng đến kết quả toString()
vì vậy tất cả mã đều an toàn.
Dường console.log
đặc biệt là sẽ in ra Symbol.unscopable
quan trọng trong giao diện điều khiển, chúng ta có thể có một đối tượng đơn giản để thực hiện như thế này:
var o = {};
o[Symbol.unscopables] = {};
console.log(o);
mà kết quả đầu ra:
Object {Symbol (Symbol.unscopables): Object}
Biểu tượng Symbol.unscopables
là một biểu tượng đặc biệt quy định tại ES6 như @@unscopables
được sử dụng để loại trừ một số đặc tính khi đối tượng này hoạt động trong một môi trường with
, lời giải thích chính thức là:
Một đối tượng bất động sản có giá trị có tên tài sản riêng là tài sản tên được loại trừ khỏi các ràng buộc môi trường của đối tượng liên quan.
Một ví dụ đơn giản:
var o = {x: 1, y: 2};
o[Symbol.unscopables] = {
y: true
};
console.log(o.x); // 1
console.log(o.y); // 2
with(o) {
console.log(x); // 1
console.log(y); // ReferenceError: y is not defined
}
Bạn có thể sử dụng Array.prototype[Symbol.unscopables]
để tìm tất cả các phím mà không thể được sử dụng trong with
môi trường
Tuy nhiên vẫn còn, các sản phẩm của một Array.prototype
không phải là chính xác giống như một đối tượng đơn giản có khóa là Symbol.unscopables
, kết quả đầu ra là [Symbol(Symbol.unscopables): Object]
, là định dạng giống như một mảng
Tôi không thể giải thích chính xác lý do tại sao, điều này có thể liên quan đến số Symbol.toStringTag
điều khiển cách định dạng đối tượng thành chuỗi nhưng Chrome hiện không xuất biểu tượng này vì vậy thật khó để kiểm tra
Ví dụ tối thiểu sẽ là 'console.log ([] .__ proto __) 'cho bạn biết rằng trình duyệt bạn đang sử dụng, có thể là Chrome, giờ đây xác định' Mảng .__ proto__' với loại Biểu tượng mới trong nội bộ. – adeneo
Đúng. Tôi đã bỏ lỡ điều đó bởi vì tôi vừa nhập vào '[] .__ proto__' in như []. Tôi gues giao diện điều khiển không console.log kết quả của nó. – spelufo
Trên ghi chú đó, thật lạ khi nhập '{}' vào bảng điều khiển in 'undefined' và nhập' {x: 3} 'output' 3'. – spelufo