Javascript จะกำหนดตัวแปรหลายตัวในบรรทัดเดียวได้อย่างไร?


109

กำลังอ่านเอกสารทางออนไลน์ฉันเริ่มสับสนว่าจะกำหนดตัวแปร JavaScript หลายตัวในบรรทัดเดียวได้อย่างไร

หากฉันต้องการย่อโค้ดต่อไปนี้ JavaScript "เข้มงวด" ที่เหมาะสมในการกำหนดตัวแปรจาวาสคริปต์หลายตัวในบรรทัดเดียวคืออะไร

var a = 0;
var b = 0;

ใช่ไหม:

var a = b = 0;

หรือ

var a = var b = 0; 

ฯลฯ ...


1
เพิ่มเติมเกี่ยวกับการมอบหมายงานหลายรายการ: การกำหนดตัวแปรทำงานอย่างไรใน JavaScript . ฉันพบว่ารูปแบบนี้มีประโยชน์ในการปิดเพื่อแสดงฟังก์ชันvar $cls = my.namespace.Foo = function(args){ ... }
คอนสตรัคเตอร์

ฉันสงสัยว่าทำไมคุณถึงต้องการย่อมันตั้งแต่แรก IMHO การประกาศและกำหนดตัวแปรหนึ่งตัวตามอีกตัวนั้นชัดเจนและเข้าใจง่ายกว่าสำหรับทุกคน
Henning

คำตอบ:


76

คุณต้องการใช้เครื่องหมายจุลภาคเพราะถ้าคุณใช้โครงสร้างการมอบหมายงานหลายส่วนคุณจะยิงตัวเองไปที่จุดใดจุดหนึ่ง

ตัวอย่างจะเป็น:

>>> var a = b = c = [];
>>> c.push(1)
[1]
>>> a
[1]

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

นอกจากนี้ยังมีข้อเสียในการมอบหมายงานหลายอย่างเนื่องจากตัวแปรรองกลายเป็นโลกและคุณไม่ต้องการรั่วไหลในเนมสเปซส่วนกลาง

(function() {  var a = global = 5 })();
alert(window.global) // 5

ขอแนะนำให้ใช้เครื่องหมายจุลภาคและควรเว้นวรรคจำนวนมากเพื่อให้สามารถอ่านได้:

var a = 5
  , b = 2
  , c = 3
  , d = {}
  , e = [];

2
นั่นเป็นปัญหาจริงๆในการกำหนดการอ้างอิงอาร์เรย์โดยทั่วไปไม่ใช่เฉพาะกับคำสั่งมอบหมายเป็นค่า
Matthew Flaschen

"ดังนั้นในขณะที่คุณสามารถใช้งานมือขวาได้หลายงานสำหรับสิ่งต่างๆเช่นตัวอักษรตัวเลข"
meder omuraliev

1
@meder เป็นปัญหากับการมอบหมายงานใด ๆ มือขวาไม่มีอะไรพิเศษ
Matthew Flaschen

ฉันหมายถึงงานมอบหมายโดยทั่วไป แก้ไขถ้อยคำ
meder omuraliev

2
สิ่งที่ควรคำนึงถึงในรูปแบบการมอบหมายงานหลายชุดนี้คือการมอบหมายงานที่ไม่ได้ประกาศใด ๆ ภายใต้โหมดเข้มงวด ES5 จะทำให้เกิดReferenceErrorข้อยกเว้น ... IMO ควรหลีกเลี่ยง ...
Christian C. Salvadó

71

เมื่อใช้ es6 หรือโหนดของ Javascript คุณสามารถทำสิ่งต่อไปนี้:

var [a,b,c,d] = [0,1,2,3]

และหากคุณต้องการพิมพ์ตัวแปรหลายตัวในบรรทัดเดียวอย่างง่ายดายเพียงทำสิ่งนี้:

console.log(a, b, c, d)

0 1 2 3

สิ่งนี้คล้ายกับคำตอบของ @alex gray ที่นี่ แต่ตัวอย่างนี้อยู่ใน Javascript แทนที่จะเป็น CoffeeScript

โปรดทราบว่าสิ่งนี้ใช้การกำหนดการทำลายอาร์เรย์ของ Javascript


3
ทำไมไม่ใช้console.log(a,b,c,d)ในกรณีนี้แทน? สั้นกว่าและให้ผลผลิตเท่ากัน
Josh Broadhurst

46

ไม่มีทางที่จะทำในบรรทัดเดียวโดยกำหนดให้เป็นมูลค่า

var a = b = 0;

ทำให้ b global วิธีที่ถูกต้อง (โดยไม่มีตัวแปรรั่วไหล) ยิ่งนานกว่าเล็กน้อย:

var a = 0, b = a;

ซึ่งมีประโยชน์ในกรณี:

var a = <someLargeExpressionHere>, b = a, c = a, d = a;

1
"ไม่มีวิธีใดที่จะใช้การกำหนดค่าเป็นค่าโดยไม่ต้องใช้ 0 ซ้ำ" - คุณหมายถึงอะไร?
palswim

29

ทำไมไม่ทำเป็นสองบรรทัด?

var a, b, c, d;    // All in the same scope
a = b = c = d = 1; // Set value to all.

เหตุผลคือการรักษาขอบเขตโลคัลในการประกาศตัวแปรเช่นนี้:

var a = b = c = d = 1;

จะนำไปสู่การประกาศโดยนัยของb, cและdขอบเขตหน้าต่าง


สิ่งนี้มีประโยชน์สำหรับฉันเพราะฉันประกาศตัวแปรหลายตัวล่วงหน้าในโปรแกรมของฉัน ตอนนี้แทนที่จะใช้มากกว่า 30 บรรทัดฉันสามารถใช้สองสามบรรทัดโดยไม่ต้องลดความสามารถในการอ่าน
Kalif Vaughn

11

นี่คือวิธีการใหม่ของ ES6 ในการประกาศตัวแปรหลายตัวในบรรทัดเดียว:

const person = { name: 'Prince', age: 22, id: 1 };

let {name, age, id} = person;

console.log(name);
console.log(age);
console.log(id);

* ชื่อตัวแปรและดัชนีวัตถุของคุณต้องเหมือนกัน


2
มันยาวกว่าคำถามของ OP เพราะเทียบเท่ากับlet { a, b } = { a: 0, b: 0 }.
Dan Dascalescu

5

โดยเฉพาะกับสิ่งที่ OP ถามหากคุณต้องการเริ่มต้นตัวแปร N ด้วยค่าเดียวกัน (เช่น0) คุณสามารถใช้การทำลายโครงสร้างอาร์เรย์และArray.fillเพื่อกำหนดให้กับตัวแปรอาร์เรย์ของ N 0s:

let [a, b, c, d] = Array(4).fill(0);

console.log(a, b, c, d);


0

โปรดทราบว่าคุณสามารถทำได้ด้วย Numbers และ Strings เท่านั้น

คุณทำได้ ...

var a, b, c; a = b = c = 0; //but why?

c++;
// c = 1, b = 0, a = 0;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.