我看instanceof answer,但我有一個問題 當我編寫混淆的instanceof數組和字符串
["a","b"] instanceof Array
爲什麼reutrns一樣真正的
new Array("a","b") instanceof Array
而
"a" instanceof String
返回false不像
new String("ab") instanceof String
? 非常感謝您的答案和幫助!
我看instanceof answer,但我有一個問題 當我編寫混淆的instanceof數組和字符串
["a","b"] instanceof Array
爲什麼reutrns一樣真正的
new Array("a","b") instanceof Array
而
"a" instanceof String
返回false不像
new String("ab") instanceof String
? 非常感謝您的答案和幫助!
對於字符串,你有兩個
String
類的而且它們不一樣。
這是what the MDN says on the distinction between both。
另一種方式看出差別,其中MDN不點,就是你可以在對象上添加屬性:
var a = "a";
a.b = 3; // doesn't add the property to a but to a wrapped copy
console.log(a.b); // logs undefined
a = new String("a");
a.b = 3;
console.log(a.b); // logs 3
(請記住,大部分的時間,你應該使用原始的字符串)
對於數組,只有數組,沒有什麼像原始數組。
對於關於對象屬性和原始字符串屬性的評論+1! –
在你的情況
"a"
不是一個String對象,它是一個字符串字面或者它被稱爲「原始」。 所以JS不會背叛你,聲稱,「a」不是String的一個實例。上String
一個字符串字面值和一個字符串原始值不相同。文字是*句法*構造。它告訴詞法分析器,字符序列應該是一個字符串。字符串原語是存在於*運行時*的數據類型(不是解析時間)。確實如此,一個字符串* literal *總是導致一個字符串* primitive *。 –
感謝您的澄清。在Javascript中,我認爲它可以互換使用。 –
它可能經常互換使用,但這並不意味着它是正確的。加上我有點挑剔;) –
CF MDN的instanceof
檢查是defined as:
當F的[[HasInstance]]內部方法被調用,值V,採取 以下步驟:
- 如果V不是一個對象,則返回false。
- 設O是調用屬性名稱爲「prototype」的F的[[Get]]內部方法的結果。
- 如果Type(O)不是Object,則拋出TypeError異常。
- 重複
- 令V的[[原型]]內部V.
- 如果V是空的屬性值,返回false。
- 如果O和V引用同一個對象,則返回true。
所以串失敗的第一步,因爲字符串不是一個對象。還要注意,new String
不會返回一個字符串,而是一個由名爲String
的構造函數構造的對象。這是Java和Javascript完全不同的一個例子。
這裏也是代碼自定義instanceOf
,使但是它的工作你喜歡,那麼:
function instanceOf(F, V) {
if(typeof F !== "function") {
throw new Error("F must be a constructor");
}
if(Object(V) !== V) {
return false; //not an object
}
var O = F.prototype;
if(Object(O) !== O) {
throw new Error(".prototype must be an object");
}
while(true) {
V = Object.getPrototypeOf(V);
if(V == null) {
return false;
}
if(V === O) {
return true;
}
}
}
謝謝,我明白了第一項,但什麼是O和[[Get]]內部方法?它們是JavaScript內部實現嗎?自定義instanceof(F,V),F參數代表什麼?如何使用這個程序? –
@ user2245634他們是技術解釋應該如何工作。要使用[[Get]]操作屬性名稱爲「prototype」的'F',您只需執行'F.prototype'。 '[[Get]]'操作也在規範中單獨說明。 – Esailija
所以你問什麼情況下是「一」? –