2013-12-18 32 views
2

我認爲點運算符可以應用於僅用於訪問其屬性的對象。即例如javascript中的點運算符

var o={prop:'property'}; 
alert(o.prop);//property 

當JS執行包含由參考o將發現將進一步發現屬性至極含有由參考o.propalert(o.prop);第一個對象。

讓我們寫

simple='hello'; 
alert(simple.length);//5 

我不明白這一點。我例外,在控制檯會有一種錯誤,因爲簡單是沒有對象。

+1

當然,'simple'是一個'string'對象。在JavaScript中的一切都是一個對象 – Adam

回答

5

我例外,在控制檯將一種錯誤,因爲simple是沒有對象。

其實,這是一個對象String。 JS implicitly converts將字符串方法應用於該對象時,原始字符串類型爲String對象。

在JavaScript中說「一切都是對象」是錯誤的,因爲不是對象的基本類型,包括字符串基元。在很多情況下,基元和對象之間的隱式轉換很容易模糊事實。

+0

1,感謝上原語 –

0

在javascript中, 一切都是對象

  • {} ===對象
  • Array ===對象(一個陣列,但仍然,對象,因爲它具有你喜歡lengthindexOf()等通常未示出特性)
  • string ===對象再次! (這是你從哪裏得到string.length屬性)

結帳這list of objects JS有。僅僅因爲你看不到

{}

並不意味着該變量不是一個對象。爲了得到一個數據類型的屬性的列表,您可以在控制檯中這樣寫:

Object.getOwnPropertyNames(String) 

而且取決於什麼your browser supports,你會得到這樣的:

[ 
"prototype", "quote", "substring", "toLowerCase", "toUpperCase", 
"charAt", "charCodeAt", "contains", "indexOf", "lastIndexOf", 
"startsWith", "endsWith", "trim", "trimLeft", "trimRight", 
"toLocaleLowerCase", "toLocaleUpperCase", "localeCompare", 
"match", "search", "replace", "split", "substr", "concat", 
"slice", "fromCharCode", "length", "name", "arguments", "caller" 
] 
+0

你的意思是,當我們編寫簡單=「你好」,我們有一個對象'[擴展] = FALSE;'內部屬性 –

+0

你舉的例子反駁你的觀點:嘗試'Object.getOwnPropertyNames(「你好「)。 – JJJ

+0

@Juhana:這裏的「hello」不是一個String對象,它是一個字符串[primitive](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#Distinction_between_string_primitives_and_String_objects) 。 Numbers和Booleans也是如此。 你必須試試這個:Object.getOwnPropertyNames(new String(「hello」));'這將返回'[length,0,1,2,3,4]' –

0

字符串是固有的JS的對象。因此,它也具有固有的特性,長度就是其中之一。這個屬性吐出了字符串對象中的字符數(正如你所看到的那樣)。

如果你想要你可以覆蓋任何固有的JS Object(String,Array等)的固有能力,創建自己的功能,但這通常是一個非常糟糕的主意。

1

,當你做這樣的事情simple.length發生了什麼事是,在引擎罩,瀏覽器是暫時轉換成simpleString,然後擡頭對length的對象。這幾乎就像調用new String(simple)除了瀏覽器實際上並不需要創建一個新的對象,它只是需要表現得好像它沒有。有一件事要注意的是,這全是暫時的:

simple.newProp = 123; // will execute fine 
simple.newProp;   // will return undefined