JavaScript-də artımlar ("++") və azalmalardan ("-") çəkməyin?

Jslint vasitəsi üçün məsləhətlərdən biri:

++ və -
++ (artım) və (azalan) operatorlar həddindən artıq hiylələri təşviq etmək üçün kömək edirlər. Onlar yalnız virüs və digər təhlükəsizlik təhdidlərini təmin edən səhv arxitektura üçün ikinci. Bu operatorların istifadəsini qadağan edən bir seçim var.

$foo[$bar++] kimi inşa etdiyini bilirəm ki, asanlıqla birbaşa səhvlər yarada bilər, amma yolumu daha yaxşı idarə etmək üçün necə while( a < 10 ) do { a++; } while( a < 10 ) do { a++; } və ya for (var i=0; i<10; i++) { } .

" ++ " Və " -- " sintaksisinə malik olmadığı və ya " ++ " və " -- " qarşısını almaq üçün digər məsələlər var və ya " ++ " və " -- " əldən verə bilərəm

333
09 июня '09 в 20:02 2009-06-09 20:02 artlung 09 iyun '09 'da saat 20:02' də təyin olundu. 2009-06-09 20:02
@ 17 cavab

Mənim fikrim həmişə + + və - müstəqil bir şəkildə istifadə etməkdir.

 i++; array[i] = foo; 

əvəzinə

 array[++i] = foo; 

Bundan kənara çıxan bir şey, bəzi proqramçıları şübhə ilə qarşılaya bilər və mənim fikrimcə, bu, yalnız dəyər deyil. Döngüler üçün, istisna artım operatorunun istifadəsinin idiomatik olması və buna görə də həmişə aydın olmasıdır.

376
09 июня '09 в 20:30 2009-06-09 20:30 Cavab cdmckay 09 iyun '09 saat 08:30 'da verilir 2009-06-09 20:30

Mən bu məsləhətlə açıq şəkildə utandım. Javascript kodonları ilə təcrübənin olmaması (algılanmış və ya faktiki) ilə daha çox ümumi olsa, mənim bir hissə təəccüblənir.

border=0

Bəzi nümunə kodlarında yalnız "hacked" birinin c ++ və günahsız bir səhvə yol verə biləcəyini görə bilirəm, amma təcrübəli bir mütəxəssisin niyə qarşısını ala biləcəyini anlamıram.

233
09 июня '09 в 20:07 2009-06-09 20:07 Cavab Jon B tərəfindən 09/09/09 tarixində 20:07 2009-06-09 20:07

C-də belə bir şey var:

 while (*a++ = *b++); 

bir simli kopyalamaq üçün bəlkə də bu, istinad edilən həddən artıq aldatmanın mənbəyidir.

Və həmişə nə məsələsidir

 ++i = i++; 

və ya

 i = i++ + ++i; 

Əslində bunu edirlər. Bəzi dillərdə müəyyənləşdirilir və başqalarına nə baş verəcəyini bilmir.

Bu nümunələrdə, for ++ 'yı genişləndirmək üçün istifadə edən loopdan daha çox bir şey var idi, düşünmürəm. Bəzi hallarda, bir foreach loop istifadə edərək və ya fərqli bir dövlət üçün yoxlayan loop istifadə edə bilərsiniz. Ancaq artımların qarşısını almaq üçün kodunuzu təhrif etmək gülüncdür.

68
09 июня '09 в 20:17 2009-06-09 20:17 Cavab Eclipse tərəfindən 09.06.2009 tarixində saat 20: 30-da verilir. 2009-06-09 20:17

JavaScript-nun "Yaxşı detallar" nı oxuduğunuzda, mənim üçün + + loquford dəyişdirilməsi i + = 1 (mənə mənə = me + 1) olduğunu görəcəksiniz. Bu olduqca təmiz və oxunaqlıdır və "kompleks" bir şeyə çevrilmək ehtimalı azdır.

Crockford, jsLint-də avtomatik artım və avtomatik aşkarlama qadağan etdi. Tövsiyə əməl etməyinizi və ya seçməyinizi seçirsiniz.

Mənim şəxsi qayğım avtosalonlarla və ya avtomatik aşkarlama ilə bir yerdə bir şey etməməkdir.

Mən sadə bir şəkildə istifadə etməyə davam etsəm, bu cür tamponun daşıması (ya da sərhədlərdən kənar bir dizi indeksi) almayacağam C-də yaş təcrübəsindən öyrəndim. Amma mən eyni ifadədə başqa şeylər etmək üçün "olduqca mürəkkəb" tətbiqə daxil olsam, bufer daşqalımı aldım.

Beləliklə, öz qaydalarım üçün + + cərimə forması kimi istifadə edirəm.

42
09 июня '09 в 20:34 2009-06-09 20:34 Cavab Nosredna tərəfindən 09 iyun 09: 09-da 20:34, 2009-06-09 20:34

Bir döngədə bu zərərsizdir, lakin tapşırıq bəyanında gözlənilməz nəticələrə səbəb ola bilər:

 var x = 5; var y = x++; // y is now 5 and x is 6 var z = ++x; // z is now 7 and x is 7 

Dəyişən və operator arasında bir boşluq da gözlənilməz nəticələrə səbəb ola bilər:

 a = b = c = 1; a ++ ; b -- ; c; console.log('a:', a, 'b:', b, 'c:', c) 

Yoxlama zamanı gözlənilməz bir nəticə bir problem ola bilər:

 var foobar = function(i){var count = count || i; return function(){return count++;}} baz = foobar(1); baz(); //1 baz(); //2 var alphabeta = function(i){var count = count || i; return function(){return ++count;}} omega = alphabeta(1); omega(); //2 omega(); //3 

Yeni xəttdən sonra avtomatik olaraq virgüllə başlayır:

 var foo = 1, bar = 2, baz = 3, alpha = 4, beta = 5, delta = alpha ++beta; //delta is 4, alpha is 4, beta is 6 

Əvvəlcədən artırma / artımla başlayan qarışıqlıq diaqnoz qoymaq üçün çox çətin olan təminat səhvlərinə səbəb ola bilər. Xoşbəxtlikdən, onlar da tamamilə lazımsızdırlar. Bir dəyişənə 1 əlavə etmək daha yaxşı yollar var.

Linklər

25
08 янв. Cavab Paul Sweatte Jan 08 tərəfindən verilir 2013-01-08 21:49 '13 at 9:49 PM 2013-01-08 21:49

Aşağıdakı kodu nəzərdən keçirin

  int a[10]; a[0] = 0; a[1] = 0; a[2] = 0; a[3] = 0; int i = 0; a[i++] = i++; a[i++] = i++; a[i++] = i++; 

Çünki i ++ iki dəfə işarəsi alır, exit (vs2005 hata ayıklayıcısından)

  [0] 0 int [1] 0 int [2] 2 int [3] 0 int [4] 4 int 

İndi aşağıdakı kodu nəzərdən keçirin:

  int a[10]; a[0] = 0; a[1] = 0; a[2] = 0; a[3] = 0; int i = 0; a[++i] = ++i; a[++i] = ++i; a[++i] = ++i; 

Qeyd edək ki, çıxış eynidır. İndi siz ++ mən və mən ++ eyni olduğunu düşünürsünüz. Onlar deyil

  [0] 0 int [1] 0 int [2] 2 int [3] 0 int [4] 4 int 

Nəhayət, bu kodu nəzərdən keçirin.

  int a[10]; a[0] = 0; a[1] = 0; a[2] = 0; a[3] = 0; int i = 0; a[++i] = i++; a[++i] = i++; a[++i] = i++; 

İndi çıxış:

  [0] 0 int [1] 1 int [2] 0 int [3] 3 int [4] 0 int [5] 5 int 

Beləliklə, onlar uyğun deyil, həm də qarışdırmaq daha az intuitiv davranışa gətirib çıxarır. C ++ növündəki dövrlər üçün düşünürəm, ancaq bir xəttdə və ya eyni talimatda neçə ++ simvol olduğunuza baxın

17
09 июня '09 в 20:30 2009-06-09 20:30 Cavab Eric tərəfindən 09 iyun 09: 09-da saat 20: 30-da verilir. 2009-06-09 20:30

Mənim fikrimcə, "açıq-aydın hər zaman örtülü olduğundan daha yaxşıdır". . Bir nöqtədə bu operatora y+ = x++ + ++y artımları ilə qarışdırıla bilər. Yaxşı bir proqramçı hər zaman kodu daha oxunaqlı edir.

16
26 апр. Sriram 26 apreldə cavab verdi 2011-04-26 16:26 '11 at 16:26 2011-04-26 16:26

Artım və azalma operatorlarının "pre" və "post" xarakteri onlara tanış olmayanlar üçün qarışıq ola bilər; Onların yollarından birini çətinləşdirə bilər.

16
09 июня '09 в 20:05 2009-06-09 20:05 Cavab Paul Sonier tərəfindən 09.06.2009 tarixində saat 20: 05-da verilir

+ + Və ya qaçmaq üçün ən əhəmiyyətli əsaslar operatorların eyni zamanda dəyərləri geri qaytarması və yan təsirlərə gətirib çıxarmasıdır ki, bu kod haqqında düşünmək çətindir.

Səmərəlilik üçün mən üstünlük verirəm:

  • + + i qayıtma dəyərindən istifadə etmədikdə (müvəqqəti olmayan)
  • Mən geri dönüş dəyərini istifadə edərkən ++ (boru kəməri olmadan)

Mən cənab Crockfordun pərəstişkarıyam, amma bu halda razı olmalıyam. ++i i+=1 və daha çox aydınlaşdıran üçün 25% daha az mətn.

13
07 марта '12 в 16:51 2012-03-07 16:51 Cavab Hans Malherbe tərəfindən 07 Mart 'da 4:51' də verildi. 2012-03-07 16:51

Bununla əlaqədar bir Douglas Crockford videoyu izləyirdim və artım və fərmanlardan faydalanmanın izahı

  • Keçmişdə digər dillərdə dizilərin sərhədlərini pozmaq və bütün pisliyə və pisliyə səbəb olmaq üçün istifadə edilmişdir
  • Hansı daha çaşqın və təcrübəsiz JS geliştiricileri, nə etdiyini tam olaraq bilmirlər.

Birincisi, JavaScript-də seriallar dinamik bir ölçüyə malikdir və buna görə də səhv etsəm, məni bağışla, sətrin sərhədlərini və bu üsulla JavaScript-də istifadə edilməməsi lazım olan məlumatlara giriş mümkün deyil.

İkincisi, biz kompleks şeylərdən çəkinməməliyikmi, əlbəttə ki, problem bu alətimizə aid deyildir, amma problem bu JavaScript işləyən iddia edənlərdir, lakin bu operatorların necə işlədiyini bilmirlər. ? Çox sadədir. ++ dəyərini verin, mənə cari dəyəri verin və ifadə əlavə edildikdən sonra, + + 'nin dəyəri mənə verməzdən əvvəl dəyəri artıracaq.

+ + + + + + B kimi ifadələr yuxarıda xatırlayarsanız, inkişaf etmək üçün sadədir.

 var a = 1, b = 1, c; c = a ++ + ++ b; // c = 1 + 2 = 3; // a = 2 (equals two after the expression is finished); // b = 2; 

Şübhəsiz ki, JS-in içərisindən bilən bir sıra varsa, kodunuzu oxumaq lazım olduğunu xatırladığınızı güman etsəniz, narahat olmayın. Əgər yoxsa, şərh et, fərqli yaz və s. Nə etmək lazımdır? Hesab edirəm ki, böyümək və azaldım xeyirxahdır, səhvlər yarada bilər və ya zəifliklər yarada bilər, bəlkə də tamaşaçıdan asılı olmayaraq daha az oxunandır.

Yeri gəlmişkən, mən Douglas Crocfordun hər hansı bir əfsanə olduğunu düşünürəm, amma hesab edirəm ki, o, layiq olmayan operatoru qorxutdu.

Mən səhv olsa da yaşayıram ...

13
27 сент. Cavab Stuart Wakefield tərəfindən verilib 27 Sentyabr. 2010-09-27 16:18 '10 'da 16:18' da 2010-09-27 16:18

Əlavə dəyərin sadə bir şəkildə geri qaytarılması ilə bir sıra digər nümunələrdən daha sadədir:

 function testIncrement1(x) { return x++; } function testIncrement2(x) { return ++x; } function testIncrement3(x) { return x += 1; } console.log(testIncrement1(0)); // 0 console.log(testIncrement2(0)); // 1 console.log(testIncrement3(0)); // 1 

Gördüyünüz kimi, bu bəyannamənin nəticəyə təsir etməsini istəyirsinizsə, qayıdış sonrası artım / azalma istifadə etməməlidir. Ancaq qaytarma artım / dekret ifadələrini "tutmaq" deyil:

 function closureIncrementTest() { var x = 0; function postIncrementX() { return x++; } var y = postIncrementX(); console.log(x); // 1 } 
9
18 сент. Evgeny Levin tərəfindən verilmiş cavab 18 sm. 2013-09-18 13:32 '13 at 13:32 2013-09-18 13:32

Programcılar istifadə etdiyin dilində səlahiyyətli olmalıdırlar; yaxşı istifadə edin; və yaxşı istifadə edin. Mən istifadə etdikləri dili süni şəkildə sarsıtmaq lazım olduğunu düşünmürəm. Təcrübə danışıram. Mən bir dəfə Cobol mağazasının yanındakı qapını işləyirdim, burada ELSE istifadə etmədilər, çünki çox çətin idi. Reductio adur absurd.

8
27 сент. user207421 tərəfindən verilmiş cavab 27 sentyabr 2010-09-27 16:27 '10 at 16:27 2010-09-27 16:27

Mövcud cavabların bəzilərində qeyd edildiyi kimi (xahiş edirəm ki, şərh edə bilməyəcəyəm) problem x ++ ++ x fərqli dəyərləri qiymətləndirir (artımdan sonra vs), bu açıq-aydın olmayan və çox təəccüblü ola bilər - bu dəyər istifadə olunur. cdmckay, bir artım operatorunun istifadəsinə icazə vermək məqsədəuyğun olduğunu göstərir, ancaq məsələn, qaytarma dəyəri istifadə edilmir. öz xəttinizdə. Mən də standart formanı bir forma içərisinə daxil edəcəyəm (ancaq istifadə olunmayan dəyəri qaytaran üçüncü ifadədə). Başqa bir nümunə deyə bilmərəm. Özüm yandırıldıqda, eyni dildə digər dillər üçün də məsləhət görürəm.

Mən bu çoxluğun bir çox JS proqramçılarının təcrübəsiz olması ilə bağlı olduğunu bəyanatla razılaşmıram. Bu, "çox ağıllı" proqramçılara xas yazı növüdür və əminəm ki, daha çox ənənəvi dillərdə və bu dillərdə fonları olan JS developers ilə daha çox yayılmışdır.

2
27 янв. Cavab verən Yan 27 yanvar 2011-01-27 09:53 '11 at 9:53 2011-01-27 09:53

Mənim təcrübəmdə + + mənə və ya mənə ++ heç bir qarışıqlıq yaratmadı. Operatordan istifadə edə biləcəyiniz dillərdə tədris olunan hər hansı bir məktəbə və ya kollecə öyrədən ən əsas dövrlər və dövrlər üçün vacibdir. Şəxsən mən özümdə ayrı bir xətt üzrə c ++ ilə müqayisədə daha yaxşı baxmaq və oxumaq üçün aşağı olan bir şey kimi görürəm.

2
22 июня '16 в 20:26 2016-06-22 20:26 Cavab burdz tərəfindən 22 İyun '16 saat 20:26 2016-06-22 20:26 'də verilir

Mənim 2cents iki hallarda onların qarşısını almaq lazımdır:

1) Bir çox xəttdə istifadə edilən bir dəyişən varsa və onu istifadə edən ilk bəyanatda (ya da sonuncu və ya daha da pis, ortada) artırırsınızsa / azaldarsınız:

 // It Java, but applies to Js too vi = list.get ( ++i ); vi1 = list.get ( i + 1 ) out.println ( "Processing values: " + vi + ", " + vi1 ) if ( i < list.size () - 1 ) ... 

Belə nümunələrdə asanlıqla dəyişənlərin avtomatik olaraq artırdığı və ya azaldığını və ya ilk ifadəni sildiklərini atlaya bilərsiniz. Başqa bir deyişlə, yalnız çox qısa bloklarda və ya dəyişən bir blokda yalnız bir neçə bağlanmış operator üçün istifadə olunduqda istifadə edin.

2) Çoxlu halda ++ və eyni ifadədə eyni ifadə ilə bağlıdır. Belə hallarda nə baş verdiyini yadda saxlamaq çox çətindir:

 result = ( ++x - --x ) * x++; 

İmtahanlar və peşə testləri yuxarıda göstərilən nümunələrdən soruşur və həqiqətən də bu suallara cavab verdim, onlardan biri haqqında sənədlər axtarırdıq, amma gerçək həyatda bir kod kodunu düşünmək üçün çox məcbur olmamalıdır.

2
30 сент. Cavab zakmck 30 sep verilir . 2016-09-30 13:40 '16 saat 13:40 'da 2016-09-30 13:40

Bilmirəm, bu onun düşüncəsinin bir hissəsidir, amma xeyli yazılı bir mineralizasiya proqramı istifadə edirsinizsə, x++ + y x+++y çevrilə bilər. Ancaq daha sonra, yazılı bir alət bütün növ xaoslara səbəb ola bilər.

2
06 авг. Cavabın cavabı 06 Avqust. 2009-08-06 00:46 '09 da 0:46 'da 2009-08-06 00:46

Fortran bir C kimi bir dil mi? Bu da nədir? + Nə də var .

  integer i, n, sum sum = 0 do 10 i = 1, n sum = sum + i write(*,*) 'i =', i write(*,*) 'sum =', sum 10 continue 

İndeks elementi hər dövrdə dil qaydalarının köməyi ilə hər dəfə artırılır. Değerini 1-dən başqa bir şeyə artırmaq istəyirsinizsə, məsələn, iki dəfə oxuyun, sözdizimi ...

  integer i do 20 i = 10, 1, -2 write(*,*) 'i =', i 20 continue 

Python C-kimi mi? İndeksin artırılması üçün ehtiyacları atlayaraq sıra və siyahı anlayışlarını və digər sintaksislərini istifadə edir:

 print range(10,1,-2) # prints [10,8.6.4.2] [x*x for x in range(1,10)] # returns [1,4,9,16 ... ] 

Beləliklə, tam olaraq iki alternativin bu əsas tədqiqatına əsaslanaraq, dil hazırlayanlar + + və - istifadə hallarını gözləyərək və alternativ sintaksis təmin edə bilərlər.

Fortran və Python ++ və + - olan prosessual dillərdən fərqli olaraq daha az mıknatıslı səhv olurmu? Mənə heç bir dəlil yoxdur.

Fortran və Python C-yə oxşar olduğunu iddia edirəm, çünki Fortran və ya Python'u 90% -ə çatdırmamaq niyyətini doğru bir şəkildə təsəvvür edə bilməyən C-də sərbəst heç kimlə tanış olmadım.

1
09 июня '09 в 20:14 2009-06-09 20:14 Cavab Thomas L Holaday tərəfindən 09 iyun '09 saat 20:14 'da verilmişdir 2009-06-09 20:14

tags ilə bağlı digər suallar və ya bir sual