2012-01-25 6 views
16

I'v दोनों तरीकों के पार चलो एक देशी वस्तु को सरणी प्रोटोटाइप लागू करने के लिए:[] .slice या Array.prototype.slice

arr = Array.prototype.slice.call(obj); 
arr = [].slice.call(obj); 

इसी तरह, एक देशी की सच्ची प्रकार सरणी की तरह हो रही है वस्तु:

type = Object.prototype.toString.call(obj); 
type = {}.toString.call(obj); 

एक साधारण परीक्षण:

function fn() { 
    console.log(
     Array.prototype.slice.call(arguments), 
     [].slice.call(arguments), 
     Object.prototype.toString.call(arguments), 
     {}.toString.call(arguments) 
    ); 
} 

fn(0,1); 

फिडल: http://jsfiddle.net/PhdmN/

वे मेरे जैसा दिखते हैं; पहला वाक्यविन्यास अधिक बार उपयोग किया जाता है, लेकिन दूसरा निश्चित रूप से छोटा है। छोटे वाक्यविन्यास का उपयोग करते समय क्या कोई कमी है?

+4

दूसरा वाक्यविन्यास अनावश्यक रूप से एक नई वस्तु बनाता है। –

+1

@DanD।, आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए, क्योंकि यह सही उत्तर है। ;) – Lucero

उत्तर

25

वे कार्यक्षमता के संबंध में समान हैं।

हालांकि, Array ऑब्जेक्ट को ओवरराइट किया जा सकता है, जिससे पहली विधि विफल हो जाती है।

//Example: 
Array = {}; 
console.log(typeof Array.prototype.slice); // "undefined" 
console.log(typeof [].slice); // "function" 

शाब्दिक विधि Array का एक नया उदाहरण (Array.prototype. विधि के खिलाफ) बनाता है। आप के बारे में चिंतित हैं, तो -

  • var slice = Array.prototype.slice; //Commonly used
  • var slice = [].slice;: दोनों तरीकों का बेंचमार्क: http://jsperf.com/bbarr-new-array-vs-literal/3

    जब आप विधि कई बार उपयोग करने के लिए जा रहे हैं, सबसे अच्छा अभ्यास विधि कैश करने के लिए है Array का अस्तित्व, या यदि आप छोटे वाक्यविन्यास की तरह हैं।

+1

नहीं, केवल परिणाम समान है। कुछ भी नहीं के लिए नई वस्तुओं को बनाना समान नहीं है, और प्रोटोटाइप का स्पष्ट उपयोग भी तेज़ है क्योंकि इसे रनटाइम के लिए कम काम की आवश्यकता होती है ताकि यह पता चल सके कि विधि कहां रहती है। दोनों मामूली, लेकिन बेहतर समाधान के लिए क्यों नहीं जाते हैं यदि वे उपयोग करने के लिए समान रूप से सरल हैं? – Lucero

+0

@ लुसेरो वे कार्यक्षमता के लिए समान हैं। '[] .slice' एक नया उदाहरण प्रारंभ करता है (जो प्रदर्शन को शायद ही प्रभावित करता है)। 'ऐरे' विधि क्लीनर है, लेकिन जब 'ऐरे' को फिर से परिभाषित किया जाता है, तो जेएस में –

+3

कई चीजें तोड़ सकता है। यदि 'Array.prototype.slice' बदल दिया गया है तो दोनों प्रकार अपेक्षित व्यवहार नहीं करेंगे। मुझे फिर से परिभाषित 'अपरिभाषित' की याद दिलाता है ... वैसे भी, कुछ भी नहीं के लिए वस्तुओं का निर्माण महंगा नहीं है, लेकिन कचरा संग्रह की लागत में फैक्टरिंग यह एक तंग पाश में जोड़ सकता है। – Lucero

संबंधित मुद्दे