ไม่มีใครพูดถึงศักยภาพNaN
ที่ฉันจะได้รับซึ่งเป็นสิ่งที่มีค่าเป็นโมฆะ ดังนั้นฉันคิดว่าฉันจะเพิ่มสองเซ็นต์ของฉัน
สำหรับรหัสที่ได้รับ:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
หากคุณต้องใช้||
โอเปอเรเตอร์คุณจะได้รับค่าที่ไม่เป็นค่าแรก:
var result = a || b || c || d || e || f; // result === 1
หากคุณใช้วิธีการรวมทั่วไปตามที่โพสต์ที่นี่คุณจะได้รับc
ซึ่งมีค่า:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
ทั้งคู่ดูเหมือนจะไม่ถูกต้องสำหรับฉัน ในโลกแห่งตรรกะรวมตัวเล็ก ๆ ของฉันซึ่งอาจแตกต่างไปจากโลกของคุณฉันคิดว่าไม่ได้กำหนดเป็นโมฆะและ NaN เพราะทั้งหมดคือ "โมฆะ - อิช" ดังนั้นฉันคาดว่าจะได้รับกลับd
(ศูนย์) จากวิธีการรวมตัวกัน
หากสมองของทุกคนทำงานเหมือนของฉันและคุณต้องการแยกNaN
ออกจากกันวิธีการนี้จะทำให้สำเร็จ:
function coalesce() {
var i, undefined, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg !== null && arg !== undefined
&& (typeof arg !== 'number' || arg.toString() !== 'NaN') ) {
return arg;
}
}
return null;
}
สำหรับผู้ที่ต้องการรหัสสั้นที่สุดและไม่ต้องกังวลเรื่องการขาดความชัดเจนคุณสามารถใช้สิ่งนี้ตามที่ @impinball แนะนำ สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่ว่า NaN นั้นไม่เท่ากับ NaN คุณสามารถอ่านเพิ่มเติมได้ที่นี่: ทำไม NaN ไม่เท่ากับ NaN
function coalesce() {
var i, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg != null && arg === arg ) { //arg === arg is false for NaN
return arg;
}
}
return null;
}
x ?? y
ขณะนี้ไวยากรณ์อยู่ในสถานะข้อเสนอ 1 - การรวม