2011-02-02 23 views
6
> (function() { return this; }).call(false) 
false 

> !!(function() { return this; }).call(false) 
true 

Trong cả Firefox 4 beta và Chrome mới nhất.Vui lòng giải thích hành vi kỳ lạ của .call (sai)

Nó giống như ... khi nào là boolean, không phải là boolean?

+0

Tôi thích điều đó! WTF javascript ?! – Prestaul

+0

vì vậy tôi đoán câu trả lời cho câu hỏi đóng của tôi, là khi nó là một 'Boolean'. – Domenic

Trả lời

6

Dường như khi một boolean nguyên thủy được truyền như là đối số đầu tiên call hoặc apply, đó là tính năng tự động đóng hộp vào một đối tượng Boolean. Đây là rõ ràng trong Firebug trên Firefox 4:

>>> (function() { return this; }).call(false) 
Boolean {} 

Trong thanh tra của Chrome, đó là bước đầu khó hiểu nhưng một chút thăm dò cho thấy sự thật:

>>> (function() { return this; }).call(false) 
false 
>>> typeof (function() { return this; }).call(false) 
"object" 
đối tượng

Tất cả các hoạt Javascript là "truthy", thậm chí new Boolean(false)new Number(0). Do đó, việc sử dụng hai toán tử phủ định (thủ thuật !!) sẽ đưa chúng vào một boolean true.

4

Tôi đã tìm thấy dòng này trong đặc tả giải thích hành vi.

 
3. Else if Type(thisArg) is not Object, set the 
    ThisBinding to ToObject(thisArg). 

Về bản chất giá trị false sẽ được chuyển thành đối tượng boolean. Ứng dụng đầu tiên của toán tử ! sẽ chuyển đổi đối tượng thành true rồi đảo ngược thành false. Đơn đăng ký thứ hai của nhà điều hành ! sẽ đảo ngược false thành true.

Toàn văn

 
10.4.3 Entering Function Code 

The following steps are performed when control enters the 
execution context for function code contained in function 
object F, a caller provided thisArg, and a caller provided argumentsList: 

1. If the function code is strict code, set the ThisBinding to thisArg. 
2. Else if thisArg is null or undefined, 
    set the ThisBinding to the global object. 
3. Else if Type(thisArg) is not Object, set the 
    ThisBinding to ToObject(thisArg). 
4. Else set the ThisBinding to thisArg. 
5. Let localEnv be the result of calling NewDeclarativeEnvironment 
    passing the value of the [[Scope]] internal 
    property of F as the argument. 
6. Set the LexicalEnvironment to localEnv. 
7. Set the VariableEnvironment to localEnv. 
8. Let code be the value of F‘s [[Code]] internal property. 
9. Perform Declaration Binding Instantiation using the function code 
    code and argumentsList as described in 
+0

Oooh Tôi thực sự bị cám dỗ vì đây là câu trả lời được chấp nhận vì nó tham khảo thông số ... nhưng câu trả lời của ide khá dễ làm theo, vì vậy tôi muốn giữ nó ở vị trí cao nhất cho bất kỳ ai khác. – Domenic

+0

@Domenic - Có thể hiểu được, nếu họ muốn đào sâu hơn một chút, tất cả những gì họ cần làm là cuộn xuống một chút. – ChaosPandion

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