...因爲沒有每個變量從對象
沒有得到,原因有二:
1的JavaScript(和打字稿)有兩個對象和原語。 this
可以保存任何值(在嚴格的模式),並因此可以是原語:
"use strict";
foo();
foo.call(42);
function foo() {
console.log(typeof this);
}
Here's that same code in the TypeScript playground.在兩種情況下(在這裏和那裏),上述輸出:
undefined
number
...兩者都不是從Object
派生的。
2.並不是所有的對象從Object.prototype
繼承:
var obj = Object.create(null);
console.log(typeof obj.toString); // undefined
console.log("toString" in obj); // false
如果對象的原型鏈植根於一個目的並不以所有(如上面obj
)具有原型它將不具有Object.prototype
的功能。
從下面的評論:
我想即使像原語從Object
number
繼承。如果number
沒有,number.ToString()
如何工作?
基元是基元,它不會從Object
繼承。但是,你是對的,他們大部分似乎來,因爲number
,string
,boolean
和symbol
有對象同行(Number
,String
,Boolean
和Symbol
),這也從Object
派生。但並非所有原語都這樣做:undefined
和null
如果嘗試將它們當作對象來對待,則會拋出TypeError
。 (是的,儘管null
is a primitivetypeof null
爲"object"
)
對於他們的四個有對象的同行,當您使用原始的像這樣的對象:
var a = 42;
console.log(a.toString());
...合適類型的對象是通過規範中的抽象ToObject
operation從原語創建和初始化的,並調用結果對象的方法;那麼除非該方法返回該對象引用(我認爲沒有任何內置方法可以,但可以添加一個),臨時對象將立即符合垃圾回收的條件。 (當然,JavaScript引擎優化常見的情況下,像toString
和valueOf
這個過程。)
你可以告訴的對象是由做這樣的事情暫時的:
var a = 42;
console.log(a); // 42
console.log(typeof a); // "number"
a.foo = "bar"; // temp object created and released
console.log(a.foo); // undefined, the object wasn't assigned back to `a`
var b = new Number(42);
console.log(b); // (See below)
console.log(typeof b); // "object"
b.foo = "bar"; // since `b` refers to an object, the property...
console.log(b.foo); // ... is retained: "bar"
(重「見下文」:在Stack Snippets控制檯中,您看到了{}
;在Chrome的真實控制檯中,您看到的內容取決於您是否打開了控制檯:如果不這樣,稍後打開它會顯示您42
;如果你這樣做,你會看到▶ Number {[[PrimitiveValue]]: 42}
您可以用▶擴大。)
是否number
實現自己toString
方法中,具有無關Object
?
Yes,但這並不重要,因爲關於基元和它們與Object
的奇怪關係的觀點並不重要。
所以圍捕:
this
可能包含一個原始的,而一些原語狀物體對待,不是所有的都可以。
this
可能包含對象的對象引用,該對象不是從Object
(也就是說,其原型鏈中沒有Object.prototype
)派生而來的。
JavaScript是智能感知的硬語言。 :-)
我甚至認爲像'數字'這樣的基本元素是從Object繼承的。如果'number'沒有,'number.ToString()'如何工作? 'number'是否實現了它自己的''toString'方法,與'Object'無關? –
另外,你可以看看我的文章的更新?爲什麼Visual Studio會顯示該工具提示,如果對可能不是「Object」的變量執行操作並不安全? –
@JoshuaFrank:查看答案的更新。 Re *「爲什麼Visual Studio會顯示工具提示,如果對可能不是」Object「的變量執行操作並不安全?「* JavaScript是智能感知的一種難懂的語言,我想當你開始在Object.prototype上鍵入某個東西的名字時,它會推遲你對代碼的理解(我懷疑你是否開始輸入一些只能在' String.prototype'或'Number.prototype',它可能也會推遲給你。) –