Jshint: Peringatan "Penggunaan ' yang membingungkan!'" salah

Dibuat pada 19 Des 2012  ·  12Komentar  ·  Sumber: jshint/jshint

Saat memproses kode ini:

Array.prototype.minus = function(other)
{
    "use strict";
    return this.filter(function(i)
    {
        return !(other.indexOf(i) > -1);
    });
};

JSHint mengeluh tentang penggunaan ! . Mengelilinginya dengan tanda kurung tidak membantu. Saya percaya ini adalah bug.

Proposal cannot reproduce or not an issue

Komentar yang paling membantu

Lihat komentar untuk cara menonaktifkan: /*jshint -W018 */ . (Saya segera mengaktifkan kembali setelah instance dengan /*jshint +W018 */ .)

Semua 12 komentar

Ini _not_ bug: akan lebih baik untuk menulis ekspresi yang sama dengan return other.indexOf(i) <= -1 , meskipun dalam kasus khusus ini mungkin lebih jelas hanya dengan return other.indexOf(i) === -1 .

Yang mengatakan, apakah mungkin JSHint juga memberikan tip tentang _how_ agar tidak membingungkan?

Sepakat. Jika Anda memberi tip agar tidak membingungkan, akan lebih jelas apa yang dimaksud dengan laporan ini.

Apakah peringatan itu telah dihapus sama sekali?
console.log(!!5); tidak memberikan peringatan apa pun kepada saya, meskipun saya mengharapkan pesan kesalahan

hg97,

Coba testcase yang saya sertakan dengan posting asli saya. Saya percaya penanganan khusus telah ditambahkan untuk !! tapi tidak !.

Berikut kegunaan dari ! yang menurut jshint membingungkan, tetapi tampaknya merupakan cara paling sederhana untuk menyelesaikan masalah:

var foo;
console.log(foo <= 7, !(foo > 7));
// false true

Saya benar-benar ingin dapat mengubah membingungkan! memeriksa, tetapi saya tidak melihat opsi untuk itu di dokumen.

Meskipun benar bahwa perbandingan dengan NaN selalu salah, saya masih menganggap !(foo > 7) membingungkan. Hanya membaca kodenya, tidak jelas (bagi saya) bahwa Anda bermaksud untuk memberikan setiap nilai non-numerik true . Saya mungkin akan secara eksplisit memeriksa nilai non-numerik yang diharapkan. foo == null || foo <= 7

Sering menggunakan hal-hal seperti if (something && !(foo % 16)) lebih dari if (something && (foo % 16 === 0)) . IMHO yang pertama jelas dan ringkas.

Lihat komentar untuk cara menonaktifkan: /*jshint -W018 */ . (Saya segera mengaktifkan kembali setelah instance dengan /*jshint +W018 */ .)

Bagi siapa saja yang membutuhkan solusi cepat tetapi valid. Tulis ulang ini:

if (!(somevariable > 0)) {
  something();
}

ke yang lebih eksplisit dan tidak lagi membingungkan:

// see https://github.com/jshint/jshint/issues/780
var my_condition = (somevariable > 0);
if (!my_condition) {
  something();
}

Mungkin ada situasi ketika Anda sedang terburu-buru dan tidak semua orang dapat melakukan inversi operasi logika dan benar-benar yakin bahwa mereka tidak melewatkan beberapa kasus di mana variabel memiliki nilai undefined atau null .

Juga kode ini bagus dan eksplisit dan tidak lagi membingungkan, jadi jshint benar-benar puas.

Anda ingin melakukan refactor tetapi tidak mengubah perilaku kode, yang mungkin ditulis oleh orang lain dan mungkin tidak tercakup oleh tes.

Btw /*jshint +W018 */ melempar kesalahan:
Opsi buruk: '+W018'.

/*jshint -W018 */ berfungsi.

Saya mencoba if (!+n) dan if (!(+n)) , tetapi jshint menunjukkan Confusing use of '!'.
Ingin bantuan.
jshint versi 2.9.1

Mengingat bahwa ada banyak solusi (termasuk API eksplisit untuk dinonaktifkan
peringatan-- /* jshint -W018 */ , saya rasa tidak ada tindakan lebih lanjut
diperlukan di sini.

Saya baru-baru ini diingatkan tentang masalah ini ketika berhadapan dengan beberapa kode d3js dan saya melihat ini:

    node.append("text")
        .attr("dy", "0.31em")
        /* warning next 2 lines */
        .attr("x", function(d) { return d.x < Math.PI === !d.children ? 6 : -6; })
        .attr("text-anchor", function(d) { return d.x < Math.PI === !d.children ? "start" : "end"; })
        .attr("transform", function(d) { return "rotate(" + (d.x < Math.PI ? d.x - Math.PI / 2 : d.x + Math.PI / 2) * 180 / Math.PI + ")"; })
        .text(function(d) {
            return document.comment_data.comment_dict[d.data.id].user;
        })
        .attr('id',function(d){return 'nodetext_'+d.data.id;}); //add an id to each nodetext for reference selection

Untuk sebagian besar saya setuju dengan @jugglinmike , namun dalam kasus seperti ini satu-satunya alternatif yang tersedia akan jauh lebih singkat:

        .attr("x", function(d) {return ((d.x < Math.PI && !d.children)||(d.x>=Math.PI && d.children)) ? 6 : -6;})
        .attr("text-anchor", function(d) { return ((d.x < Math.PI && !d.children)||(d.x>=Math.PI && d.children)) ? "start" : "end"; })
Apakah halaman ini membantu?
0 / 5 - 0 peringkat