Không ai đã đề cập ở đây tiềm năng NaN
, mà - đối với tôi - cũng là một giá trị null-ish. Vì vậy, tôi nghĩ rằng tôi sẽ thêm hai xu của mình.
Đối với mã đã cho:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Nếu bạn sử dụng ||
toán tử, bạn sẽ nhận được giá trị không sai đầu tiên:
var result = a || b || c || d || e || f; // result === 1
Nếu bạn sử dụng phương thức hợp nhất điển hình, như được đăng ở đây , bạn sẽ nhận được c
, có giá trị:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Cả hai điều này có vẻ đúng với tôi. Trong thế giới logic hợp nhất nhỏ bé của riêng tôi, có thể khác với thế giới của bạn, tôi coi không xác định, null và NaN là tất cả đều là "null-ish". Vì vậy, tôi mong đợi sẽ lấy lại d
(không) từ phương thức hợp nhất.
Nếu bộ não của bất cứ ai hoạt động như của tôi và bạn muốn loại trừ NaN
, thì phương pháp này sẽ thực hiện điều đó:
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;
}
Đối với những người muốn mã càng ngắn càng tốt và đừng ngại một chút thiếu rõ ràng, bạn cũng có thể sử dụng mã này theo đề xuất của @impinball. Điều này lợi dụng thực tế là NaN không bao giờ bằng NaN. Bạn có thể đọc thêm về điều đó ở đây: Tại sao NaN không bằng 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
Cú pháp hiện đang ở giai đoạn tình trạng 1 đề nghị - coalescing nullish