เหตุใด Math.min จึงทำงานกับอาร์เรย์องค์ประกอบเดียว


17

ตามMDN Math.min NaNยอมรับตัวเลขเท่านั้นและหากมีข้อโต้แย้งไม่ได้เป็นจำนวนก็จะกลับมา มันเป็นความจริงว่าถ้าเราผ่านอาร์เรย์มีหลายหมายเลขเราได้รับNaNเช่นนี้Math.min([1,2])แต่ถ้าเราใช้อาร์เรย์ที่มีเพียงหนึ่งหมายเลขจะกลับตัวเลขในอาร์เรย์เช่นในตัวอย่างนี้:Math.min Math.min([5])ใครบ้างมีความคิดว่าทำไมเราถึงเห็นพฤติกรรมที่ไม่มีเอกสารนี้


คำตอบ:


47

ตามMDN ยอมรับตัวเลขเท่านั้นและหากมีข้อโต้แย้งไม่ได้เป็นจำนวนก็จะกลับมาMath.minNaN

นั่นไม่ใช่สิ่งที่มันพูดว่า ( ตัวหนาเหมืองเน้น):

ถ้าอย่างน้อยหนึ่งของการขัดแย้งไม่สามารถแปลงNaNเป็นตัวเลขผลที่ได้คือ

การแปลงประเภท:

  • Math.minใช้ToNumberในการแปลงข้อโต้แย้ง
  • ToNumberใช้ToPrimitiveในการแปลงObjects (และArrays เป็นObjects)
  • ToPrimitive การใช้งาน toString
  • [5].toString()เป็น'5'ที่ได้รับกลับไปToPrimitiveซึ่งจะส่งกลับไปยังToNumberที่แยกมัน5และผลตอบแทนมันซึ่งมันเป็นอาร์กิวเมนต์ที่ถูกต้องเพราะมันไม่ได้เป็นMath.minNaN
  • [1, 2].toString(), OTOH คือ'1, 2'ซึ่งจะส่งกลับไปToPrimitiveที่ซึ่งส่งคืนไปToNumberที่ซึ่งแยกวิเคราะห์ได้NaNเนื่องจากไม่ใช่ตัวเลขที่ถูกต้อง ToNumberจากนั้นส่งผ่านNaNไปยังMath.minซึ่งจะส่งคืนNaNเนื่องจาก (ตามที่ MDN ระบุไว้) "หนึ่งในอาร์กิวเมนต์ของมันไม่สามารถแปลงเป็นตัวเลข" หรือ (ตามข้อมูลจำเพาะระบุไว้) "ถ้าค่าใด ๆ คือ NaN ผลลัพธ์จะเป็น NaN"

25
ข้อมูลจำเพาะ ECMAScript สามารถอ่านได้อย่างน่าประหลาดใจจริงๆฉันเพิ่งค้นพบ
Jörg W Mittag

3
ใช่. Number([1,2]);ผลน่าน แต่Number([1])ผล 1
Bhojendra Rauniyar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.