2012-03-15 54 views
0

在性能和所創建的數據結構而言,是:Is設置函數變量一樣使用對象文本

function coords(xpos, ypos, zpos){ 
    this.xpos = xpos; 
    this.ypos = ypos; 
    this.zpos = zpos; 
    return this; 
} 
var coordinates = coords(0, 0, 0); // notice I am not calling new 

同爲:

function coords(xpos, ypos, zpos){ 
    return { 
     xpos : xpos, 
     ypos : ypos, 
     zpos : zpos, 
    }; 
} 
var coordinates = coords(0, 0, 0); 

是有更好的性能的方式生成coordinates假設我有很多。

+3

您的意思是'this.xpos = xpos; ...'和'var coordinates = new coords(0,0,0);'?如果不是,那麼這兩個功能就會完成不同的事情。 – maerics 2012-03-15 15:18:56

+2

在這種情況下,最快的方式是完全不使用功能,例如, 'var coordinates = {xpos:0,ypos:0,zpos:0};'測試這兩種類型的對象創建的速度都需要一個基準,但我的猜測是這種差異不會有太大的不同,因爲兩者創建一個對象,並通過一個函數調用來調用。 – SJFrK 2012-03-15 15:19:21

+0

@maerics謝謝 – zode64 2012-03-15 15:28:26

回答

1

在使用new創建,你必須使用

var coordinates = new coords(0, 0, 0);並在JavaScript對象第一種方法是昂貴的。在第二種方法中,執行該函數將返回一個座標對象。

我更喜歡第二種方法,儘管它在現代瀏覽器中沒有多大區別。

這裏是一個簡單的基準http://jsperf.com/objecr-vs-fn-perf-test

在Firefox 7的第一種方法比第二和在鉻17較慢

是〜75%,該對〜30%較慢

3
  1. 第二個示例使用object literal而不是JSON
  2. 就語義而言:這兩者在語義上並不相同。即使您在第一個示例中將+ s更改爲= s,coordinatesundefined,因爲您沒有使用newcoords也不返回任何內容。
  3. 在性能方面:這是微型優化的最小原因。不要再考慮它並繼續解決實際問題。
  4. 如果你仍然關心性能差異(你不應該)寫一個jsPerf基準。

由於SJFrK commented

最快的方法是沒有用的功能可言,例如

var coordinates = { xpos: 0, ypos: 0, zpos: 0 }; 
2

的第一個片段應該是這樣的:

function coords(xpos, ypos, zpos) { 
    this.xpos = xpos; 
    this.ypos = ypos; 
    this.zpos = zpos; 
} 

var coordinates = new coords(0, 0, 0); 

這就是說,你的選擇將取決於你想要的結果做什麼(你想有一個對象文本或一個可以定義原型的對象),但是對於任何合理的使用,性能幾乎都是相同的。

1

在第一個例子中,coordinates是未定義的。該函數沒有返回任何東西。在第一個示例中,您需要使用new,以便它與第二個示例相同。(你也有一個錯字,+應該=

function coords(xpos, ypos, zpos){ 
    this.xpos = xpos; 
    this.ypos = ypos; 
    this.zpos = zpos; 
} 
var coordinates = new coords(0, 0, 0); 

在你的第二個例子,你不使用JSON。你只是使用obect文字。 JSON是一種將對象/數組表示爲字符串的方法。

至於表現,第二個可能(可能)會更快,但這不是你應該擔心的。