Math.max.apply () कैसे काम करता है?


82

कैसे Math.max.apply()काम करता है ?.

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  <script>
      var list = ["12","23","100","34","56",
                                    "9","233"];
      console.log(Math.max.apply(Math,list));    
  </script>
</body>
</html>

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max

उपरोक्त कोड सूची में अधिकतम संख्या पाता है। किसी ने मुझे बता सकते हैं कि कैसे नीचे कोड काम करता है ?. ऐसा लगता है कि यह काम करता है अगर मैं गुजरता हूंnull or Math.

console.log(Math.max.apply(Math,list));

क्या सभी के user-defined/Native functionsपास कॉल और लागू करने की विधि है जिसका हम उपयोग कर सकते हैं?

जवाबों:


139

applyकिसी सरणी को स्वीकार करता है और यह सरणी को वास्तविक फ़ंक्शन के मापदंडों के रूप में लागू करता है। इसलिए,

Math.max.apply(Math, list);

के रूप में समझा जा सकता है,

Math.max("12", "23", "100", "34", "56", "9", "233");

तो, applyएक फ़ंक्शन के मापदंडों के रूप में डेटा की एक सरणी को पारित करने के लिए एक सुविधाजनक तरीका है। याद है

console.log(Math.max(list));   # NaN

काम नहीं करेगा, क्योंकि maxइनपुट के रूप में एक सरणी को स्वीकार नहीं करता है।

एक और फायदा है, का उपयोग करते हुए apply, आप अपना खुद का संदर्भ चुन सकते हैं। पहला पैरामीटर, आप applyकिसी भी फ़ंक्शन से गुजरते हैं , thisउस फ़ंक्शन के अंदर होगा । लेकिन, maxवर्तमान संदर्भ पर निर्भर नहीं करता है। तो, कुछ भी जगह में काम करेगा Math

console.log(Math.max.apply(undefined, list));   # 233
console.log(Math.max.apply(null, list));        # 233
console.log(Math.max.apply(Math, list));        # 233

चूंकि applyवास्तव मेंFunction.prototype किसी भी मान्य जावास्क्रिप्ट फ़ंक्शन ऑब्जेक्ट में परिभाषित किया गया है , applyडिफ़ॉल्ट रूप से फ़ंक्शन होगा ।


3
@ जब भी, यह तब भी काम करता है जब हम संदर्भ को सेट करते हैं undefinedया null:) यदि maxसंदर्भ में कुछ भी एक्सेस / बदलने की कोशिश की जाती है, तो यह तब विफल हो जाता है जब संदर्भ को सेट किया जाता है undefinedया null
thefourtheye

2
@NiCkNewman वास्तव में, Math.maxपहले पैरामीटर का उपयोग नहीं करेगा, क्योंकि इसे किसी भी संदर्भ की आवश्यकता नहीं है। यह केवल उस डेटा पर काम करता है जिसे वह तर्कों में प्राप्त करता है।
Thefourtheye

1
@NiCkNewman टिप्पणी अनुभाग में चर्चा करने के लिए यह बहुत व्यापक है। लेकिन यह लेख thisएक अच्छा प्रारंभिक बिंदु होगा। इसका एक खंड भी है callऔरapply जो इसका विवरण देता है।
thefourtheye

2
.Apply () की अब तक की सबसे अच्छी व्याख्या!
माइक्रोचिप्स

1
अशक्त या गणित क्यों?

37

जावास्क्रिप्ट ES6 पर केवल स्प्रेड ऑपरेटर का उपयोग करें :

var list = ["12","23","100","34","56","9","233"];
console.log(Math.max(...list));
//                   ^^^ Spread operator 

3
"स्प्रेड ऑपरेटर" संगतता की जांच करने के लिए: kangax.github.io/compat-table/es6/#test-spread_(..)_operator
pec

17

क्या कोई मुझे बता सकता है कि नीचे का कोड कैसे काम करता है?

Math.max.apply(Math,list)

फ़ंक्शन कार्यान्वयन (निकाय) में एक संदर्भ के रूप में उपयोग की जाने वाली वस्तु के Math.maxसाथ एक फ़ंक्शन को आमंत्रित करता है और एक तर्क के रूप में पारित किया जाता है।Maththislist

तो यह अंततः के बराबर है

Math.max("12","23","100","34","56", "9","233")

ऐसा लगता है कि यह काम करता है अगर मैं अशक्त या गणित से गुजरता हूं।

स्पष्ट रूप से Math.maxकार्यान्वयन उदाहरण चर का उपयोग नहीं करता है - ऐसा करने का कोई कारण नहीं है। मूल कार्यान्वयन केवल अधिक से अधिक पुनरावृत्त होगा argumentsऔर अधिकतम एक खोज करेगा।

क्या सभी यूज़र-डिफ़ाइंड / नेटिव फ़ंक्शंस में कॉल और लागू करने की विधि है जिसका हम उपयोग कर सकते हैं ?।

हां, हर एक फंक्शन का इस्तेमाल करके callया फिर इनवाइट किया जा सकता हैapply

संदर्भ:


3

मैं कहकर शुरू करूंगा Math.max(...numbers)और Function.prototype.apply()केवल कुछ तत्वों के साथ सरणियों के लिए उपयोग किया जाना चाहिए। (...) और लागू करें या तो विफल हो जाएगा या गलत परिणाम लौटाएगा यदि सरणी बहुत बड़ी है

Math.max.apply(null | undefined | Math, numbers)जैसा कि Math.max(...numbers)मैं Math.max(...numbers)सौंदर्य संबंधी कारणों के लिए सुझाऊंगा , वैसा ही है।

const numbers = [5, 6, 2, 3, 7];

const max = Math.max(...numbers);

console.log('max:', max);
// expected output: 7

const min = Math.min(...numbers);

console.log('min:', min);
// expected output: 2

यदि आपको एक संख्यात्मक सरणी में अधिकतम तत्व खोजने की आवश्यकता है जो बहुत बड़ी है:Array.reduce() विधि का उपयोग करें ।

Array.reduce() प्रत्येक मान की तुलना करके, एक संख्यात्मक सरणी में अधिकतम तत्व को खोजने के लिए इस्तेमाल किया जा सकता है:

const numbers = [5, 6, 2, 3, 7];
const getMax = (numbers) => numbers.reduce((a, b) => Math.max(a, b));

const getMin = (numbers) => numbers.reduce((a, b) => Math.min(a, b));
	
const max = getMax(numbers)
const min = getMin(numbers)

console.log('max:', max)
console.log('min:', min)

निष्कर्ष:

संख्यात्मक सारणी जो अपेक्षाकृत छोटी है: Math.max(...numbers) संख्यात्मक सारणी का उपयोग करें जो बहुत बड़ी है: Array.reduce()विधि का उपयोग करें


1
जावास्क्रिप्टकोर इंजन में 65536 की हार्ड-कोडेड तर्क सीमा है, इसलिए आवेदन करते समय () आपको यह सुनिश्चित करना चाहिए कि आपके सरणी का आकार हमेशा कम रहेगा।
चर्मण

2

Math.max (val1, val2, ...)

Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...पैरामीटर हैं और नंबर MDN Math.max होना चाहिए

आप मापदंडों के arrayरूप में पारित नहीं कर सकते Math.max। एक सरणी पास करने के लिए आपको उपयोग करना होगा apply

लागू

आवेदन का पहला पैरामीटर है this, दूसरा है array। गणित की विधियाँ अन्य भाषाओं में स्थिर के बराबर हैं, जिसका अर्थ है कि इसके विपरीत वस्तु उदाहरण की आवश्यकता नहीं है, array.prototype.sliceइसलिए आपको thisइस मामले में पास होने की आवश्यकता नहीं है ।

उदाहरण

var arr = [1, 2, 3];

Math.max(1, 2, 3);  // -> 3
Math.max(arr);      // -> NaN (Not a Number)
Math.max.apply(null, arr);  // Math.max.apply(null, [1, 2, 3]) -> Math.max(1, 2, 3) -> 3

arr.slice(1);  // -> returns Array [2, 3]
Array.prototype.slice.call(arr, 1); // Array.prototype.slice.call([1, 2, 3], 1) == [1, 2, 3].slice(1)

जब आप किसी सरणी को पैरामीटर के रूप में पास करना चाहते हैं, जिसका आपको उपयोग करना है apply, अन्यथा उपयोग करें call

a pply = a rray
c all = c omma अलग
हो गया कॉल और आवेदन के बारे में अधिक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.