2014-03-03 97 views
9

我伸出對象是這樣的:`this instanceof String`和``foo「instanceof String`有什麼區別?

Object.prototype.is_a = function (x) { 
    return this instanceof x; 
} 

所有作品如預期

"foo".is_a(String) // true 
"foo".is_a(Object) // true 
"foo".is_a(Array) // false 
"foo".is_a(Function) // false 
"foo".is_a(Boolean) // false 
"foo".is_a(Date) // false 
"foo".is_a(Number) // false 
"foo".is_a(RegExp) // false 

但是,當在is_a()功能

"foo" instanceof String // false 

this關鍵字相同foo吧?爲什麼它返回不同的結果?

+1

@WiktorZychla我有偏見,所以我可能是錯的。但是,我不確定這是否重複。有重疊,但這也是關於[拳擊](http://en.wikipedia.org/wiki/Object_type_(object-oriented_programming)#Boxing),而不是帶有基元的'instanceof'。 –

回答

10

首先,你不能申請instanceof到原始值,這就是爲什麼

"foo" instanceof String 

回報false。基元不是對象,因此不能是構造函數的實例。 *

那麼爲什麼它似乎在is_a方法內工作?

在非嚴格模式下,函數is always going to be an object(步驟3)中的this的值。如果this值不是一個對象,則它被隱式轉換爲一個對象。你可以用console.log(typeof this)進行測試。
這意味着字符串原始碼"foo"已轉換爲字符串對象new String("foo"),這就是爲什麼您可以使用instanceof

在嚴格模式下,this的值不必是一個對象,且不會自動轉換(step 1)。你的方法將無法在這種情況下:

> Object.prototype.is_a = function (x) { 
    'use strict'; 
    return this instanceof x; 
} 
> "foo".is_a(String) 
false 

*:這是一個非常簡單的解釋。實際上,instanceof運算符會將評估委託給構造函數的內部[[HasInstance]] method,如果傳遞的值不是對象,則該定義將返回false

1

字符串文字與字符串對象不同(MDN)。看來,字符串字面量(這是一個字符串基元)(當它是this一個函數內部IE)會當它被用來作爲一個功能的結合方面盒裝成一個對象:

>>> typeof "foo" 
"string" 
>>> Object.prototype.type_of = function (x) { 
    return typeof this; 
} 
function (x) { 
    return typeof this; 
} 
>>> "foo".type_of() 
"object" 

這也解釋了你的instanceof行爲,以及。這表現得如您所願:

>>> new String("foo") instanceof String 
true 
>>> new String("foo") instanceof Object 
true 
>>> new String("foo").is_a(String) 
true 
>>> new String("foo").is_a(Object) 
true 
>>> new String("foo").is_a(Array) 
false 
1

JavaScript具有字符串,數字和布爾值的基本和對象版本。字符串文字定義基元而不是對象。如果你做了typeof "foo",你會得到「字符串」而不是「對象」。但是當你訪問字符串的屬性時,它會從原始字符串中創建一個臨時的String對象,然後訪問對應的屬性,因此它在該臨時String對象的方法中爲true。

爲了在考慮基元和對象時測試某個字符串是否是字符串,您需要測試typeof foo === "string" || foo instanceof String

0

的instanceof需要定義的對象,這個例子返回true:

var f = new String("foo"); 
alert(f instanceof String); 

這更類似於你的例子:

alert(new String("foo") instanceof String); 
+0

「type defined」是什麼意思? – Bergi

+0

一個對象類型,新的ObjectType(),拍我我是一個java,c的傢伙。你是一個解析器嗎? –

相關問題