هل يوجد عامل "دمج فارغ" في JavaScript؟
-
20-08-2019 - |
سؤال
هل يوجد عامل اندماج فارغ في 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
غير معرف:عندما لم يتم تعريف المتغير من قبل في الكود، وكما هو متوقع، فإنه لا يحتوي على أي قيمة.مثله:
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