มีตัวดำเนินการ“ null coalescing” ใน JavaScript หรือไม่


1381

มีตัวดำเนินการรวมศูนย์ว่างใน Javascript หรือไม่

ตัวอย่างเช่นใน C # ฉันสามารถทำได้:

String someString = null;
var whatIWant = someString ?? "Cookies!";

การประมาณที่ดีที่สุดที่ฉันสามารถรู้ได้สำหรับ Javascript คือการใช้ตัวดำเนินการตามเงื่อนไข:

var someString = null;
var whatIWant = someString ? someString : 'Cookies!';

ซึ่งเป็น IMHO sorta icky ฉันทำได้ดีกว่าไหม


31
ทราบจาก 2018: x ?? yขณะนี้ไวยากรณ์อยู่ในสถานะข้อเสนอ 1 - การรวม
ศูนย์เป็นโมฆะ

2
ขณะนี้มีปลั๊กอิน Babelซึ่งรวมเอาไวยากรณ์ที่แน่นอนนี้
Jonathan Sudiaman

10
หมายเหตุจาก 2019: ตอนนี้เป็นสถานะด่าน 3 แล้ว!
Daniel Schaffer

3
หมายเหตุตั้งแต่มกราคม 2563: โอเปอเรเตอร์ coalescing ที่ว่างเปล่ามีอยู่ใน Firefox 72 แต่โอเปอเรเตอร์เสริมยังไม่
Kir Kanos

4
ผู้ประกอบการ nullish coalescing ( x ?? y) และผู้ประกอบการผูกมัดตัวเลือก ( user.address?.street) อยู่ในขณะนี้ทั้งสองเวที 4. นี่คือคำอธิบายที่ดีเกี่ยวกับสิ่งที่หมายถึง: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished
Mass Dot Net

คำตอบ:


2133

ปรับปรุง

JavaScript นี้รองรับการประกอบ nullish coalescing (??) มันจะส่งกลับตัวถูกดำเนินการทางด้านขวาของมันเมื่อตัวถูกดำเนินการทางด้านซ้ายมือเป็นnullหรือหรือundefinedมิฉะนั้นจะส่งกลับตัวถูกดำเนินการทางด้านซ้ายมือ

โปรดตรวจสอบความเข้ากันได้ก่อนใช้งาน


JavaScript เทียบเท่ากับโอเปอเรเตอร์การรวมกัน C # null ( ??) กำลังใช้ตรรกะ OR ( ||):

var whatIWant = someString || "Cookies!";

มีบางกรณี (อธิบายด้านล่าง) ว่าพฤติกรรมไม่ตรงกับของ C # แต่นี่เป็นวิธีทั่วไปสั้น ๆ ในการกำหนดค่าเริ่มต้น / ทางเลือกใน JavaScript


การอธิบาย

โดยไม่คำนึงถึงชนิดของตัวถูกดำเนินการแรกถ้าส่งไปยังบูลีนจะส่งผลfalseให้การกำหนดจะใช้ตัวถูกดำเนินการที่สอง ระวังทุกกรณีด้านล่าง:

alert(Boolean(null)); // false
alert(Boolean(undefined)); // false
alert(Boolean(0)); // false
alert(Boolean("")); // false
alert(Boolean("false")); // true -- gotcha! :)

หมายความว่า:

var whatIWant = null || new ShinyObject(); // is a new shiny object
var whatIWant = undefined || "well defined"; // is "well defined"
var whatIWant = 0 || 42; // is 42
var whatIWant = "" || "a million bucks"; // is "a million bucks"
var whatIWant = "false" || "no way"; // is "false"

48
สตริงเช่น "false", "undefined", "null", "0", "empty", "delete" ล้วนเป็นความจริงเนื่องจากเป็นสตริงที่ไม่ว่างเปล่า
บาง

4
สิ่งนี้จะต้องมีการชี้แจง "" ไม่เป็นโมฆะ แต่ถือว่าผิดพลาด ดังนั้นหากคุณกำลังตรวจสอบค่าว่างและมันเป็น "" จะไม่ผ่านการทดสอบนี้อย่างถูกต้อง
ScottKoon

99
สิ่งที่ควรทราบคือการ||ส่งคืนค่า "ความจริง" ครั้งแรกหรือ "เท็จ" ครั้งสุดท้าย (หากไม่มีใครสามารถประเมินผลได้จริง) และใช้&&งานได้ในทางกลับกัน: คืนค่าความจริงสุดท้ายหรือค่าเท็จแรก
Justin Johnson

19
FYI ให้กับทุกคนที่ยังคงใส่ใจสตริง 0 และว่างเปล่าที่ถูกประเมินเช่นเดียวกับค่า Null ถ้าคุณใช้ Constructor ของประเภทเพื่อประกาศ var whatIWant = new Number(0) || 42; // is Number {[[PrimitiveValue]]: 0} var whatIWant = new String("") || "a million bucks"; // is String {length: 0, [[PrimitiveValue]]: ""}
Kevin Heidt

5
@LuisAntonioPestana var value = myObj && myObj.property || ''จะถอยกลับไป''ถ้า myObj หรือ myObj.property นั้นเป็นเท็จ
Ates Goral

77
function coalesce() {
    var len = arguments.length;
    for (var i=0; i<len; i++) {
        if (arguments[i] !== null && arguments[i] !== undefined) {
            return arguments[i];
        }
    }
    return null;
}

var xyz = {};
xyz.val = coalesce(null, undefined, xyz.val, 5);

// xyz.val now contains 5

วิธีนี้ใช้งานได้เหมือนฟังก์ชั่นการรวมกันของ SQL มันรับจำนวนอาร์กิวเมนต์เท่าใดก็ได้และส่งคืนค่า null หากไม่มีค่าใด ๆ มันทำตัวเหมือน C # ?? โอเปอเรเตอร์ในแง่ที่ว่า "", เท็จและ 0 ถือเป็น NOT NULL ดังนั้นจึงนับเป็นค่าจริง หากคุณมาจากพื้นหลัง. net นี่จะเป็นวิธีแก้ปัญหาความรู้สึกที่เป็นธรรมชาติที่สุด



13
ขออภัยในความล่าช้าที่เพิ่มขึ้นเช่นนี้ แต่ฉันต้องการทราบถึงความครบถ้วนว่าโซลูชันนี้มีข้อแม้ว่าไม่มีการประเมินการลัดวงจร หากข้อโต้แย้งของคุณคือการเรียกใช้ฟังก์ชันพวกเขาทั้งหมดจะได้รับการประเมินโดยไม่คำนึงว่ามูลค่าของพวกเขาจะถูกส่งกลับซึ่งแตกต่างจากพฤติกรรมของผู้ประกอบการตรรกะหรือดังนั้นจึงเป็นที่น่าสังเกต
Haravikk

63

ใช่มันกำลังจะมาเร็ว ๆ นี้ ดูข้อเสนอที่นี่และสถานะการดำเนินงานที่นี่

ดูเหมือนว่านี้:

x ?? y

ตัวอย่าง

const response = {
  settings: {
    nullValue: null,
    height: 400,
    animationDuration: 0,
    headerText: '',
    showSplashScreen: false
  }
};

const undefinedValue = response.settings?.undefinedValue ?? 'some other default'; // result: 'some other default'
const nullValue = response.settings?.nullValue ?? 'some other default'; // result: 'some other default'
const headerText = response.settings?.headerText ?? 'Hello, world!'; // result: ''
const animationDuration = response.settings?.animationDuration ?? 300; // result: 0
const showSplashScreen = response.settings?.showSplashScreen ?? true; // result: false

2
ตอนนี้อยู่ในขั้นตอนที่ 3 และวางแผนไว้สำหรับ TypeScript ครั้งต่อไป github.com/microsoft/TypeScript/issues/26578
lautaro.dragan

1
ผู้ประกอบการ nullish coalescing ( x ?? y) และผู้ประกอบการผูกมัดตัวเลือก ( user.address?.street) อยู่ในขณะนี้ทั้งสองเวที 4. นี่คือคำอธิบายที่ดีเกี่ยวกับสิ่งที่หมายถึง: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished
Mass Dot Net

45

หาก||การแทนที่ C # ??ไม่ดีพอในกรณีของคุณเนื่องจากมันกลืนสตริงและศูนย์ว่างคุณสามารถเขียนฟังก์ชันของคุณเองได้เสมอ:

 function $N(value, ifnull) {
    if (value === null || value === undefined)
      return ifnull;
    return value;
 }

 var whatIWant = $N(someString, 'Cookies!');

1
alert (null || '') ยังคงแจ้งเตือนสตริงว่างเปล่าและฉันคิดว่าฉันชอบการแจ้งเตือน ('' | '' blah ') ที่แจ้งเตือน blah มากกว่าสตริงว่างเปล่า - ดีที่จะรู้ว่า! (+1)
Daniel Schaffer

1
ฉันคิดว่าฉันอาจต้องการกำหนดฟังก์ชั่นที่ส่งกลับfalseถ้า (อย่างเคร่งครัด) null / undefined และtrueอื่น ๆ - ใช้ที่มีตรรกะหรือ; มันสามารถอ่านได้มากกว่าฟังก์ชั่นซ้อนหลายสาย เช่นสามารถอ่านได้มากกว่า$N(a) || $N(b) || $N(c) || d $N($N($N(a, b), c), d)
บ๊อบ

วิธีแก้ปัญหาของ Brent Larsen นั้นเป็นเรื่องทั่วไปมากกว่า
Assimilater

if .. return .. else ... returnเป็นกรณีที่สมบูรณ์แบบสำหรับประกอบไปด้วย return (value === null || value === void 0) ? ifnull : value;
Alex McMillan

15

ไม่มีใครพูดถึงศักยภาพ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;
}

ปฏิบัติที่ดีที่สุด - ข้อโต้แย้งรักษาเป็นแถวเหมือนใช้ประโยชน์จากน่าน == น่าน (! typeof+ num.toString() === 'NaN'ซ้ำซ้อน) arguments[i]ร้านอาร์กิวเมนต์ปัจจุบันในตัวแปรแทน
Isiah Meadows

@impinball การแก้ไขที่คุณแนะนำไม่ทำงานมันจะคืนค่า NaN แทน 0 (ศูนย์) จากกรณีทดสอบของฉัน ฉันสามารถลบการ!== 'number'ตรวจสอบทางเทคนิคได้เนื่องจากฉันประเมินแล้วว่าไม่ใช่nullหรือundefinedแต่นี่เป็นข้อได้เปรียบที่ชัดเจนสำหรับทุกคนที่อ่านรหัสนี้และเงื่อนไขจะทำงานโดยไม่คำนึงถึงลำดับ คำแนะนำอื่น ๆ ของคุณทำรหัสสั้นลงเล็กน้อยดังนั้นฉันจะใช้รหัสเหล่านั้น
Kevin Nelson

2
@impinball ฉันพบข้อบกพร่องของคุณในการแก้ไขที่คุณแนะนำคุณทิ้งมันไว้arg !== argแต่คุณต้องการให้เป็นarg === arg... จากนั้นก็ใช้งานได้ อย่างไรก็ตามนั่นมีข้อเสียของการไม่ชัดเจนในสิ่งที่คุณกำลังทำ ... ต้องมีความคิดเห็นในรหัสเพื่อป้องกันการถูกลบออกโดยคนต่อไปที่จะผ่านรหัสและคิดว่าarg === argซ้ำซ้อน ... แต่ฉันจะใส่มันขึ้นมา อย่างไรก็ตาม.
Kevin Nelson

จับดี. และโดยวิธีนี้เป็นวิธีที่รวดเร็วในการตรวจสอบ NaN ที่ใช้ประโยชน์จากความจริง NaN! == NaN หากคุณต้องการคุณสามารถอธิบายได้ว่า
Isiah Meadows

1
ตรวจสอบว่า "ไม่ใช่ตัวเลข" สามารถแทนที่ด้วยฟังก์ชันในตัว: isNaN ()
Yury Kozlov

5

ระวังนิยาม JavaScript เฉพาะของ null มีคำจำกัดความสองคำสำหรับ "no value" ใน javascript 1. Null: เมื่อตัวแปรเป็นโมฆะมันหมายถึงไม่มีข้อมูลอยู่ แต่ตัวแปรนั้นถูกกำหนดไว้แล้วในโค้ด แบบนี้:

var myEmptyValue = 1;
myEmptyValue = null;
if ( myEmptyValue === null ) { window.alert('it is null'); }
// alerts

ในกรณีเช่นนี้ชนิดของตัวแปรของคุณคือวัตถุจริง ทดสอบมัน

window.alert(typeof myEmptyValue); // prints Object
  1. ไม่ได้กำหนด: เมื่อตัวแปรไม่ได้ถูกกำหนดมาก่อนในรหัสและตามที่คาดไว้มันไม่ได้มีค่าใด ๆ แบบนี้:

    if ( myUndefinedValue === undefined ) { window.alert('it is undefined'); }
    // alerts

หากกรณีดังกล่าวประเภทของตัวแปรของคุณคือ 'ไม่ได้กำหนด'

โปรดสังเกตว่าหากคุณใช้ตัวดำเนินการเปรียบเทียบการแปลงประเภท (==) JavaScript จะทำงานอย่างเท่าเทียมกันสำหรับค่าว่างทั้งสองนี้ หากต้องการแยกแยะระหว่างพวกเขาให้ใช้ตัวดำเนินการเปรียบเทียบแบบ จำกัด ประเภท (===) เสมอ


1
ที่จริงแล้ว null เป็นค่า มันเป็นค่าพิเศษของประเภทวัตถุ ตัวแปรที่ถูกตั้งค่าเป็น null หมายความว่ามันมีข้อมูลข้อมูลที่ถูกอ้างอิงไปยังวัตถุ null ตัวแปรสามารถกำหนดด้วยค่าไม่ได้กำหนดในรหัสของคุณ สิ่งนี้ไม่เหมือนกับตัวแปรที่ไม่ถูกประกาศ
Ates Goral

ความแตกต่างที่แท้จริงระหว่างตัวแปรที่มีการประกาศหรือไม่: alert (window.test) / * undefined * /; การแจ้งเตือน ("ทดสอบ" ในหน้าต่าง) / * false * /; window.test = ไม่ได้กำหนด; การแจ้งเตือน (window.test) / * * * * * * * * ไม่ได้กำหนด /; การแจ้งเตือน ("ทดสอบ" ในหน้าต่าง) / * true * /; สำหรับ (var p in window) {/ * p สามารถเป็น "test" * /}
Ates Goral

1
อย่างไรก็ตาม (ขัดแย้งเล็กน้อย) คุณสามารถกำหนดตัวแปรด้วยค่าที่ไม่ได้กำหนดvar u = undefined;
Serge

@AtesGoral re null ในขณะที่สิ่งที่คุณพูดเป็นความจริงโดยการประชุม "null" หมายถึง"ตัวตนของ (ประโยชน์) ข้อมูล" ดังนั้นจึงถือว่าเป็น "ไม่มีข้อมูล" และอย่าลืมว่านี่คือคำตอบสำหรับคำถามเกี่ยวกับ "ตัวดำเนินการรวมศูนย์ว่าง"; ในบริบทนี้ null จะถือว่าเป็น "ไม่มีข้อมูล" อย่างแน่นอน - ไม่ว่ามันจะถูกนำเสนอภายในอย่างไร
ToolmakerSteve

4

หลังจากอ่านคำชี้แจงของคุณคำตอบของ @Ates Goral จะให้วิธีการทำงานแบบเดียวกับที่คุณทำใน C # ใน JavaScript

@ คำตอบของ Gumbo ให้วิธีที่ดีที่สุดในการตรวจสอบ null; แต่มันเป็นสิ่งสำคัญที่จะต้องทราบความแตกต่างใน==เมื่อเทียบกับ===ใน JavaScript โดยเฉพาะอย่างยิ่งเมื่อมันมาถึงประเด็นของการตรวจสอบและundefined / หรือnull

มีบทความที่ดีมากเกี่ยวกับความแตกต่างในสองข้อตกลงเป็นที่นี่ โดยทั่วไปเข้าใจว่าหากคุณใช้==แทน===JavaScript จะพยายามรวมค่าที่คุณกำลังเปรียบเทียบและส่งคืนสิ่งที่ผลลัพธ์ของการเปรียบเทียบหลังจากการรวมกันนี้


สิ่งหนึ่งที่ทำให้ฉันเกี่ยวกับบทความนั้น (และ Jash) คือคุณสมบัติ window.hello ที่ไม่ได้กำหนดซึ่งกำลังถูกประเมินค่าเป็น null ด้วยเหตุผลบางประการ มันควรจะไม่ได้กำหนดแทน ลองใช้ Firefox คอนโซลข้อผิดพลาดและดูด้วยตัวคุณเอง
Ates Goral

3

โปรดทราบว่าการตอบสนองของcreate-react-appเครื่องมือโซ่สนับสนุนด้วย null coalescing ตั้งแต่เวอร์ชัน 3.3.0 (ปล่อย 2019/05/12) จากบันทึกประจำรุ่น:

ตัวเลือกการรวมสายโยงและ Nullish รวมตัวกัน

ตอนนี้เราสนับสนุนโอเปอเรเตอร์ที่เป็นตัวเลือกและการรวมตัวกันแบบ nullish!

// Optional chaining
a?.(); // undefined if `a` is null/undefined
b?.c; // undefined if `b` is null/undefined

// Nullish coalescing
undefined ?? 'some other default'; // result: 'some other default'
null ?? 'some other default'; // result: 'some other default'
'' ?? 'some other default'; // result: ''
0 ?? 300; // result: 0
false ?? true; // result: false

สิ่งนี้กล่าวว่าในกรณีที่คุณใช้create-react-app3.3.0+ คุณสามารถเริ่มใช้ตัวดำเนินการ null-coalesce ได้แล้วในแอป React


3

ใช่และข้อเสนอของมันคือด่าน 4ตอนนี้ ซึ่งหมายความว่าข้อเสนอพร้อมที่จะรวมไว้ในมาตรฐาน ECMAScript ที่เป็นทางการ คุณสามารถใช้งานได้แล้วใน Chrome, Edge และ Firefox เวอร์ชันเดสก์ท็อปล่าสุด แต่เราจะต้องรออีกสักครู่จนกว่าคุณลักษณะนี้จะมีความเสถียรของเบราว์เซอร์ข้าม

ลองดูตัวอย่างต่อไปนี้เพื่อสาธิตพฤติกรรมของมัน:

// note: this will work only if you're running latest versions of aforementioned browsers
const var1 = undefined;
const var2 = "fallback value";

const result = var1 ?? var2;
console.log(`Nullish coalescing results in: ${result}`);

ตัวอย่างก่อนหน้านี้เทียบเท่ากับ:

const var1 = undefined;
const var2 = "fallback value";

const result = (var1 !== null && var1 !== undefined) ?
    var1 :
    var2;
console.log(`Nullish coalescing results in: ${result}`);

โปรดทราบว่าการรวมกันแบบ nullishจะไม่คุกคามค่าที่ผิดพลาดอย่างที่||ผู้ให้บริการทำ (ตรวจสอบundefinedหรือตรวจสอบnullค่าเท่านั้น) ดังนั้นตัวอย่างต่อไปนี้จะทำหน้าที่ดังต่อไปนี้:

// note: this will work only if you're running latest versions of aforementioned browsers
const var1 = ""; // empty string
const var2 = "fallback value";

const result = var1 ?? var2;
console.log(`Nullish coalescing results in: ${result}`);


สำหรับผู้ใช้ typescript เริ่มต้นจากTypeScript 3.7คุณลักษณะนี้ยังมีอยู่ในขณะนี้


2

หวังว่าจะให้บริการใน Javascript เร็ว ๆ นี้เนื่องจากอยู่ในช่วงข้อเสนอตั้งแต่ เม.ย. 2563 คุณสามารถตรวจสอบสถานะที่นี่เพื่อความเข้ากันได้และการสนับสนุน - https://developer.mozilla.org/en-US/docs/Web/ JavaScript / อ้างอิง / ผู้ประกอบการ / Nullish_coalescing_operator

สำหรับคนที่ใช้ typescript, คุณสามารถใช้ประกอบการหลอมรวม nullishจาก typescript 3.7

จากเอกสาร -

คุณสามารถคิดว่าคุณลักษณะนี้ - ??ผู้ประกอบการ - เป็นวิธีการ“ตกกลับ” เป็นค่าเริ่มต้นได้เมื่อต้องรับมือกับหรือnull undefinedเมื่อเราเขียนโค้ดเช่น

let x = foo ?? bar();

นี่เป็นวิธีใหม่ในการบอกว่ามูลค่าfooจะถูกใช้เมื่อเป็น "ปัจจุบัน"; แต่เมื่อมันnullหรือundefinedคำนวณbar()ในสถานที่ของมัน


0

ตกลงคำตอบที่เหมาะสม

มันมีอยู่ใน JavaScript? ใช่. แต่. ปัจจุบันมีให้บริการตั้งแต่ปี2020-02-06ที่ด่าน3และยังไม่รองรับในทุกที่ ไปที่ลิงก์ใน URL ด้านล่างและไปที่ส่วนหัว "ข้อมูลจำเพาะ" และ "ความเข้ากันได้ของเบราว์เซอร์" เพื่อดูข้อมูลเพิ่มเติมว่าอยู่ที่ไหน

อ้างจาก: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator

ตัวดำเนินการรวมศูนย์ nullish (?) เป็นตัวดำเนินการเชิงตรรกะที่ส่งกลับตัวถูกดำเนินการทางด้านขวาของมันเมื่อตัวถูกดำเนินการทางด้านซ้ายเป็นโมฆะหรือไม่ได้กำหนดและมิฉะนั้นส่งคืนตัวถูกดำเนินการทางด้านซ้าย

ตรงกันข้ามกับตัวดำเนินการแบบลอจิคัล OR (||) ตัวถูกดำเนินการทางด้านซ้ายจะถูกส่งกลับหากเป็นค่าที่เป็นเท็จซึ่งไม่เป็นโมฆะหรือไม่ได้กำหนดไว้ กล่าวอีกนัยหนึ่งถ้าคุณใช้ || เพื่อให้ค่าเริ่มต้นบางอย่างแก่ตัวแปรฟูคุณอาจพบพฤติกรรมที่ไม่คาดคิดหากคุณพิจารณาค่าที่ผิดพลาดบางอย่างที่สามารถใช้งานได้ (เช่น '' หรือ 0) ดูตัวอย่างด้านล่างเพิ่มเติม

ต้องการตัวอย่างไหม ตามลิงค์ที่ฉันโพสต์มันมีทุกอย่าง



ลิงค์ MDN มีประโยชน์ แต่นี่เป็นคำตอบที่ซ้ำกัน คุณควรแสดงความคิดเห็นภายใต้คำตอบของวอฮ์นแทน
Chris

@Chris คำตอบของเขาไม่เพียงพอดังนั้นคำตอบของฉัน
Karl Morrison

0

ตอนนี้มันรองรับเบราว์เซอร์รุ่นใหญ่เช่น Chrome, Edge, Firefox, Safari และรุ่นอื่น ๆ ต่อไปนี้คือการเปรียบเทียบระหว่างตัวดำเนินการ null กับตัวดำเนินการ Nullish Coalescing

const response = {
        settings: {
            nullValue: null,
            height: 400,
            animationDuration: 0,
            headerText: '',
            showSplashScreen: false
        }
    };
    /* OR Operator */
    const undefinedValue = response.settings.undefinedValue || 'Default Value'; // 'Default Value'
    const nullValue = response.settings.nullValue || 'Default Value'; // 'Default Value'
    const headerText = response.settings.headerText || 'Hello, world!'; //  'Hello, world!'
    const animationDuration = response.settings.animationDuration || 300; //  300
    const showSplashScreen = response.settings.showSplashScreen || true; //  true
    /* Nullish Coalescing Operator */
    const undefinedValue = response.settings.undefinedValue ?? 'Default Value'; // 'Default Value'
    const nullValue = response.settings.nullValue ?? ''Default Value'; // 'Default Value'
    const headerText = response.settings.headerText ?? 'Hello, world!'; // ''
    const animationDuration = response.settings.animationDuration ?? 300; // 0
    const showSplashScreen = response.settings.showSplashScreen ?? true; //  false
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.