2015-03-22 12 views
7

Xác định chức năng tiện ích để kiểm tra chuỗi nguyên mẫu của đối tượng (trong Chrome), tôi nhận được điều này cho mảng.[] .__ proto__ === Array.prototype // === [Ký hiệu (Symbol.unscopables): Object]?

array prototype chain

Vì vậy, có thể thấy rằng

[].__proto__ === Array.prototype // === [Symbol(Symbol.unscopables): Object] 

Tôi hiểu sự bình đẳng đầu tiên. Tôi không biết thuật ngữ thứ ba là gì, mặc dù tôi đã nghe nói rằng ES6 sẽ có Biểu tượng.

Điều này có giống với Array.prototype không? Tại sao nó in theo cách đó?

Edit: chrome: // thông tin phiên bản:

Google Chrome 40.0.2214.111 (Official Build) 
Revision 6f7d3278c39ba2de437c55ae7e380c6b3641e94e-refs/branch-heads/[email protected]{#480} 
OS Linux 
Blink 537.36 (@189455) 
JavaScript V8 3.30.33.16 
+1

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

+0

Đú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

+0

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

Trả lời

2

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