Disclaimer:I’m the guy who tweeted that :) Đó là một câu hỏi tôi sẽ hỏi và câu trả lời trong tôi Front-Trends nói chuyện. Tôi đã viết tweet đó 5 phút trước khi lên sân khấu.
Vì giới hạn 140 ký tự trên Twitter, câu hỏi hơi mơ hồ. Câu hỏi thực sự tôi hỏi là như sau.
Các ECMAScript đặc tả defines ToBoolean()
as follows:
Như bạn có thể thấy, tất cả đối tượng phi nguyên thủy (tức là tất cả các đối tượng mà không phải là một boolean, một số, một chuỗi, undefined
, hoặc null
) là sự thật theo spec. Tuy nhiên, trong DOM, có một ngoại lệ cho điều này - một đối tượng DOM bị lỗi. Bạn có biết cái nào? Câu trả lời là document.all
. The HTML spec nói:
Thuộc tính all
phải trả lại một HTMLAllCollection
bắt rễ tại Document
nút, có bộ lọc phù hợp với tất cả các yếu tố này.
Đối tượng được trả về cho tất cả có một số hành vi bất thường:
Các user agent phải hành động như thể ToBoolean()
điều hành trong JavaScript chuyển đổi đối tượng được trả về cho all
với giá trị false
.
Các user agent phải hành động như thể, đối với các mục đích của ==
và !=
nhà khai thác trong JavaScript, đối tượng được trả về cho all
là bằng giá trị undefined
.
Các user agent phải hành động như vậy mà typeof
điều hành trong JavaScript trả về chuỗi 'undefined'
khi áp dụng cho các đối tượng được trả về cho all
.
Các yêu cầu này là một sự vi phạm cố ý của JavaScript đặc điểm kỹ thuật hiện tại tại thời điểm viết (ấn bản ECMAScript 5). Đặc tả JavaScript yêu cầu toán tử ToBoolean()
chuyển đổi tất cả các đối tượng thành giá trị true
và không có quy định cho các đối tượng hoạt động như thể là undefined
cho mục đích một số toán tử nhất định. Vi phạm này được thúc đẩy bởi khả năng tương thích với hai lớp nội dung cũ: một mức sử dụng sự hiện diện của document.all
như một cách để phát hiện tác nhân người dùng cũ và . mà không kiểm tra sự hiện diện của nó trước.
Vì vậy, document.all
là ngoại lệ chính thức duy nhất cho quy tắc ECMAScript này. (Trong Opera, document.attachEvent
vv cũng bị lỗi, nhưng đó không phải là bất cứ nơi nào.)
Từ fiddle này nó không có vẻ là http://jsfiddle.net/V8GaH/ –
fiddle kiểm tra của bạn document.getElementsByTagName không document.all – GillesC
Bạn đang thử nghiệm điều sai trái, chắc chắn? http://jsfiddle.net/CPVAf/1/ – stusmith