Math.max.apply () nasıl çalışır?


82

Nasıl Math.max.apply()çalışır?

<!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

Yukarıdaki kod Listedeki Max sayısını bulur. Biri bana aşağıdaki kodun nasıl çalıştığını söyleyebilir mi? Görünüşe göre geçersem işe yarıyornull or Math.

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

user-defined/Native functionsKullanabileceğimiz tüm call and apply yöntemi var mı?

Yanıtlar:


139

applybir diziyi kabul eder ve diziyi gerçek işleve parametre olarak uygular. Yani,

Math.max.apply(Math, list);

şu şekilde anlaşılabilir:

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

Bu nedenle, applybir veri dizisini bir işleve parametre olarak iletmenin uygun bir yoludur. Hatırlamak

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

çalışmaz, çünkü maxbir diziyi girdi olarak kabul etmez.

Kullanmanın başka bir avantajı var, applykendi bağlamınızı seçebilirsiniz. applyHerhangi bir fonksiyonun ilk parametresi thiso fonksiyonun içinde olacaktır . Ancak maxmevcut bağlama bağlı değildir. Yani, yerine her şey çalışırdı 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

Beri applyfiilen tanımlananFunction.prototype herhangi geçerli bir JavaScript işlevi nesne, sahip olacaktır applyvarsayılan olarak işlev.


3
@Shane çünkü, bağlamı undefinedveya olarak ayarladığımızda bile çalışıyor null:) maxBağlamdaki herhangi bir şeye erişmeye / değiştirmeye çalışsaydınız, bağlam undefinedveya olarak ayarlandığında başarısız olurdu null.
thefourtheye

2
@NiCkNewman Aslında, Math.maxherhangi bir bağlama ihtiyacı olmadığı için ilk parametreyi kullanmayacaktır. Yalnızca argümanlarda aldığı veriler üzerinde çalışır.
thefourtheye

1
@NiCkNewman Yorumlar bölümünde tartışılamayacak kadar geniş. Ancak bu makale thisiyi bir başlangıç ​​noktası olacaktır. Ayrıca bir bölümü var callveapply bunu detaylandırıyor.
thefourtheye

2
Şimdiye kadarki en iyi .apply () açıklaması!
Microcipcip

1
Neden null veya matematik?


17

Biri bana aşağıdaki kodun nasıl çalıştığını söyleyebilir mi?

Math.max.apply(Math,list)

İşlev uygulamasında (gövde) referans olarak kullanılacak ve argüman olarak iletilecek nesneye Math.maxsahip bir işlevi çağırır .Maththislist

Bu sonuçta eşittir

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

Null veya Math'ı geçersem işe yarıyor gibi görünüyor.

Açıkçası, Math.maxuygulama örnek değişkeni kullanmaz - bunu yapmak için bir neden yoktur. Yerel uygulama, yalnızca yineler argumentsve maksimum olanı bulur.

Tüm kullanıcı tanımlı / Yerel işlevlerin kullanabileceğimiz çağrı ve uygulama yöntemi var mı?

Evet, her fonksiyon kullanılarak çağrılabilir callveyaapply

Referanslar:


3

Şunu söyleyerek başlayacağım Math.max(...numbers)ve Function.prototype.apply()yalnızca görece az eleman içeren diziler için kullanılmalı. [...) ve dizi çok büyükse uygula başarısız olur veya yanlış sonucu döndürür

Math.max.apply(null | undefined | Math, numbers)aynıdır Math.max(...numbers)ben tavsiye ederim yani Math.max(...numbers)estetik nedenlerle.

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

Çok büyük bir sayısal dizide maksimum öğeyi bulmanız gerekiyorsa:Array.reduce() yöntemi kullanın .

Array.reduce() her bir değeri karşılaştırarak sayısal bir dizideki maksimum öğeyi bulmak için kullanılabilir:

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)

Sonuç:

Nispeten küçük Math.max(...numbers) sayısal dizi: çok büyük olan sayısal dizi kullanın: Array.reduce()yöntemi kullanın


1
JavaScriptCore motorunun sabit kodlu argüman sınırı 65536'dır, bu nedenle apply () kullanırken dizi boyutunuzun her zaman daha küçük olacağından emin olmalısınız.
Chaarmann

2

Math.max (değer1, değer2, ...)

Math.max(1, 2, 3); // Math.max([value1[, value2[, ...]]])
value1, value2...parametrelerdir ve Numbers MDN Math.max olmalıdır

Parametre arrayolarak geçemezsiniz Math.max. Bir diziyi geçmek için kullanmanız gerekir apply.

Uygulamak

Uygulamanın ilk parametresi this, ikincisi array. Matematik yöntemleri diğer dillerde statik ile eşdeğerdir, bu da onun aksine bir nesne örneğine ihtiyaç duymadığı anlamına gelir , bu durumda bu durumda array.prototype.slicegeçmenize gerek yoktur this.

Misal

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)

Bir diziyi parametre olarak geçirmek istediğinizde kullanmanız gerekir apply, aksi takdirde kullanın call.

a pply = a rray
c all = c omma ayrıldı
Çağrı ve uygula hakkında daha fazla bilgi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.