JavaScript'te Birden Çok Değişken Bildirme


334

JavaScript'te, aşağıdaki gibi birden çok değişken bildirmek mümkündür:

var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

... ya da bunun gibi:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;

Bir yöntem diğerinden daha iyi / daha hızlı mı?


6
Daha hızlı gelince , bu jsperf kullanarak bir yöntem veya diğerini kullanarak tutarlı bir hız kazancı göremedim.
Majid Fouladpour

Yanıtlar:


345

İlk yolun bakımı daha kolaydır. Her bildirim, tek bir satırdaki tek bir ifadedir, böylece bildirimleri kolayca ekleyebilir, kaldırabilir ve yeniden sıralayabilirsiniz.

İkinci yolla, varanahtar kelimeyi ve noktalı virgül içerdiklerinden ilk veya son bildirimi kaldırmak can sıkıcıdır . Ve her yeni bildirim eklediğinizde, eski satırdaki noktalı virgülün virgülle değiştirilmesi gerekir.


67
Daha sonra küçültmeyi veya paketlemeyi beklediğiniz kodu yazıyorsanız, ikinci yol kompresörlerin (YUI Kompresörü gibi) size daha küçük bir sürüm vermesini sağlar. Boyut göz önüne alındığında, JSLint'in önerilerini mümkün olduğunca takip etmenizi öneririm.
Şerit

36
jslint ikinci yolun daha doğru olduğunu iddia ediyor ama katılmıyorum.
ThatGuy

29
İkinci yol bir mikro optimizasyon. Tüm var bildirimleri teker teker değil, bir kerede işlenir. Modern tarayıcılarda / modern bilgisayarlarda bu kadar önemli değil.
webnesto

18
@ 0xc0de: Bir ifadedeki tüm değişkenleri "verimli" olarak bildirmenin kanıtını görmek istiyorum. Verimliliği sadece kaydedilen birkaç bayt nedeniyle ölçüyorsanız, belki de. Ancak, okunabilirliği ve sürdürülebilirliği hesaba katarsanız, özellikle modern tarayıcılar bir yürütme öncesi geçişte bir kapsamdaki tüm değişkenleri toplayıp başlatacağından, erken optimizasyonun genellikle yanlış bir yol olduğunu göreceksiniz. Şahsen, kodu daha hızlı ve daha fazla hataya eğilimli hale getirmek için değişkenlerin hepsinin tek bir satırda veya deyimde bildirildiğini görüyorum.
ogradyjd

9
Verimlilik ile ilgili olarak, hem uglifyjs hem de google kapatma derleyicisi otomatik olarak sıralı değişkenleri bir araya getirerek bu noktayı oluşturuyor (YUI'nin bunu yapmayacağını söyleyebildiğim kadarıyla kapsamlı bir şekilde test etmedim).
bhuber

215

Sürdürülebilirliğin yanı sıra, birinci yol kaza küresel değişken oluşturma olasılığını ortadan kaldırır:

(function () {
var variable1 = "Hello World!" // semicolon is missed out accidently
var variable2 = "Testing..."; // still a local variable
var variable3 = 42;
}());

İkinci yol daha az bağışlayıcı olsa da:

(function () {
var variable1 = "Hello World!" // comma is missed out accidently
    variable2 = "Testing...", // becomes a global variable
    variable3 = 42; // a global variable as well
}());

4
İyi bir nokta. Kısa iseniz, o zaman bu sorunun oluşmaması tek bir satırda yazma: var variable1 = "Hello World!", variable2 = "Testing...", variable3 = 42;. Bir kayıp ,çökecek, ama katılıyorum riskli
Aram Kocharyan

14
Katı modu kullanıyorsanız, yine de böyle küreseller oluşturamazsınız.
Danyal Aytekin

1
Tek bir satırda birden fazla değişken bildirme hayranıyım çünkü daha temiz görünüyor. Bununla birlikte, yanlışlıkla küresel değişkenleri beyan etmek gerçek bir tehlikedir. Hafıza sızıntılarını avlarken, birden fazla örneğe rastladım, çünkü bir anda virgül yerine noktalı virgül kullandım.
Mart'ta smabbott

+1 günün sadece yarısını harcadı ve hatta bu iki bildiri arasında neden belgelenmemiş bir fark olduğunu merak etmeye başladı. Sonra bu cevabı okuyun, kodu süper dikkatlice kontrol edin ve hatayı bulun. Gerek bir tatil ...
Giedrius

1
Metin düzenleyicim bana Possible Fatal Errorkoma özlüyorum, benim için yaşasın!

33

Kuruluş için kapsam başına bir varifade kullanmak yaygındır . Tüm "kapsamların" biçimi, kodu daha okunabilir hale getiren benzer bir modeli izler. Buna ek olarak, motor yine de hepsini "kaldırır". Dolayısıyla beyanlarınızı bir arada tutmak, aslında daha yakından olacakları taklit eder.


6
Aynı 'var' bildirimini paylaşmadan bildirimleri bir arada tutabilirsiniz. Jslint (bağlantınız) 'da verilen açıklamaları anlıyorum ve kabul ediyorum ama sonucu paylaşmıyorum. Yukarıda belirtildiği gibi, her şeyden daha fazla stil meselesidir. Java dünyasında (diğerleri arasında), okunabilirlik için tersi (satır başına bir bildirim) önerilir.
PhiLho

Daha okunabilir mi? İnsanların bunları bir satıra koymasının tek nedeni, bahsettiğiniz JS'ye özgü nedendir: JS, tüm bildirimleri en üste taşır. Eğer bunu yapmasaydı, hepimiz kullandığımız noktaya en yakın varyasyonlarımızı ilan ederdik.
Danyal Aytekin

@ vol7ron durum böyle değildir ve varifadenin büyük bir yanlış anlaşılmasıdır . tam tersi doğrudur. belgelere ve bu örneğe bakın
jackweirdy

@jackweirdy haklısınız ve eski tarayıcılarda durum, kötü uygulama veya hata vardı. O zamandan beri yorumumu sildim.
vol7ron

29

Bu şekilde yapılırken çok daha okunabilir:

var hey = 23;
var hi = 3;
var howdy 4;

Ancak bu şekilde daha az yer ve kod satırı alır:

var hey=23,hi=3,howdy=4;

Yer kazanmak için ideal olabilir, ancak JavaScript kompresörlerinin sizin için halletmesine izin verin.


15

Belki böyle

var variable1 = "hello world"
, variable2 = 2
, variable3 = "how are you doing"
, variable4 = 42;

İlk veya son değişkeni değiştirmenin dışında bakımı ve okunması kolaydır.


6
Genellikle, virgül ilk önce, noktalı virgül bu sorunu önlemek için yeni bir satıra gider. var değişken1 = "merhaba dünya" \ n, değişken2 = 2 \ n, değişken3 = "nasılsın" \ n, değişken4 = 42 \ n; \ n
BrianFreud

2
Bu Haskell sözdizimidir. Javascript bir şekilde tavsiye / yaygın uygulama olduğunu hissediyorum
shamanSK

14

Bu sadece kişisel bir tercih meselesi. Bu iki yol arasında, beyaz alanı çıkarırsanız ikinci formla kaydedilen birkaç bayt dışında bir fark yoktur.


İkincisi birkaç bayt tasarrufu sağlar.
Sophie Alpert

Ben Alpert: Nasıl anlıyorsunuz?
Josh Stodola

Boşluğu kaldırırsanız, 'var foo = "merhaba", bar = "dünya";' bildiri 'var foo = "merhaba"; var bar = "dünya";' Popüler bir siteniz varsa, JS'ye birkaç bayt kaydetmek yardımcı olabilir (değişken adlarını da en aza indirmek istersiniz, vb.)
Brian Campbell

Bu, kaydedilen baytları şu anda, özellikle JavaScript Closer Compiler'ın (sözde) basit modunun yükselmesi nedeniyle alakasız olarak görüyorum.
Bryan Field

1
@webnesto, sözdiziminin semantiği aynı olduğunda hiçbir zaman sözdiziminden performans gelmez. Kod hemen yürütülmez, ancak önce ayrıştırılır ve anlamsal analiz yapılır - bu, her iki bildirim stilinin de eşitlendiği yerdir.
Esailija

14

ECMAScript6, oldukça iyi çalışan yıkım ataması getirdi :

[a, b] = [1, 2] aeşit 1ve eşit bolacaktır 2.


soruyu cevaplamıyor, ancak açıklanan her iki yaklaşıma da daha iyi bir alternatif olabilir.
svarog

1
Uzun değişkenler listeniz varsa, yaklaşımınızın gerçekten geçerli olmadığını düşünüyorum. Hangi değerin hangi değişkenle ilişkili olduğunu ve ayrıca hatalardan korumanız olmadığını söylemek zor, bir diziden yanlışlıkla bir öğeyi kaldırabileceğiniz kötü birleştirme durumundadır. Örnek: let [aVar, bVar, cVar, xVar, yVar, zVar] = [10, 20, 30, 40, 50]; Yani, kişisel olarak tavsiye etmiyorum.
Kirill Reznikov

1
aynı değerlere sahip çok sayıda değişken ayarlamak istiyorsanız kullanışlı. Örneğin bir döngüde sıfıra sıfırlamak için kullanılır.
Nick

Evet! Aradığım şey buydu. Özellikle iki boyutlu bir çifti veya çok boyutlu değerleri tanımlamak, ancak dizileri tanımlamak istemiyorsanız.
Eugene Kardash

11
var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;

daha okunabilir:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;

Ama aynı şeyi yapıyorlar.


Daha az "dosya alanı" mı kullanır? Sanırım yapacak bazı açıklamanız var.
Josh Stodola

@JoshStodola bana aynı dosya alanına benziyor. Yana ziyade var<space>onun,<space><space><space><space>
WORMSS

@WORMSS var<space>veya var<tab>vs olmadığı sürece <tab>. Hala büyük ölçüde tartışmalı.
mpag

9

Kullanım ES6 bozma devir : Bu farklı değişkenleri, nesnelerden diziler değerleri, ya da özelliklerini paketinden çıkarır.

let [variable1 , variable2, variable3] = 
["Hello World!", "Testing...", 42];

console.log(variable1); // Hello World!
console.log(variable2); // Testing...
console.log(variable3); // 42


4
Özellikle 10 değişken atamanız gerekiyorsa, bu korkunç bir fikirdir.
Kirill Reznikov

7

Virgül için tek, ancak temel kullanımım bir for döngüsünde:

for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}

JavaScript'te bunun uygun olup olmadığını görmek için buraya gittim.

İşe yaradığını görse bile, n fonksiyonda yerel olup olmadığı sorusu kaldı.

Bu, n'nin yerel olduğunu doğrular:

a=[3,5,7,11];
(function l () { for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}}) ();
console.log(typeof n == "undefined" ?
  "as expected, n was local" : "oops, n was global");

Bir an için diller arasında geçiş yaparak emin değildim.


7

Her ikisi de geçerli olsa da, ikincisini kullanmak deneyimsiz geliştiricilerin her yere var ifadeleri yerleştirmesini ve kaldırma sorunlarına neden olmasını engeller. İşlev başına yalnızca bir değişken varsa, işlevin üst kısmında, kodun bir bütün olarak hata ayıklanması daha kolaydır. Bu, değişkenlerin bildirildiği satırların bazılarının sevebileceği kadar açık olmadığı anlamına gelebilir.

Eğer bir geliştiriciyi hissettikleri herhangi bir yere 'var' düşürmekten vazgeçmek anlamına gelirse, takas yapmaya değdiğini hissediyorum.

İnsanlar JSLint'den şikayet edebilirler, ben de yapıyorum, ancak birçoğu dil ile ilgili sorunları düzeltmeye değil, kodlayıcıların kötü alışkanlıklarını düzeltmeye ve dolayısıyla yazdıkları koddaki sorunları önlemeye yöneliktir. Bu nedenle:

"Blok kapsamı olan dillerde, genellikle değişkenlerin ilk kullanım yerinde bildirilmesi önerilir. Ancak JavaScript'in blok kapsamı olmadığından, bir işlevin tüm değişkenlerini işlevin üstünde bildirmek daha akıllıca olur. işlev başına tek bir var ifadesinin kullanılması önerilir. " - http://www.jslint.com/lint.html#scope


6

Bence bu kişisel tercih meselesi. Bunu şu şekilde yapmayı tercih ederim:

   var /* Vars */
            me = this, that = scope,
            temp, tempUri, tempUrl,
            videoId = getQueryString()["id"],
            host = location.protocol + '//' + location.host,
            baseUrl = "localhost",
            str = "Visit W3Schools",
            n = str.search(/w3schools/i),
            x = 5,
            y = 6,
            z = x + y
   /* End Vars */;

6

Tek deyim sürümünden (single var ) kaçınmanın bir diğer nedeni hata ayıklamadır. Atama satırlarının herhangi birinde bir istisna atılırsa , yığın izlemesi yalnızca bir satırı gösterir.

Virgül sözdizimi ile tanımlanmış 10 değişkeniniz varsa, hangisinin suçlu olduğunu doğrudan bilmenin bir yolu yoktur.

Bireysel ifade versiyonu bu belirsizlikten muzdarip değildir.


2

"Kuplaj Üzerine Uyum" kavramı sadece nesneler / modüller / fonksiyonlardan daha genel olarak uygulanabilir. Bu durumda da hizmet edebilir:

Önerilen ikinci OP, tüm değişkenleri aynı ifadeye bağladı, bu da satırlardan birini almayı ve bir şeyleri kırmadan başka bir yere taşımayı imkansız kılıyor (yüksek kuplaj). Verdiği ilk örnek, değişken atamaları birbirinden bağımsız hale getirir (düşük bağlantı).

"Düşük kuplaj genellikle iyi yapılandırılmış bir bilgisayar sisteminin ve iyi bir tasarımın bir işaretidir ve yüksek uyumla birleştirildiğinde yüksek okunabilirlik ve sürdürülebilirliğin genel hedeflerini destekler."

http://en.wikipedia.org/wiki/Coupling_(computer_programming)

İlkini seçin.


1
Bunun birleşme veya uyumla nasıl ilişkili olduğunu göremiyorum. Ayrıntılı düşünmek ister misiniz?
Edson Medina

Önerilen ikinci OP, tüm değişkenleri aynı ifadeye bağladı, bu da satırlardan birini almayı ve bir şeyleri kırmadan başka bir yere taşımayı imkansız kılıyor (yüksek kuplaj). Verdiği ilk örnek, değişken atamaları birbirinden bağımsız hale getirir (düşük bağlantı).
Magne

Bağlantı, kod satırları DEĞİL, farklı modüller / nesneler / fonksiyonlar arasındaki karşılıklı bağımlılık ile ilgilidir!
Edson Medina

1
Başlangıçta modüller hakkındaydı, evet, ama kavram daha genel olarak uygulanabilir, hatta nesneye / fonksiyonlara tanımınıza dahil olmanız bile.
Magne

2

Eski bir yazı, biliyorum, ancak Google çalışanlarına küçük bir perspektif ayrıntısı eklemek için:

Sürdürülebilirlik sorunu, bunun gibi küçük bir biçimlendirmeyle kolayca aşılabilir.

let
  my_var1 = 'foo',
  my_var2 = 'bar',
  my_var3 = 'baz'
;

Bu biçimlendirmeyi kesinlikle kişisel tercih meselesi olarak kullanıyorum. Tabii ki, tek bir bildirim için bu biçimi atlıyorum veya işleri basitçe hallediyor.


1

ES6'yı kullanmaya başlamadan önce, tek değişkenli deklarasyonla yaklaşımın ne iyi ne de kötü olduğuna inanıyorum (linterleriniz varsa ve 'use strict'gerçekten lezzet tercihi oldu. Ama şimdi benim için işler değişti. :

  1. Şimdi iki yeni değişkenimiz var ve varmodası geçmiş oldu. constGerçekten ihtiyacınız olana kadar her yerde kullanmak iyi bir uygulamadır let. Bu nedenle, kodunuz genellikle kodun ortasında atama içeren değişken bildirimler içerecektir ve blok kapsamı nedeniyle küçük değişiklikler durumunda değişkenleri bloklar arasında taşıyacaksınız. Bunu çok satırlı bildirimlerle yapmanın daha rahat olduğunu düşünüyorum.

  2. ES6 sözdizimi daha çeşitli hale geldi, yıkıcılar, şablon dizeleri, ok işlevleri ve isteğe bağlı varsayımlar aldık. Tüm bu özellikleri tek değişkenli beyanlarla yoğun bir şekilde kullandığınızda okunabilirlik acıyor.


0

Bence ilk yolu (çoklu değişkenler) en iyisi, aksi takdirde bence okumak zor olan (Nakavt kullanan bir uygulamadan) ile sonuçlanabilir:

    var categories = ko.observableArray(),
        keywordFilter = ko.observableArray(),
        omniFilter = ko.observable('').extend({ throttle: 300 }),
        filteredCategories = ko.computed(function () {
            var underlyingArray = categories();
            return ko.utils.arrayFilter(underlyingArray, function (n) {
                return n.FilteredSportCount() > 0;
            });
        }),
        favoriteSports = ko.computed(function () {
            var sports = ko.observableArray();
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        sports.push(a);
                    }
                });
            });
            return sports;
        }),
        toggleFavorite = function (sport, userId) {
            var isFavorite = sport.IsFavorite();

            var url = setfavouritesurl;

            var data = {
                userId: userId,
                sportId: sport.Id(),
                isFavourite: !isFavorite
            };

            var callback = function () {
                sport.IsFavorite(!isFavorite);
            };

            jQuery.support.cors = true;
            jQuery.ajax({
                url: url,
                type: "GET",
                data: data,
                success: callback
            });
        },
        hasfavoriteSports = ko.computed(function () {
            var result = false;
            ko.utils.arrayForEach(categories(), function (c) {
                ko.utils.arrayForEach(c.Sports(), function (a) {
                    if (a.IsFavorite()) {
                        result = true;
                    }
                });
            });
            return result;
        });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.