سؤال

هل يوجد عامل اندماج فارغ في Javascript؟

على سبيل المثال، في C#، يمكنني القيام بذلك:

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

أفضل تقدير تقريبي يمكنني اكتشافه لـ Javascript هو استخدام العامل الشرطي:

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

وهو أمر رديء نوعًا ما IMHO.هل يمكنني أن أفعل ما هو أفضل؟

هل كانت مفيدة؟

المحلول

ووجافا سكريبت يعادل المشغل C # لاغية التحام (??) يستخدم منطقية OR (||):

var whatIWant = someString || "Cookies!";

وهناك حالات (توضيح أدناه) أن السلوك لن يتطابق مع C #، ولكن هذه هي طريقة مقتضب العامة للتعيين / القيم البديلة الافتراضي في جافا سكريبت.


توضيح

وبغض النظر عن نوع من المعامل الأول، إذا صب عليه إلى نتائج منطقية في 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"

نصائح أخرى

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 تتجمع، فإنه يقبل أي عدد من الحجج، وإرجاع فارغة إذا أيا منها لا يكون لها قيمة. انها تتصرف مثل C # ؟؟ مشغل بمعنى "" تعتبر، كاذبة، و0 NOT NULL، وبالتالي الاعتماد القيم كما الفعلية. إذا كنت تأتي من خلفية الصافية، وسيكون هذا الحل شعور أكثر طبيعية.

إذا || كبديل لل?? C # الصورة ليست جيدة بما فيه الكفاية في قضيتك، لأنه يبتلع السلاسل الفارغة والأصفار، يمكنك دائما إرسال ظيفة الخاصة بك:

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

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

نعم، قريبا. انظر اقتراح هنا و <لأ href = "https://github.com/tc39/ اقتراح nullish-التحام / قضايا / 29 "يختلط =" noreferrer "> حالة تنفيذ هنا .

ويبدو مثل هذا:

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

لم يذكر أحد هنا إمكانية ذلك 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;
}

وحاليا لا يوجد دعم، ولكن تعمل عملية JS-توحيد عليه: HTTPS: // جيثب كوم / tc39 /-اقتراح اختياري تسلسل

احذر من تعريف JavaScript المحدد لـ null.هناك تعريفان لكلمة "بلا قيمة" في جافا سكريبت.1.باطل:عندما يكون المتغير خاليًا، فهذا يعني أنه لا يحتوي على بيانات فيه، ولكن المتغير محدد بالفعل في الكود.مثله:

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

في مثل هذه الحالة، نوع المتغير الخاص بك هو في الواقع Object.قم بتجريبه.

window.alert(typeof myEmptyValue); // prints Object
  1. غير معرف:عندما لم يتم تعريف المتغير من قبل في الكود، وكما هو متوقع، فإنه لا يحتوي على أي قيمة.مثله:

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

في هذه الحالة، يكون نوع المتغير الخاص بك هو "غير محدد".

لاحظ أنه إذا استخدمت عامل مقارنة تحويل النوع (==)، فستعمل JavaScript بشكل متساوٍ لكلتا القيمتين الفارغتين.للتمييز بينهما، استخدم دائمًا عامل مقارنة النوع الصارم (===).

بعد قراءة توضيحك، توفر إجابة @Ates Goral كيفية تنفيذ نفس العملية التي تقوم بها في C# في JavaScript.

توفر إجابة @ Gumbo أفضل طريقة للتحقق من وجود قيمة فارغة؛ومع ذلك، من المهم ملاحظة الفرق في == عكس === في جافا سكريبت خصوصاً عندما يتعلق الأمر بقضايا التحقق من undefined و/أو null.

هناك مقالة جيدة حقًا حول الفرق بين فترتين هنا.في الأساس، فهم أنه إذا كنت تستخدم == بدلاً من ===, ، ستحاول JavaScript دمج القيم التي تقارنها وإرجاع نتيجة المقارنة بعد هذا التلاحم.

وJS هو الحصول على مشغل التحام اغية الآن! حاليا في المرحلة 3 الانتقال الى المرحلة 4، ياي! https://github.com/tc39/proposal-nullish-coalescing

والمثال في الاقتراح:

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top