Jshint: الانسحاب من `` الاستخدام المربك لـ '!'. ``

تم إنشاؤها على ١٣ فبراير ٢٠١٢  ·  41تعليقات  ·  مصدر: jshint/jshint

تمت إضافة هذا الفحص للإصدار رقم 211 ولكن لا توجد طريقة لإلغاء الاشتراك في هذا الاكتشاف. كما اقترح الملصق الأصلي لهذه المشكلة ، يجب تمكينها افتراضيًا ، ولكن مع تجاوز.

التعليق الأكثر فائدة

!! هي أسهل طريقة لتحويل "أي شيء" إلى "منطقي". +1 لإلغاء الاشتراك

ال 41 كومينتر

هل يمكن أن تعطينا مثال استخدام صالح ، من فضلك؟

https://github.com/jshint/jshint/issues/211#issuecomment -3942380

أنا أشعر بالفضول أيضًا بشأن استنشاق IE6.

إغلاق هذه التذكرة لأننا لم نحصل على أي مثال صالح للاستخدام. لا تتردد في إعادة فتحه لاحقًا.

يكون

if( !!a === !!b ){  

عينة صالحة (عمليات الطباعة إلى منطقي)؟
أجد هذا أكثر إيجازا من

if( (a && b) || (!a && !b) ) {

نعم هذا جيد.

لا تزال العينات من الإصدار رقم 211 صالحة ، أي "مربكة" أو حتى خطيرة.
لست متأكدًا مما إذا كان إلغاء الاشتراك هو الحل الأفضل ، أو إذا كان يجب اعتبار "!! x" صالحًا؟

إذا (! (mseq <= this.messages.length)) {رمي خطأ جديد ('غير صالح mseq:' + mseq) ؛ }

هذا سوف يرمي خطأ بشكل جيد عندما لا يكون mseq رقمًا كذلك إذا كان أكبر من هذه الرسائل.

أتيت هنا مع حالة استخدام مشابهة لـaxkibe. لن تكتشف الحالة المقلوبة كلاً من أخطاء النطاق والبيانات غير الصالحة في آنٍ واحد.

هذا لا يبدو لي ممارسة سيئة بالنظر إلى أن الكود الناتج يمكن قراءته ومباشر في نيته.

ميزة jshint القاتلة هي إلغاء الاشتراك ، على عكس crockford-ed-in.

من أجل الوضوح ، في اختبار الوحدة الخاص بنا ، أكدت على أنه تم تعريف الأصغر وآخرون على هذا النحو:

        greater: function(lhs, rhs) {
            if (!(lhs > rhs)) {
                fail(new AssertionError(repr(lhs) + ' not greater than ' + repr(rhs)));
            }
        },

        less: function(lhs, rhs) {
            if (!(lhs < rhs)) {
                fail(new AssertionError(repr(lhs) + ' not less than ' + repr(rhs)));
            }
        },

        greaterOrEqual: function(lhs, rhs) {
            if (!(lhs >= rhs)) {
                fail(new AssertionError(repr(lhs) + ' not greater than or equal to ' + repr(rhs)));
            }
        },

        lessOrEqual: function(lhs, rhs) {
            if (!(lhs <= rhs)) {
                fail(new AssertionError(repr(lhs) + ' not less than or equal to ' + repr(rhs)));
            }
        },

لقد كتبته بهذه الطريقة للتوضيح وسأكون ممتنًا لإلغاء هذا التحذير.

+1 من جانبي لإلغاء الاشتراك (تم اكتشافنا عند !!a == !!b ).

راجع للشغل ، يبدو أن هذا نسخة مكررة: https://github.com/jshint/jshint/issues/578

هذا خطأ وليس تحذير. من خلال تعليقات المستند على الالتزام الختامي ، يمكن تجاهل التحذيرات ، ولكن ليس الأخطاء.

إذن ما الذي يجب علي فعله بدلاً من إذا (! (event.which == ESCAPE_KEY)) {وفقًا لأفضل ممارساتك؟

لماذا قد تكتب ذلك؟

ما الخطأ في توضيح نية البرنامج؟

if (event.which !== ESCAPE_KEY) {...}

ليس الرمز الخاص بي ، لا أعرف النوايا. لقد وجدته في بعض lib ولم يكن jshint يتحقق من صحته بسبب ذلك.

لماذا تقوم بفحص كود مكتبة الطرف الثالث؟ أليس هذا من عمل المؤلف؟

سواء كان ذلك قبيحًا أم لا (a == b) ، يجب أن يكون هناك إلغاء الاشتراك ، أليس كذلك؟ اعتقدت أن فلسفة jshint هي توفير إلغاء الاشتراك لكل تحذير.

شخصيًا ، في حالة تأكيدات إطار الاختبار ، وجدت أنه من الواضح كتابة الشرط لمطابقة التأكيد:

function assertEqual(x, y) {
    if (!(x == y)) { ... }

function assertNotEqual(x, y) {
    if (!(x != y)) { ... }

function assertGreater(x, y) {
    if (!(x > y)) { ... }

ماذا عن هذا المثال؟

if ( !((end - start) % 2) ) // do stuff

يمكنني إنشاء متغير للاحتفاظ بهذه القيمة ، ولكن لماذا؟ بالنسبة لي ، لا يبدو هذا استخدامًا محيرًا لعامل NOT ، لذا لا ينبغي أن يؤدي إلى حدوث خطأ.

لماذا تحتاج إلى أن تكون "ذكيًا" هنا؟ ما الخطأ في مجرد كتابة ما تعنيه بالفعل؟ (a - b) % 2 === 0

إذا أراد شخص ما أن يكتب I patch ، فسأقوم بمراجعته بكل سرور لإدراجه ، لكن حتى ذلك الحين لا أريد قراءة تعليق آخر على هذا الموضوع. كلام أقل ، عمل أكثر. يمكننا مناقشة أي تصحيح يأتي بقدر ما يرغب المؤلف أو المساهمون والأطراف المهتمة.

لدي حالة استخدام. أسترد قيمة من قاعدة بيانات يجب أن تكون منطقية ، لكنها تعود إما '0' أو '1' . أقوم بإجراء التحويل باستخدام !!+val ، والذي يتحول إلى رقم ثم إلى منطقي ، ولكنه ينتج هذا التحذير jshint. لا تؤدي إضافة الأقواس إلى إسكات التحذير. لا يوجد تحذير مع !!val لكن هذا غير صحيح لأن '0' على عكس 0 صحيح. لقد انتهيت للتو من تعطيل W018 للسطر المعني.

+1 لإلغاء الاشتراك ، !!x هي حالة استخدام صالحة ومصطلح شائع للتحويل إلى منطقي كما

+1 لـ !!a === !!b

في الواقع ، يمكن استخدام !!x أي مكان للتحويل إلى منطقي ...

هل يمكن تمييزه على أنه بنية صالحة في jshint (بدون الحاجة إلى إلغاء الاشتراك) ،valueof؟

+1 لإلغاء الاشتراك

إنه لأمر رائع عندما تكون نتيجة Google الأولى لمشكلة مشكلة مغلقة بدون حل.

لكل # 780 ، يمكن تعطيل / تمكين هذا الخيار باستخدام /*jshint -W018 */ و /*jshint +W018 */ غير المشفر على الإطلاق

+1 لتعطيل أكثر غموضًا.

@ cjc343 شكرا.

يجب أن تكون هناك طريقة لإلغاء الاشتراك من .jshintrc أيضًا.

عندما يطلب شخص ما طريقة لإلغاء الاشتراك في شيء ما ، يعود الناس دائمًا بـ "ولكن لماذا قد ترغب في كتابة ذلك ، فهذا رمز سيء". لا يعد هذا أبدًا ردًا صالحًا على شخص يطلب إلغاء الاشتراك. إذا طلبوا إلغاء الاشتراك ، فإنهم يختلفون معك في أنه سيء ​​دائمًا بنسبة 100٪ ، وهذا كل شيء. من المفترض أن تساعدنا jshint ، لا تعترض طريقنا. يجب أن يكون كل شيء قابلاً للانسحاب. كل شيء على الاطلاق.

ما هو الحقل .jshintrc للسماح بالاستخدام المربك لـ ! ؟

على سبيل المثال ، ما يلي يعطيني تحذيرًا:

function even(n) {
  return !(n % 2)
}

+1 لإلغاء الاشتراك

هل يمكن أن تعطينا مثال استخدام صالح ، من فضلك؟

console.assert(!!prototype === !!object, 'invalid state', prototype, object);

+1. فيما يلي إحدى حالات الاستخدام الشائعة الخاصة بي:

// Note: points is an array, each having latitude and longitude
var dataset = {};
points.forEach(function(point){
    if (!(dataset.latMin<point.lat)) dataset.latMin = point.lat;
});

لاحظ أن !(dataset.latMin<point.lat) يختلف عن dataset.latMin>=point.lat عندما يكون LHS غير معرّف.

لاحظ أن! (dataset.latMin= point.lat عندما يكون LHS غير محدد.

أليس هذا محيرًا للفقير الذي يقرأ الشفرة؟

على أي حال ، تم دمج هذا في # 780 حيث لوحظ أنه يمكنك استخدام W018 لتعطيل هذا التحذير.

if (data === undefined || (!(data.length > 0))) 

يعتبر محيرا. كذلك

if (data === undefined || !(data.length > 0)) 

وات تفعل؟

هل حاولت

-if (data === undefined || !(data.length > 0)) 
+if (data === undefined || data.length <= 0) 

... على الرغم من أن اسم خاصية مثل length يجعلني أشك في أن data.length === 0 قد يكفي.

إنه ليس مكافئًا ، لأنه بالنسبة إلى كائن ليس مصفوفة بدون خاصية طول ، فإن الأمثلة تعطيها خطأ.
أدرك الآن أن هناك أيضًا سلاسل ذات خاصية "length" الافتراضية ، لذا قد أضطر إلى التحقق من النوع أولاً ، أيضًا --.-

Whether or not ** is ugly or not, there should be an opt-out, right?

نعم فعلا. لست متأكدًا من سبب مناقشة هذا الأمر.

!! هي أسهل طريقة لتحويل "أي شيء" إلى "منطقي". +1 لإلغاء الاشتراك

الحالة التي ما زلت أواجهها هي الرغبة في اختبار ما إذا كان هناك شيء ليس رقمًا موجبًا:
if (!(n > 0))
خلاف ذلك ، يحتاج المرء إلى كتابة شيء مثل:
if (typeof n != 'number' || isNaN(n) || n <= 0)

الحالة التي ما زلت أواجهها هي الرغبة في اختبار ما إذا كان هناك شيء ليس رقمًا موجبًا:
إذا (! (n> 0))
خلاف ذلك ، يحتاج المرء إلى كتابة شيء مثل:
إذا (typeof n! = 'number' || isNaN (n) || n <= 0)

هذا هو بالضبط سبب مجيئي إلى هنا أتساءل لماذا يمنعني jshint من كتابة الكود بالطريقة التي أريدها.

!(n > 0) و typeof n != 'number' || isNaN(n) || n <= 0 ليسا نفس الشيء:

var n = "1";
console.log(!(n > 0)); // false
console.log(typeof n != 'number' || isNaN(n) || n <= 0) // true

على أي حال ، يمكنك فقط استخدام -W018 لتعطيل التحذير

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات