Pertanyaan Math.min.apply (0, array) - mengapa?


Saya baru saja menggali beberapa kode JavaScript (Raphaël.js) dan menemukan baris berikut (diterjemahkan sedikit):

Math.min.apply(0, x)

dimana x adalah sebuah array. Kenapa kamu melakukan ini? Perilaku tampaknya "ambil min dari array x. "


32
2018-05-19 22:53


asal


Jawaban:


Saya menyadari jawabannya ketika saya memposting pertanyaan saya sendiri: Ini aku s cara paling ringkas untuk mengambil min array x di JavaScript. Argumen pertama sepenuhnya sewenang-wenang; Saya menemukan 0 membingungkan karena kode secara intuitif berarti "Ambil min 0 dan x," yang sama sekali tidak terjadi. Menggunakan objek Math lebih masuk akal untuk pembacaan manusia, tetapi penulis Raphael.js terobsesi dengan minification dan 0 adalah tiga byte lebih pendek.

Lihat http://ejohn.org/blog/fast-javascript-maxmin/

Untuk keterbacaan, saya sangat mendesak orang-orang untuk berhenti melakukan ini dan sebagai gantinya mendefinisikan fungsi sepanjang garis

function arrayMin(arr) { return Math.min.apply(Math, arr); };

31
2018-05-19 22:55



Alasannya adalah ini:

  • Masukan Anda x adalah sebuah array

  • Tanda tangan dari Math.min() tidak mengambil array, hanya argumen yang dipisahkan koma

  • Jika Anda menggunakan Function.prototype.call() itu akan memiliki tanda tangan yang hampir sama, kecuali argumen pertama adalah this konteks, yaitu siapa yang memanggil"

    • Contoh: Math.min.call(context, num1, num2, num3)
  • Itu context hanya masalah ketika Anda merujuk this di dalam fungsi itu, misalnya kebanyakan metode yang dapat Anda panggil di larik: Array.prototype.<method> akan mengacu pada this (larik ke kiri 'titik') di dalam metode.

  • Function.prototype.apply() sangat mirip dengan .call(), hanya saja daripada mengambil argumen yang dipisahkan koma, sekarang mengambil array setelah context.

    • Function.prototype.call(context, arg1, arg2, arg3)
    • Function.prototype.apply(context, [arg1, arg2, arg3]) 
  • Itu 0 atau null yang Anda masukkan sebagai argumen pertama hanyalah shifter tempat.


3
2018-03-19 22:50



Cara yang tepat dan tidak terlalu membingungkan untuk menyebut ini adalah: Math.min.apply (null, array)

Jika parameter tidak digunakan, atur ke null menjadikan kode lebih mudah dibaca daripada menyetelnya ke 0 atau Math

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply


1
2017-11-01 15:44



Berikut ini contoh di mana kita bisa mendapatkan offset zona waktu MAX dan MIN untuk tahun tertentu untuk zona waktu. Ini mengembalikan dua perubahan untuk tahun ke akun untuk DST dan ST. (mis. ST = 300 an DST = 360 untuk zona waktu yang dimaksud).

   var arr = [];
   for (var i = 0; i < 365; i++) {
       var d = new Date();
       d.setDate(i);
       var newoffset = d.getTimezoneOffset();
       arr.push(newoffset);
   }
   var DST = Math.min.apply(null, arr);
   var nonDST = Math.max.apply(null, arr);
   tw.local.stInt = DST
   tw.local.edInt = nonDST

0
2018-03-13 03:21