นิยามตัวแปร JavaScript: จุลภาคเทียบกับอัฒภาค


89

อะไรคือความแตกต่างและ / หรือข้อดีของการใช้เครื่องหมายจุลภาคเมื่อประกาศกลุ่มของตัวแปรแทนที่จะเป็นอัฒภาค

ตัวอย่างเช่น:

var foo = 'bar', bar = 'foo';

เทียบกับ

var foo = 'bar';
var bar = 'foo';

ฉันรู้ว่าหากคุณระบุvarคีย์เวิร์ดในตัวแปรแรกในตัวอย่างแรกมันจะยังคงอยู่ในตัวแปรทั้งหมดดังนั้นทั้งสองจึงให้ผลลัพธ์สุดท้ายที่เหมือนกันในเรื่องขอบเขต เป็นเพียงความชอบส่วนบุคคลหรือมีประโยชน์ด้านประสิทธิภาพที่จะทำในทางใดทางหนึ่ง?

คำตอบ:


73

ไม่มีประโยชน์ด้านประสิทธิภาพเป็นเพียงเรื่องของทางเลือกและสไตล์ส่วนตัว

เวอร์ชันแรกมีความกระชับมากขึ้น


อัปเดต:

ในแง่ของจำนวนข้อมูลที่ส่งผ่านสายแน่นอนว่าน้อยกว่านั้นดีกว่าอย่างไรก็ตามคุณจะต้องมีการvarประกาศที่ถูกลบออกจำนวนมากเพื่อที่จะได้เห็นผลกระทบที่แท้จริง

การลดขนาดได้รับการกล่าวถึงว่าเป็นสิ่งที่ตัวอย่างแรกจะช่วยในการลดขนาดที่ดีขึ้นอย่างไรก็ตามในขณะที่Daniel Vassalloชี้ให้เห็นในความคิดเห็นตัวย่อที่ดีจะทำสิ่งนั้นให้คุณโดยอัตโนมัติดังนั้นในแง่นั้นจะไม่มีผลกระทบใด ๆ


8
มีประโยชน์ด้านประสิทธิภาพเมื่อลดขนาดจาวาสคริปต์ของคุณ
Ryan Kinal

1
@Ryan Kinal - คุณเห็น minifying กล่าวถึงตรงไหนในคำถาม?
Oded

2
@Oded - การลดขนาดเป็นไปตามข้อกังวลด้านประสิทธิภาพ ดังนั้นหากสไตล์หนึ่งยืมตัวเองไปสู่การลดขนาดที่ดีขึ้นมันจะยืมตัวเองโดยอ้อมไปสู่ความกังวลด้านประสิทธิภาพ
STW


2
ใช่คุณถูก. ด้วยความอยากรู้อยากเห็นฉันจึงสร้างแบบทดสอบ ( jsperf.com/… ) ทำการทดสอบ5 ครั้งและได้รับคำตอบที่แตกต่างกัน 5 ข้อ อืมใช่ทั้งหมดนี้เป็นเรื่องของสไตล์และความชอบส่วนตัวไม่ใช่การแสดง
Derek Henderson

29

หลังจากอ่าน Crockford และอื่น ๆ ฉันเริ่มเชื่อมโยงตัวแปรของฉันด้วยเครื่องหมายจุลภาคเท่านั้น จากนั้นต่อมาฉันรู้สึกรำคาญกับโปรแกรมดีบัก Chrome DevTools ที่ไม่หยุดอยู่ที่การกำหนดตัวแปรด้วยเครื่องหมายจุลภาค สำหรับดีบักเกอร์นิยามตัวแปรที่ถูกผูกด้วยลูกน้ำคือคำสั่งเดียวในขณะที่คำสั่ง var หลายคำสั่งเป็นคำสั่งหลายคำสั่งที่ดีบักเกอร์สามารถหยุดได้ ดังนั้นฉันจึงเปลี่ยนจาก:

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

ถึง:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

ตอนนี้ฉันพบว่าตัวแปรที่สองสะอาดกว่ามากโดยไม่ต้องพูดถึงข้อดีของการแก้ปัญหาดีบักเกอร์

อาร์กิวเมนต์ "less code through the wire" ไม่โน้มน้าวใจเนื่องจากมี minifiers


1
ฉันได้สัมผัสกับสิ่งนี้ด้วยตัวเองจริงๆ โดยปกติฉันจะแยกการประกาศที่ฉันต้องการตรวจสอบบางอย่างและวางdebuggerในนั้นจากนั้นเพิ่มอีกรายการหนึ่งvarและใช้เครื่องหมายจุลภาคต่อไป จากนั้นเมื่อฉันทำแก้จุดบกพร่องฉันกลับไปและลบและพิเศษdebugger var
Collin Klopfenstein

7
ตัวแปรที่สองยังทำให้ประวัติคอมไพล์สะอาดขึ้น แทนที่จะต้องเปลี่ยนอัฒภาคต่อท้ายเป็นลูกน้ำก่อนที่จะเพิ่มตัวแปรอื่นหรือเสี่ยงต่อการสร้างตัวแปรส่วนกลางคุณเพียงแค่เพิ่มคำสั่ง var ที่สมบูรณ์
payne8

รูปแบบแรกสามารถทำให้คุณคิดว่า b หรือ c เป็นสากลอย่างผิดพลาด
garg10 พ.ค.

18

ฉันชอบvar-per-variableสัญกรณ์:

var a = 2
var b = 3

เนื่องจากcomma-instead-of-another-varสัญกรณ์อื่นมีข้อบกพร่องสามประการนี้:

1. ดูแลรักษายาก
พิจารณารหัสนี้:

var a = 1,
    b = mogrify(2),
    c = 3

แต่เดี๋ยวก่อน mogrify ทำอะไร? ลองพิมพ์ b เพื่อค้นหา:

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3

ทำลายสิ่งของ

2. อ่านยาก

ตัวแปรในการขอทานของสายสื่อสารอย่างชัดเจนว่าจะมีการเริ่มต้นตัวแปรใหม่

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3

อะไรนรกคือc = 3การทำมีใช่มั้ย?

3. ไม่สม่ำเสมอ

พิจารณาสิ่งนี้:

var a = 1,
    b = 2,
    c = 3

กับvar-per-variableทุกการประกาศทำตามโครงสร้างเดียวกัน ด้วยcomma-instead-of-another-varตัวแปรแรกจะถูกประกาศในลักษณะที่แตกต่างจากตัวแปรอื่น ๆ หากคุณตัดสินใจที่จะพูดว่าย้ายตัวแปรตัวแรกภายใน a for cycle คุณจะต้องเพิ่ม var ที่ตรงกลางของการประกาศ

นอกเหนือจากความชอบดูเหมือนว่าโครงการที่มีชื่อเสียงส่วนใหญ่จะใช้var-per-variableสัญกรณ์


สำหรับตัวอย่างของรูปแบบที่น่าเกลียดนี้ (ลูกน้ำ - แทนของอื่น - วาร์) ที่ทำให้คนอื่นสับสนดูstackoverflow.com/questions/37332155/…
Scott Weaver

7

ฉันเห็นด้วยกับผู้ตอบคำถามคนอื่น ๆ ว่านี่เป็นเรื่องของสไตล์ส่วนตัวเป็นหลัก แต่เพื่อนำความคิดเห็น "เผด็จการ" มาสู่การสนทนานี่คือสิ่งที่Douglas Crockfordกล่าวในเว็บไซต์ของเครื่องมือ JSLint ยอดนิยม :

แต่เนื่องจาก JavaScript ไม่มีขอบเขตการบล็อกจึงเป็นการดีกว่าที่จะประกาศตัวแปรของฟังก์ชันทั้งหมดที่ด้านบนของฟังก์ชัน ขอแนะนำให้ใช้คำสั่ง var เดียวต่อฟังก์ชัน สิ่งนี้สามารถบังคับใช้ได้กับonevarตัวเลือก


6
มันอาจจะเป็นที่น่าสังเกตว่า Mozilla Javascript (ผ่านletการสร้าง) จะมีขอบเขตบล็อก
BlackVegetable

3
@BlackVegetable letสามารถใช้ได้มากกว่า Mozilla JS ( ดูที่นี่ ) เป็นส่วนหนึ่งของข้อกำหนด ES6แต่เบราว์เซอร์ส่วนใหญ่ยังคงใช้งานคุณลักษณะของ ES6
mbomb007

3

ดังที่คนอื่น ๆ ตั้งข้อสังเกตว่ามันเป็นความชอบสไตล์ JSLintอาจบอกให้คุณมีเพียงหนึ่งรายการvarต่อฟังก์ชันเท่านั้น (หากคุณใช้ "Good Parts") ดังนั้นหากใช้ JSLint เพื่อตรวจสอบโค้ดของคุณ (ไม่ใช่ความคิดที่ไม่ดี IMHO) คุณจะใช้รูปแบบแรกมากกว่ารูปแบบหลัง

บนมืออื่น ๆ ที่ผู้เขียนเดียวกันดักลาส Crockfordกล่าวว่าจะนำตัวแปรแต่ละตัวในสายของตัวเองของเขาในการประชุมการเข้ารหัส ดังนั้นคุณอาจต้องการยกเลิกการเลือกvarช่องทำเครื่องหมาย"ทั้งหมดหนึ่งรายการต่อฟังก์ชัน" ใน JSLint หากคุณใช้ ;-)


1
เขาพูดถูก. แนะนำให้วางตัวแปรลงในบรรทัดแยกกันในภาษาส่วนใหญ่เนื่องจากโดยทั่วไปอัลกอริธึมการผสานการควบคุมแหล่งที่มาจะทำงานโดยการเปรียบเทียบแต่ละบรรทัดเป็นข้อความธรรมดา (ไม่ใช่คำศัพท์ภายในบรรทัด) หากคนสองคนแก้ไขฟังก์ชันเดียวกันการประกาศตัวแปรหลายตัวในบรรทัดเดียวกันแทบจะทำให้เกิดความขัดแย้งในการผสานในขณะที่บรรทัดที่แยกจากกันสามารถรวมกันได้โดยอัตโนมัติ (ไม่ว่าจะประกาศเป็นvarข้อความแยกต่างหากหรือผูกมัดด้วยเครื่องหมายจุลภาค)
Richard Dingwall

2

ฉันไม่คิดว่าจะมีความแตกต่างที่เห็นได้ชัดเจนเท่าที่ฉันกังวลมันเป็นแค่ความชอบส่วนตัว

ฉันเกลียดการประกาศ var หลายรายการดังนั้นฉันมักจะทำ:

var 
   one
  ,two
  ,three
  ,four
;

เนื่องจากสั้นกว่าและอ่านได้ง่ายกว่าจึงไม่มีvarเสียงรบกวนให้ดู


22
คำหลักใน "เนื้อหา" ถ้าฉันพบตัวอย่างนี้ในของเรามันจะกลายเป็นvar one, two, three four;อย่างรวดเร็ว การเพิ่มบรรทัดเพื่อประโยชน์ของบรรทัดใน Javascript อาจเป็นอันตรายได้ (ล่าม JS สามารถแทรกตัวเองได้ - ;หากคุณไม่คาดหวังสิ่งนี้คุณจะพบผลข้างเคียงอย่างรวดเร็วนอกจากนี้ยังนำจุด,บกพร่องของฉันด้วย , คีย์เวิร์ดได้รับข้อผิดพลาดบรรทัดของตัวเองฉัน, ;มันเองก็บั๊กฉันคุณจ่ายเงินทางไลน์หรือไม่
STW

8
@STW - คุณทำให้การแทรกอัฒภาคอัตโนมัติฟังดูเป็นเรื่องสุ่มขึ้นอยู่กับความชอบของแต่ละเบราว์เซอร์ แต่ในความเป็นจริงมันเกิดขึ้นตามกฎที่กำหนดไว้อย่างดีเท่านั้นและคุณไม่ต้องกังวลว่ามันอาจเกิดขึ้นใน กลางvarคำประกาศของคุณ (แม้ว่าฉันจะเห็นด้วยกับคุณเกี่ยวกับเครื่องหมายจุลภาคนำหน้าและเกี่ยวกับvarและอัฒภาคสุดท้ายอยู่ในบรรทัดของตัวเอง - ทั้งสามก็ทำให้ฉันผิดพลาดเช่นกัน)
nnnnnn

1
ฉันไม่คิดว่าสิ่งนี้จะตอบคำถามได้จริงๆเนื่องจากคำถามไม่เกี่ยวกับความชอบส่วนตัว
Keith Pinson

2

เนื่องจากฉันไม่เห็นการอ้างอิงใด ๆนี่คือลิงก์ไปยังข้อกำหนด ECMA-262 ซึ่งเป็นข้อมูลจำเพาะพื้นฐานสำหรับ JavaScript ไวยากรณ์จากหน้านั้นกล่าวว่า:

12.2 Variable Statement

Syntax

  VariableStatement :
    var VariableDeclarationList ;

  VariableDeclarationList :
    VariableDeclaration
    VariableDeclarationList , VariableDeclaration

  VariableDeclarationListNoIn :
    VariableDeclarationNoIn
    VariableDeclarationListNoIn , VariableDeclarationNoIn

  VariableDeclaration :
    Identifier Initialiseropt

  VariableDeclarationNoIn :
    Identifier InitialiserNoInopt

  Initialiser :
    = AssignmentExpression
  InitialiserNoIn :
    = AssignmentExpressionNoIn

สิ่งที่คุณจะได้จากสิ่งนี้คือการใช้ลูกน้ำหรือไม่ไม่สำคัญ ไม่ว่าจะด้วยวิธีใดก็จะถูกแยกวิเคราะห์เป็น a VariableDeclarationและได้รับการปฏิบัติเหมือนกันทุกประการ ไม่ควรมีความแตกต่างกับวิธีที่เอ็นจินสคริปต์ปฏิบัติต่อการประกาศทั้งสอง ความแตกต่างเพียงอย่างเดียวคือสิ่งที่กล่าวถึงในคำตอบอื่น ๆ - ประหยัดพื้นที่มากขึ้นและความแตกต่างที่วัดไม่ได้จริงในระยะเวลาที่ใช้ในการใช้ไวยากรณ์เพื่อค้นหาทั้งหมดVariableDeclarationsเมื่อรวบรวมสคริปต์


1

ครั้งแรกบันทึกอักขระไม่กี่ตัว - ดังนั้นจึงมีการประหยัดเพียงเล็กน้อยในแง่ของขนาดไฟล์ JS และการใช้แบนด์วิดท์ ครั้งเดียวที่จะกลายเป็นที่สังเกตได้ในกรณีที่รุนแรง


สิ่งนี้ถือว่าคุณไม่ได้ลดขนาดไฟล์ของคุณ - และอย่างจริงจังใครที่ไม่ย่อขนาดไฟล์ในทุกวันนี้?
Keith Pinson

1

ฉันชอบเวอร์ชันที่สองมากกว่า (แต่ละรุ่นมีของตัวเองvar) ฉันคิดว่าเป็นเพราะฉันมาจากพื้นหลัง C ++ ใน C ++ คุณสามารถประกาศตัวแปรได้เช่นเดียวกับที่คุณทำในตัวอย่างแรก แต่มีการขมวดคิ้ว (ซึ่งทำให้เกิดข้อผิดพลาดได้ง่ายเมื่อคุณพยายามสร้างพอยน์เตอร์ด้วยวิธีนั้น)


1
ประเด็นที่น่าสนใจ แต่ฉันไม่แน่ใจว่าสิ่งนี้ตอบคำถามว่าข้อดีและข้อเสียที่แท้จริงของไวยากรณ์JavaScriptนี้คืออะไร
Keith Pinson

1

หากคุณลดขนาดจาวาสคริปต์ของคุณมีประโยชน์มากพอสมควร:

var one, two, three, four;

กลายเป็น

var a, b, c, d;

ที่ไหนเป็น

var one;
var two;
var three;
var four;

กลายเป็น

var a;
var b;
var c;
var d;

นี่เป็นอีกสามกรณีvarที่สามารถเพิ่มขึ้นได้เมื่อเวลาผ่านไป

ดูชุดบทความ "A List Apart" "Better Javascript Minification" ตอนที่ 1และตอนที่ 2


6
minifiers ดีเช่น Google ปิดคอมไพเลอร์จะผสานงบ var เป็นหนึ่งในหลาย: img840.imageshack.us/img840/3601/closurecompilerservice.jpg ดังนั้นอาร์กิวเมนต์นี้จะเกิดขึ้นก็ต่อเมื่อคุณใช้ตัวย่อที่ฉลาดน้อยกว่า ... ซึ่งคุณไม่ควร :)
Daniel Vassallo

2
และหากคุณกำลัง gzipping การทำซ้ำvar s จะไม่เพิ่มขนาดไฟล์ gzipped อย่างเห็นได้ชัด (ถ้าฉันเข้าใจ gzipping อย่างถูกต้อง)
Paul D.Waite
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.