JavaScriptในตัวisNaNฟังก์ชั่นเป็น - ตามที่ควรจะคาดหวังโดยเริ่มต้น - เป็น "แบบไดนามิกประเภทผู้ประกอบการ" ดังนั้นค่าทั้งหมดที่ (ในระหว่างกระบวนการ DTC) อาจให้ผลลัพธ์จริงอย่างง่าย | false เช่น"", " ", " 000"
, ไม่สามารถเป็น NaN
หมายความว่าอาร์กิวเมนต์ที่ให้มาจะได้รับการแปลงเป็นครั้งแรกใน:
function isNaNDemo(arg){
var x = new Number(arg).valueOf();
return x != x;
}
คำอธิบาย:
ในบรรทัดบนสุดของร่างกายฟังก์ชั่นเราเป็น (คนแรก) พยายามที่จะแปลงอาร์กิวเมนต์เป็นวัตถุหมายเลข และ (สอง) ใช้ประกอบการจุดที่เรามี - เพื่อความสะดวกของเราเอง - ทันทีลอกออกดั้งเดิมมูลค่าของวัตถุที่สร้างขึ้น
ในบรรทัดที่สองเรากำลังรับค่าที่ได้จากขั้นตอนก่อนหน้าและข้อดีของความจริงที่ว่าNaNไม่เท่ากับสิ่งใดในเอกภพแม้แต่กับตัวเองเช่นNaN == NaN >> false
ในที่สุดเพื่อเปรียบเทียบ (สำหรับความไม่เท่าเทียมกัน) กับตัวเอง .
วิธีนี้การคืนค่าฟังก์ชันจะให้ผลเป็นจริงเฉพาะเมื่อและหากการคืนค่าอาร์กิวเมนต์ที่ให้มานั้นเป็นความพยายามที่ล้มเหลวในการแปลงเป็นวัตถุตัวเลขเช่นตัวเลขที่ไม่ได้เป็นตัวเลข เช่น NaN
isNaNstatic ()
อย่างไรก็ตามสำหรับผู้ประกอบการประเภทคงที่ - หากจำเป็นและเมื่อจำเป็น - เราสามารถเขียนฟังก์ชั่นที่ง่ายกว่าเช่น:
function isNaNstatic(x){
return x != x;
}
และหลีกเลี่ยง DTC ทั้งหมดเพื่อที่ว่าหากอาร์กิวเมนต์ไม่ได้เป็นหมายเลข NaN อย่างชัดเจนมันจะส่งคืนค่าเท็จ ดังนั้นทดสอบกับสิ่งต่อไปนี้:
isNaNStatic(" x"); // will return false
เพราะมันยังคงเป็นสตริง
อย่างไรก็ตาม:
เป็นความประสงค์เช่นisNaNStatic(1/"x"); // will of course return true.
isNaNStatic(NaN); >> true
แต่ไปในทางตรงกันข้ามisNaN
ที่isNaNStatic("NaN"); >> false
เพราะมัน (อาร์กิวเมนต์) เป็นสตริงธรรมดา
ps: รุ่นคงที่ของ isNaN จะมีประโยชน์มากในสถานการณ์การเข้ารหัสที่ทันสมัย และอาจเป็นหนึ่งในเหตุผลหลักที่ฉันใช้เวลาในการโพสต์ข้อความนี้
ความนับถือ.