سؤال

أعلم أنه في JavaScript يمكنك القيام به:

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";

حيث المتغير oneOrTheOther سوف يأخذ قيمة التعبير الأول إذا لم يكن كذلك null, undefined, ، أو false. في هذه الحالة يتم تعيينه لقيمة البيان الثاني.

ومع ذلك ، ماذا يفعل المتغير oneOrTheOther الحصول على تعيين عندما نستخدم المنطق والمشغل؟

var oneOrTheOther = someOtherVar && "some string";

ماذا سيحدث متى someOtherVar هل هو غير فادح؟
ماذا سيحدث متى someOtherVar هو زائف؟

ما عليك سوى تعلم JavaScript وأنا فضولي بشأن ما سيحدث مع المهمة بالتزامن مع المشغل.

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

المحلول

في الأساس ، المنطقية والمشغل (&&) ، سيعود قيمة المعامل الثاني إذا كان الأول هو الحقيقة, ، وسوف يعيد قيمة المعامل الأول إذا كان في حد ذاته فاسدي, ، فمثلا:

true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything";   // 0

لاحظ أن فاسدي القيم هي تلك التي تشتكي false عند استخدامها في السياق المنطقي ، هم null, undefined, 0, NaN, ، سلسلة فارغة ، وبالطبع false, ، أي شيء آخر يترافق معه true.

نصائح أخرى

&& يسمى أحيانا أ يحمي المشغل أو العامل.

variable = indicator && value

يمكن استخدامه لتعيين القيمة فقط إذا كان المؤشر هو الحقيقة.

اقتباس دوغلاس كروكفورد1:

ال && ينتج المشغل قيمة أول معامله إذا كان المعامل الأول هو falsy. وإلا فإنه ينتج قيمة المعامل الثاني.


1 دوغلاس كروكفورد: JavaScript: الأجزاء الجيدة - صفحة 16

مثال المبتدئين

إذا كنت تحاول الوصول إلى "user.name" ولكن هذا يحدث:

Uncaught TypeError: Cannot read property 'name' of undefined 

لا تخافوا. يمكنك حل هذا باستخدام && المشغل أو العامل في مهمة أو في كثير من الأحيان تسمى مشغل الحرس لأنه "الحراس" من الخطأ غير المحدد يحدث.

فيما يلي بعض الأمثلة التي قد تجدها غريبة ولكن استمر في القراءة كما هو موضح لاحقًا.

var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined

user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'

user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined

تفسير: في عملية الحرس ، يتم تقييم كل مصطلح من اليسار إلى اليمين في وقت واحد. إذا كانت القيمة التي تم تقييمها هي falsy ، فسيتوقف التقييم ثم يتم تعيين هذه القيمة. إذا تم الوصول إلى العنصر الأخير ، فسيتم تعيينه بعد ذلك سواء كان ذلك أم لا.

فاسدي يعني أنه أي واحد من هذه القيم undefined, false, 0, null, NaN, '' و الحقيقة فقط لا تعني فاسدي.

زر سهل لطريقة الحراسة

استخدم مشغل الحرس الجميل من Lodash للوصول إلى البيانات المتداخلة مثل ذلك:

// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');

لأنه يتعامل مع الأشياء && تحت الغطاء بينما تكون لطيفًا لاستخدامها بطريقة مريحة. LODASH _.get رمز المصدر

المكافأة: أو المشغل

المهمة الغريبة الأخرى المفيدة التي تستخدم عملية هي أو المشغل الذي يستخدم عادة للإضافات مثل SO:

this.myWidget = this.myWidget || (function() {
   // define widget
})();

الذي سيقوم فقط بتعيين جزء الكود إذا كان "this.mywidget" هو falsy. هذا مفيد لأنه يمكنك إعلان الكود في أي مكان وعدة مرات لا تهتم إذا تم تعيينه أو لم يسبق له مثيل ، مع العلم أنه سيتم تعيينه مرة واحدة فقط لأن الأشخاص الذين يستخدمون مكونًا إضافيًا قد يعلنون عن طريق الخطأ علامة SRC البرنامج النصي عدة مرات.

تفسير: يتم تقييم كل قيمة من من اليسار إلى اليمين ، واحد في وقت واحد. إذا كانت القيمة هي الحقيقة ، فإنها تتوقف عن التقييم وتعيين هذه القيمة ، وإلا ، تستمر في الاستمرار ، إذا تم الوصول إلى العنصر الأخير ، يتم تعيينه بغض النظر عما إذا كان ذلك عبارة عن شفرة أم لا.

ائتمان إضافي: الجمع بين && و || في مهمة

لديك الآن قوة في نهاية المطاف ويمكنك القيام بأشياء غريبة للغاية مثل هذا المثال الغريب للغاية لاستخدامه في palindrome.

function palindrome(s,i) {
 return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}

في العمق التفسير هنا: Palindrome تحقق في JavaScript

ترميز سعيد.

وفق ecmascript المشروح 5.1 القسم 11.11:

في حالة المنطق أو المشغل (||) ،

expr1 || إرجاع expr2 إرجاع expr1 إذا كان يمكن تحويله إلى True ؛ خلاف ذلك ، إرجاع expr2. وهكذا ، عند استخدامها مع القيم المنطقية ، || يعود صحيح إذا كان أي من المعامل صحيحًا ؛ إذا كان كلاهما كاذب ، يعود خطأ.

في المثال المحدد ،

var Oneortheother = SomeotherVar || "هذه ليست الروبوتات التي تبحث عنها ... تحرك على طول" ؛

ستكون النتيجة قيمة بعض الشيء.(يرجى الرجوع. صدق التعبير). إذا كان هذا خطأ ، فستكون النتيجة "هذه ليست الروبوتات التي تبحث عنها ... تحرك على طول" ؛

وفي حالة المنطق والمشغل (&&) ،

إرجاع expr1 إذا كان يمكن تحويله إلى خطأ ؛ خلاف ذلك ، إرجاع expr2. وبالتالي ، عند استخدامه مع القيم المنطقية ، وإرجاع صحيح إذا كانت كلتا المعاملتين صحيحة ؛ خلاف ذلك ، يعود خطأ.

في المثال المحدد ،

الحالة 1: عندما يكون Boolean (SomeotherVar) خطأ: فإنه يعيد قيمة SomeotherVar.

الحالة 2: عندما يكون Boolean (SomeotherVar) صحيحًا: يعود "هذه ليست الروبوتات التي تبحث عنها ... تحرك على طول".

لقد شاهدت && مفرطة في العمل هنا في بيانات المهمة. الاهتمام ذو شقين: 1) إن فحص "المؤشر" هو في بعض الأحيان وظيفة مع النفقات العامة التي لا يفسرها المطورون. 2) من السهل على Devs أن يراها مجرد فحص للسلامة ولا يعتبرون أنهم يعينون كاذبة لـ VAR. أحبهم أن يكون لديهم موقف آمن من النوع ، لذلك جعلتهم يغيرون هذا:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

الى هذا:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

لذلك يحصلون على عدد صحيح كما هو متوقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top