มีค่าคงที่ใน JavaScript หรือไม่


1132

มีวิธีใช้ค่าคงที่ในJavaScriptหรือไม่

หากไม่เป็นเช่นนั้นการปฏิบัติทั่วไปในการระบุตัวแปรที่ใช้เป็นค่าคงที่คืออะไร


35
Chromeอนุญาตให้คุณใช้คำสำคัญconstเพื่อใช้ค่าคงที่ const ASDF = "asdf"เช่น อย่างไรก็ตามเนื่องจากconstไม่รองรับเบราว์เซอร์หลายตัวฉันจึงมักจะvarประกาศด้วย
Jacksonkr

20
try{const thing=1091;}catch(e){var thing=1091;}โรงงาน
Derek 朕會功夫

13
ดีเร็ก: คุณลอง / จับไม่ได้ จำกัด ขอบเขตของสิ่งที่คุณกำลังประกาศในบล็อก try / catch หรือไม่ หากคุณไม่ได้กำหนดขอบเขตอย่างถูกต้องแล้วอะไรคือจุดของการระบุconstหรือvarเลย?
Coderer

8
@Coderer ในการนำไปใช้งานในปัจจุบันสิ่งนี้จะใช้ได้เหมือนconstมีขอบเขตเท่าvarกันและนั่นคือระดับฟังก์ชั่นไม่ใช่ระดับบล็อก หากคุณปฏิบัติตามมาตรฐาน ECMAScript ที่จะเกิดขึ้นแทนconstจะมีขอบเขตเดียวกับletซึ่งหมายความว่าจะไม่ทำงาน
แจสเปอร์

3
@Coderer ภาษาผิด ตัวแปรในจาวาสคริปต์เป็นขอบเขตของฟังก์ชั่น นี่ไม่ใช่ C.
doug65536

คำตอบ:


1018

ตั้งแต่ES2015 JavaScript มีแนวคิดconstดังนี้:

const MY_CONSTANT = "some-value";

นี้จะทำงานในสวยมากเบราว์เซอร์ทั้งหมดยกเว้น IE 8, 9 และ 10 บางคนอาจต้องเปิดใช้งานโหมดเข้มงวด

คุณสามารถใช้varกับข้อตกลงเช่น ALL_CAPS เพื่อแสดงว่าไม่ควรแก้ไขค่าบางอย่างหากคุณต้องการสนับสนุนเบราว์เซอร์รุ่นเก่าหรือทำงานกับรหัสเดิม:

var MY_CONSTANT = "some-value";

60
วิธีการเกี่ยวกับ const x = 24;
Zachary Scott

93
โปรดทราบว่าหากคุณไม่ต้องการความเข้ากันได้ข้ามเบราว์เซอร์ (หรือคุณเขียนโปรแกรมฝั่งเซิร์ฟเวอร์ใน Rhino หรือ Node.js) คุณสามารถใช้constคำหลักได้ ปัจจุบันรองรับเบราว์เซอร์ที่ทันสมัยทั้งหมดยกเว้น IE
ฮัสกี้

17
วันนี้ (3.5 ปีต่อมา) คุณสามารถใช้Object.definePropertyเพื่อสร้างคุณสมบัติแบบอ่านอย่างเดียวซึ่งไม่สามารถลบได้ สิ่งนี้ใช้ได้ในเบราว์เซอร์หลักทุกรุ่นปัจจุบัน (แต่ไม่ถูกต้องใน IE8 ) ดูคำตอบโดย @NotAName
Phrogz

12
@Amyth มันไม่ได้มีประโยชน์จริงๆ เป็นคู่มือสไตล์ที่เสนอโดยผู้ขายรายเดียว ตามจุดของ Husky ข้างต้นความเข้ากันได้ของ IE นั้นไม่เกี่ยวข้องทั้งหมดเมื่อเขียน JS ฝั่งเซิร์ฟเวอร์
aendrew

32
เนื่องจากคำตอบนี้ยังคงอยู่ในอันดับสูงโดย Google ในปี 2558 จึงควรกล่าวได้ว่าตอนนี้ล้าสมัยแล้ว constคำหลักในขณะนี้อย่างเป็นทางการส่วนหนึ่งของภาษาและการสนับสนุนจากทุกเบราว์เซอร์ ตาม statcounter.com constเพียงไม่กี่เปอร์เซ็นต์ของผู้ใช้อินเทอร์เน็ตยังคงใช้เบราว์เซอร์รุ่นเก่าที่ไม่ได้รับการสนับสนุน
อุโมงค์

310

คุณพยายามปกป้องตัวแปรจากการดัดแปลงหรือไม่? ถ้าเป็นเช่นนั้นคุณสามารถใช้รูปแบบโมดูล:

var CONFIG = (function() {
     var private = {
         'MY_CONST': '1',
         'ANOTHER_CONST': '2'
     };

     return {
        get: function(name) { return private[name]; }
    };
})();

alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.MY_CONST = '2';
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.private.MY_CONST = '2';                 // error
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

เมื่อใช้วิธีนี้จะไม่สามารถแก้ไขค่าได้ แต่คุณต้องใช้วิธี get () บน CONFIG :(

หากคุณไม่จำเป็นต้องปกป้องค่าตัวแปรอย่างเคร่งครัดให้ทำตามที่แนะนำและใช้หลักการของ CAPS ทั้งหมด


13
โปรดทราบว่าคุณสามารถส่งคืนฟังก์ชันสำหรับค่า CONFIG นั่นจะช่วยให้คุณประหยัดเวลาเรียกใช้ CONFIG.get () ตลอดเวลา
Mathew Byrne

4
วิธีการแก้ปัญหาสวย แต่สิ่งเหล่านี้ควรถูกห่อเป็นห้องสมุดเพื่อที่จะไม่นำมันไปใช้ใหม่ในโครงการใหม่
andrii

82
CONFIG.get = someNewFunctionThatBreaksTheCode... สรุปคุณไม่สามารถบังคับค่าคงที่ใน JS (โดยไม่มีคำหลัก const) สิ่งเดียวที่คุณทำได้คือ จำกัด การมองเห็น
Thomas Eding

28
ฉันเชื่อว่าprivateเป็นคำสงวนในอนาคตใน JavaScript ฉันจะไม่ใช้สิ่งนั้นหากฉันเป็นคุณ
Zaq

นี่เป็นรูปแบบรีจิสตรีด้วย

122

constคำหลักที่อยู่ในECMAScript 6 ร่างแต่ป่านนี้เพียงสนุกกับการรู้แค่หางอึ่งของการสนับสนุนเบราว์เซอร์: http://kangax.github.io/compat-table/es6/ ไวยากรณ์คือ:

const CONSTANT_NAME = 0;

13
หากคุณพยายามที่จะกำหนดค่าให้กับconstมันจะไม่โยนข้อผิดพลาดใด ๆ การมอบหมายล้มเหลวและค่าคงที่ยังคงมีค่าเดิม นี่เป็นข้อบกพร่องที่สำคัญของการออกแบบ IMHO แต่ตราบใดที่มีการกำหนดชื่อที่ชัดเจนและสอดคล้องกัน (เช่น ALL_CAPS ยอดนิยม) ฉันไม่คิดว่ามันจะทำให้เกิดความโศกเศร้ามากเกินไป
MatrixFrog

6
จับตาดูการสนับสนุนของเบราว์เซอร์ที่นี่: kangax.github.io/es5-compat-table/es6/#const
Mark McDonald

6
ที่ได้รับมอบหมาย @MatrixFrog 'use strict'จะยกข้อผิดพลาดกับ
sam

ฉันควรกำหนดค่าคงที่ด้วยALL CAPSหรือไม่
ลูอิส

1
@Tresdin มันเป็นหลักการตั้งชื่อทั่วไปเพื่อกำหนดค่าคงที่ในตัวพิมพ์ใหญ่ทั้งหมด ไม่มีอะไรในสเป็คภาษาบังคับ แต่มันไม่ใช่ความคิดที่ไม่ดี มันทำให้ชัดเจนว่าเจตนาของคุณคืออะไรดังนั้นจึงปรับปรุงการอ่านรหัส
Bill the Lizard

68
"use strict";

var constants = Object.freeze({
    "π": 3.141592653589793 ,
    "e": 2.718281828459045 ,
    "i": Math.sqrt(-1)
});

constants.π;        // -> 3.141592653589793
constants = 3;    // -> TypeError: Cannot assign to read only property 'π' …
constants.π;        // -> 3.141592653589793

delete constants.π; // -> TypeError: Unable to delete property.
constants.π;        // -> 3.141592653589793

ดูObject.freeze คุณสามารถใช้constถ้าคุณต้องการให้การconstantsอ้างอิงเป็นแบบอ่านอย่างเดียว


2
ควรกล่าวถึงสิ่งนี้ใช้งานได้กับ IE9 + kangax.github.io/compat-table/es5เท่านั้น
Cordle

ฉันจะถ้ามันไม่ได้มีการใช้งานไม่ถูกต้องi
Alnitak

หมายเหตุ: สิ่งนี้จะทำงานคล้ายกับการconstประกาศES6 เช่นคุณสมบัติไม่สามารถประกาศใหม่หรือกำหนดใหม่ แต่ถ้าเป็นประเภทข้อมูลobjectก็สามารถกลายพันธุ์ได้
le_m

สิ่งที่ฉันกำลังมองหา คุณสามารถใช้const constantsแทนvar constantsเพื่อป้องกันไม่ให้ตัวแปรถูกกำหนดใหม่
Jarett Millard

ดูเช่นแช่แข็งลึกสำหรับการแช่แข็งแบบเรียกซ้ำ
แซม

64

IE รองรับค่าคงที่ประเภทเช่น:

<script language="VBScript">
 Const IE_CONST = True
</script>
<script type="text/javascript">
 if (typeof TEST_CONST == 'undefined') {
    const IE_CONST = false;
 }
 alert(IE_CONST);
</script>

50
เด็กชายพูดเกี่ยวกับสิ่งที่ไม่ได้เบราว์เซอร์ . . ยัง +1 สำหรับการคิดนอกกรอบ
Tom

14
VBScript? นั่นอะไร? ;)
tybro0103

2
ฉันมักจะลงคะแนนสำหรับคำถามข้ามเบราว์เซอร์ทั่วไปที่เกี่ยวข้องกับคำตอบเฉพาะ IE เพราะฉันเกลียดคนที่คิดว่าการใช้งานจาวาสคริปต์ของ IE คือ 'ตัวหนึ่ง' และคนอื่น ๆ ก็ถูกเพิกเฉย ใครใช้ borwsers อื่น ๆ นอกเหนือจาก IE, btw
Ant

@Cooluhuru สคริปต์นี้ปรากฏขึ้นเพื่อจัดการทั้งเบราว์เซอร์ IE (ใช้ VBScript) และเบราว์เซอร์ที่ไม่ใช่ IE (ใช้ JavaScript const) คุณสามารถอธิบายสิ่งที่ผิดกับมันได้หรือไม่
Andrew Grimm

ฉันยังมีเวลายากที่จะยอมรับว่าค่าคงที่สามารถเปลี่ยนแปลงได้
Norbert Norbertson

59

ECMAScript 5 แนะนำObject.defineProperty:

Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });

มันรองรับทุกเบราว์เซอร์สมัยใหม่ (เช่นเดียวกับ IE ≥ 9)

ดูเพิ่มเติมที่: Object.defineProperty ใน ES5?


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

3
ฉันเพิ่งอ่านว่าการพยายามกำหนดให้กับคุณสมบัติด้วยwritable: false จะทำให้เกิดข้อผิดพลาดจริง ๆ ถ้ารหัสที่ทำการมอบหมายกำลังถูกตีความภายใต้โหมดเข้มงวดของ ECMAScript 5 เป็นอีกเหตุผลหนึ่งที่เขียน'use strict'รหัสของคุณ
คอรี Gross

6
คุณสามารถละเว้นจริงwritable: falseตั้งแต่ที่เป็นค่าเริ่มต้น
sam

24

ไม่ไม่โดยทั่วไป Firefox ใช้constแต่ฉันรู้ว่า IE ไม่ได้


@Johnชี้ไปที่การตั้งชื่อทั่วไปสำหรับ const ที่ใช้มานานหลายปีในภาษาอื่น ๆ ฉันไม่เห็นเหตุผลว่าทำไมคุณถึงใช้ไม่ได้ แน่นอนว่าไม่ได้หมายความว่าใครบางคนจะไม่เขียนทับค่าของตัวแปรอยู่ดี :)


11
อย่างที่ทุกคนรู้ถ้า IE ไม่ได้ใช้มันก็อาจไม่มีอยู่จริง
Josh Hinman

3
น่าเสียดายและพูดจริง - มันเป็นเรื่องจริง IE มีส่วนแบ่งการตลาดเป็นจำนวนมาก ถ้าฉันเป็นเจ้าของธุรกิจและมีเว็บแอปพลิเคชันที่ใช้ภายในฉันจะสร้างมาตรฐานให้กับ FF ฉันไม่รู้ว่าทำไมคนจำนวนมากสนใจเกี่ยวกับ IE มันระเบิด
35432 Jason

@ Rich: ใครบอกว่าความเห็นของฉันเป็นจริง คุณทำสมมติฐานค่อนข้างมาก นอกจากนี้เท่าที่ฉันกังวลความจริงที่ว่า IE ดูดเป็นจริง คุณสามารถมีข้อเท็จจริงของตัวเองฉันไม่ได้บอกว่าคุณต้องเชื่อฉัน : P ใช้ Xanax หรือบางสิ่งบางอย่าง ...
เจสันตอม่อ

@ Rich B ใช่แล้วนั่นเป็นเพียงความคิดเห็นที่โง่ที่จะทำและเชื่อใจฉันฉันจะรู้ว่าฉันให้ความคิดเห็นที่เป็นใบ้มากมาย @ Jason B. - น่าสนใจฉันพบปัญหานี้เมื่อคืนนี้ .. const ทำงานใน FF แต่ไม่ใช่ IE ขอบคุณสำหรับการชี้แจง

ใครสนใจ IE? ฉันไม่! FF หรือ Chrome หรือ Opera ฯลฯ ... สามารถติดตั้งได้เกือบทุกแพลตฟอร์ม ผู้ค้าปลีกคอมพิวเตอร์มักจะรู้ว่าเวอร์ชั่นเก่าของ IE นั้นติดตั้งบ่อยดังนั้น (หรือทุกครั้ง) ติดตั้งเบราว์เซอร์สำรองก่อนขายคอมพิวเตอร์ ดังนั้นฉันจึงตัดสินใจให้แอพที่พัฒนาแล้วของฉันไม่สนใจเลยเกี่ยวกับเบราว์เซอร์ที่เข้ากันไม่ได้: หากนักพัฒนาเบราว์เซอร์ใส่ใจกับมาตรฐานของผลิตภัณฑ์ที่พวกเขาสามารถใช้แอพของฉันได้ถ้าไม่ใช่ผู้ใช้จะใช้เบราว์เซอร์อื่น ... -) แต่ Microsoft สามารถใช้ชีวิตเป็นส่วนหนึ่งของตลาดได้หรือไม่ ไม่พวกเขาทำไม่ได้ "พวกเขา" จะเปลี่ยนการเมือง dev ของพวกเขา!
willka wonka

20

ใน JavaScript การตั้งค่าของฉันคือการใช้ฟังก์ชั่นเพื่อคืนค่าคงที่

function MY_CONSTANT() {
   return "some-value";
}


alert(MY_CONSTANT());

6
มีค่าชี้ให้เห็นว่าสิ่งนี้ตกอยู่ในปัญหาเดียวกันที่กล่าวถึงใน @Burkes ตอบ (ความคิดเห็น @trinithis ') `MY_CONSTANT = function () {return" some-other-value "; } ทำลายมัน +1 แม้ว่าโซลูชันที่ดีและรวดเร็ว
แพทริคเอ็ม

13
-1 สิ่งนี้ไม่มีประโยชน์ใด ๆ กับ var SOME_NAME = value (ยังไม่แน่นอน) เป็นโค้ดเพิ่มเติมและต้องอธิบาย
mikemaccana

@PatrickM ในขณะที่มันเป็นความจริงที่คุณสามารถแก้ไขค่าคงที่แบบหลอกในภาษาอื่นเช่น C ซึ่งคุณไม่ควรแก้ไขค่าคงที่คุณยังสามารถทำได้ผ่านตัวชี้ ดังนั้นตราบใดที่คุณใช้วิธีการบางอย่างซึ่งอย่างน้อยก็แนะนำว่ามันคงที่มันก็ดี
rev

20

Mozillas MDN เว็บเอกสารconstประกอบด้วยตัวอย่างที่ดีและคำอธิบายเกี่ยวกับ ข้อความที่ตัดตอนมา:

// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;

// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;

แต่มันก็เป็นเรื่องน่าเศร้าที่ IE9 / 10 constยังคงไม่ได้รับการสนับสนุน และเหตุผลที่มันไร้สาระ :

ดังนั้น IE9 กำลังทำอะไรกับ const? จนถึงตอนนี้การตัดสินใจของเราคือไม่สนับสนุน มันยังไม่เป็นคุณลักษณะที่สอดคล้องกันเนื่องจากไม่เคยมีให้บริการในเบราว์เซอร์ทั้งหมด

...

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

พวกเขาไม่ได้ใช้งานเพราะเบราว์เซอร์อื่น ๆ ใช้งานไม่ถูกต้อง กลัวที่จะทำให้ดีขึ้นหรือไม่ คำจำกัดความมาตรฐานหรือไม่ค่าคงที่คือค่าคงที่: ตั้งหนึ่งครั้งไม่เคยเปลี่ยนแปลง

และสำหรับแนวคิดทั้งหมด: ทุกฟังก์ชั่นสามารถเขียนทับได้ (XSS เป็นต้น) จึงมีความแตกต่างในไม่มีหรือvar เป็นค่าคงที่แท้จริงเท่านั้นfunction(){return}const

อัปเดต: IE11 รองรับ const :

IE11 รวมถึงการสนับสนุนคุณสมบัติที่ดีที่กำหนดและใช้ทั่วไปของที่เกิดขึ้นใหม่ ECMAScript 6 มาตรฐานรวมทั้งอนุญาต, const, Map, SetและWeakMapเช่นเดียวกับ__proto__สำหรับการปรับปรุงการทำงานร่วมกัน


25
"มันไม่เคยมีในเบราว์เซอร์ทั้งหมด" หากคุณไม่ให้บริการใน IE ก็จะไม่อยู่ในเบราว์เซอร์ทั้งหมด
กม. 1

มาตรฐานการขับขี่ไม่ได้สำหรับทุกคน;) - บริษัท มาและพวกเขาไปอีกครั้ง - ขอขอบคุณสำหรับการอ้างอิงราคาในไม้
เร็ว

อีกอย่างหนึ่งเกี่ยวกับเรื่องนี้: VBA ยังไม่ได้มีคุณสมบัติเป็น consesus ในเบราว์เซอร์ทั้งหมดและ MS รองรับ const ใน VBA - นี่คือความเชี่ยวชาญในการใช้งบประมาณในการพัฒนา channeling;)
เร็ว

17

หากคุณไม่รังเกียจการใช้ฟังก์ชั่น:

var constant = function(val) {
   return function() {
        return val;
    }
}

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

a = constant(10);

a(); // 10

b = constant(20);

b(); // 20

โดยส่วนตัวแล้วฉันรู้สึกว่ามันค่อนข้างดีโดยเฉพาะหลังจากที่คุ้นเคยกับรูปแบบนี้จากสิ่งที่น่าพิศวง

* ยกเว้นบางคนนิยามฟังก์ชันใหม่constantก่อนที่คุณจะเรียกมัน


1
underscore.js ใช้ฟังก์ชั่นคงที่เหมือนกับรหัสนี้
Upperstage

ง่ายกระชับและตอบคำถามของ OP สิ่งนี้น่าจะได้รับการโหวตมากขึ้น
Mac

3
สิ่งนี้ไม่ได้ผลสำหรับฉันจริงๆ แม้ว่าการปิดทำให้ไม่เปลี่ยนรูป แต่ var ที่คุณกำหนดให้ยังสามารถเขียนทับได้ ตัวอย่าง: a = constant(10); a(10); // 10ตามด้วยa = constant(25); a(); //25, ไม่มีข้อผิดพลาดหรือคำเตือน, ไม่แสดงว่าค่าคงที่ของคุณเสีย
Patrick M

หากฉันกำหนดค่าใหม่ให้กับaมันจะเปลี่ยนเป็นค่าใหม่
Saurabh Sharma

17

ด้วย Object "ใหม่" คุณสามารถทำสิ่งนี้:

var obj = {};
Object.defineProperty(obj, 'CONSTANT', {
  configurable: false
  enumerable: true,
  writable: false,
  value: "your constant value"
});

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

Object.defineProperty(this, 'constant', {
  enumerable: true, 
  writable: false, 
  value: 7, 
  configurable: false
});

> constant
=> 7
> constant = 5
=> 7

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


ไม่ทำงานในซาฟารีและในโมซิลล่าถ้าคุณดำเนินการกำหนดคำสั่งอีกครั้ง - ด้วยค่าที่แตกต่าง - มันจะกำหนดค่าใหม่
Akshay

2
ไม่ใช่ 'ไม่ทำงานในซาฟารี' ไม่รองรับในซาฟารี ไม่เหมือนกัน. และควรโยน 'Uncaught TypeError: ไม่สามารถกำหนดคุณสมบัติใหม่: <ชื่อคุณสมบัติที่นี่>' หากคุณลองใช้ ไม่ว่าคุณจะทำผิดหรือ ff ของคุณนำไปใช้อย่างไม่ถูกต้อง ฉันคิดว่ามันเป็นการผสมผสานของทั้งสองอย่าง
tenshou

14

กลุ่มยังคงอยู่ในโครงสร้างที่เป็นไปได้:

ตัวอย่างในโครงการเกมปัจจุบันของฉันฉันใช้ด้านล่าง:

var CONST_WILD_TYPES = {
    REGULAR: 'REGULAR',
    EXPANDING: 'EXPANDING',
    STICKY: 'STICKY',
    SHIFTING: 'SHIFTING'
};

ที่ได้รับมอบหมาย:

var wildType = CONST_WILD_TYPES.REGULAR;

เปรียบเทียบ:

if (wildType === CONST_WILD_TYPES.REGULAR) {
    // do something here
}

ไม่นานมานี้ฉันกำลังใช้สำหรับการเปรียบเทียบ:

switch (wildType) {
    case CONST_WILD_TYPES.REGULAR:
        // do something here
        break;
    case CONST_WILD_TYPES.EXPANDING:
        // do something here
        break;
}

IE11 ขึ้นอยู่กับมาตรฐาน ES6 ใหม่ที่มีการประกาศ 'const'
ด้านบนใช้งานได้กับเบราว์เซอร์รุ่นก่อนหน้าเช่น IE8, IE9 และ IE10


12

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

/* author Keith Evetts 2009 License: LGPL  
anonymous function sets up:  
global function SETCONST (String name, mixed value)  
global function CONST (String name)  
constants once set may not be altered - console error is generated  
they are retrieved as CONST(name)  
the object holding the constants is private and cannot be accessed from the outer script directly, only through the setter and getter provided  
*/

(function(){  
  var constants = {};  
  self.SETCONST = function(name,value) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if (!value) { throw new Error(' no value supplied for constant ' + name); }  
      else if ((name in constants) ) { throw new Error('constant ' + name + ' is already defined'); }   
      else {   
          constants[name] = value;   
          return true;  
    }    
  };  
  self.CONST = function(name) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if ( name in constants ) { return constants[name]; }    
      else { throw new Error('constant ' + name + ' has not been defined'); }  
  };  
}())  


// -------------  demo ----------------------------  
SETCONST( 'VAT', 0.175 );  
alert( CONST('VAT') );


//try to alter the value of VAT  
try{  
  SETCONST( 'VAT', 0.22 );  
} catch ( exc )  {  
   alert (exc.message);  
}  
//check old value of VAT remains  
alert( CONST('VAT') );  


// try to get at constants object directly  
constants['DODO'] = "dead bird";  // error  

12

ลืม IE และใช้constคำสำคัญ


9
ทำงานได้สำหรับฉัน! แต่แล้วฉันกำลังเขียนส่วนขยายของ Chrome ดังนั้นฉันรู้ว่าฉันอยู่ในเบราว์เซอร์ที่มีสติ ...
yoyo

1
@yoyo ส่วนที่ดีที่สุดเกี่ยวกับการเขียนส่วนขยายและส่วนเสริม - ไม่รองรับเบราว์เซอร์
เอียน

1
@Ian ยินดีต้อนรับสู่ปี 2019 ความไม่สอดคล้องกันของเบราว์เซอร์ได้หายไปเกือบแล้ว :)
Fusseldieb

9

ยังไม่มีวิธีที่กำหนดไว้ล่วงหน้าข้ามเบราว์เซอร์ที่แน่นอนคุณสามารถทำได้โดยการควบคุมขอบเขตของตัวแปรตามที่แสดงในคำตอบอื่น ๆ

แต่ฉันจะแนะนำให้ใช้พื้นที่ชื่อเพื่อแยกความแตกต่างจากตัวแปรอื่น ๆ สิ่งนี้จะลดโอกาสของการชนให้น้อยที่สุดจากตัวแปรอื่น ๆ

การวางตำแหน่งที่เหมาะสมเช่น

var iw_constant={
     name:'sudhanshu',
     age:'23'
     //all varibale come like this
}

ดังนั้นในขณะที่ใช้มันจะเป็นiw_constant.nameหรือiw_constant.age

คุณสามารถบล็อกการเพิ่มคีย์ใหม่หรือเปลี่ยนคีย์ใด ๆ ภายใน iw_constant โดยใช้วิธีการ Object.freeze อย่างไรก็ตามเบราว์เซอร์รุ่นเก่าไม่รองรับ

อดีต:

Object.freeze(iw_constant);

สำหรับเบราว์เซอร์รุ่นเก่าคุณสามารถใช้polyfillสำหรับวิธีค้าง


หากคุณตกลงกับฟังก์ชั่นการโทรต่อไปนี้เป็นวิธีข้ามเบราว์เซอร์ที่ดีที่สุดในการกำหนดค่าคงที่ การกำหนดขอบเขตวัตถุภายในฟังก์ชันการดำเนินการด้วยตนเองและส่งกลับฟังก์ชันรับค่าคงที่เช่น:

var iw_constant= (function(){
       var allConstant={
             name:'sudhanshu',
             age:'23'
             //all varibale come like this

       };

       return function(key){
          allConstant[key];
       }
    };

// เพื่อรับค่าการใช้ iw_constant('name')หรือiw_constant('age')


** ในตัวอย่างทั้งสองคุณจะต้องระมัดระวังในการเว้นวรรคชื่อเพื่อให้วัตถุหรือฟังก์ชั่นของคุณไม่ควรถูกแทนที่ผ่านห้องสมุดอื่น ๆ (ถ้าวัตถุหรือฟังก์ชั่นตัวเองจะถูกแทนที่ค่าคงที่ทั้งหมดของคุณจะไป)


7

ในขณะที่ฉันระบุ "ค่าคงที่" (ซึ่งยังไม่ได้เป็นค่าคงที่จริง) ในวัตถุตัวอักษรผ่านไปยังwith()คำสั่ง ฉันคิดว่ามันฉลาดมาก นี่คือตัวอย่าง:

with ({
    MY_CONST : 'some really important value'
}) {
    alert(MY_CONST);
}

ในอดีตฉันได้สร้างCONSTเนมสเปซที่ฉันจะใส่ค่าคงที่ทั้งหมดของฉัน อีกครั้งกับค่าใช้จ่าย Sheesh

ตอนนี้ผมก็ทำvar MY_CONST = 'whatever';ไปจูบ


16
หากความชั่วร้ายบางสิ่งบางอย่างเอาใจใส่มากกว่า EVAL withก็แน่นอน
NikiC

4
eval นั้นชั่วร้ายมาก! มันเผาบ้านของฉันในครั้งเดียว!
W3Geek

6

ความคิดเห็นของฉัน (ใช้ได้กับวัตถุเท่านั้น)

var constants = (function(){
  var a = 9;

  //GLOBAL CONSTANT (through "return")
  window.__defineGetter__("GCONST", function(){
    return a;
  });

  //LOCAL CONSTANT
  return {
    get CONST(){
      return a;
    }
  }
})();

constants.CONST = 8; //9
alert(constants.CONST); //9

ลอง! แต่เข้าใจ - นี่คือวัตถุ แต่ไม่ใช่ตัวแปรง่ายๆ

ลองแค่:

const a = 9;

5

ฉันก็มีปัญหากับเรื่องนี้เช่นกัน และหลังจากนั้นไม่นานนักค้นหาคำตอบและดูคำตอบทั้งหมดจากทุกคนฉันคิดว่าฉันคิดวิธีแก้ปัญหานี้ได้

ดูเหมือนว่าคำตอบส่วนใหญ่ที่ฉันเจอคือการใช้ฟังก์ชั่นในการควบคุมค่าคงที่ เนื่องจากผู้ใช้หลายคนของฟอรั่ม MANY โพสต์เกี่ยวกับฟังก์ชั่นสามารถเขียนทับได้ง่ายโดยผู้ใช้ในฝั่งไคลเอ็นต์ ฉันรู้สึกทึ่งกับคำตอบของ Keith Evetts ที่ว่าค่าคงที่ไม่สามารถเข้าถึงได้จากภายนอก แต่จากฟังก์ชั่นด้านในเท่านั้น

ดังนั้นฉันจึงคิดวิธีแก้ปัญหานี้:

ใส่ทุกอย่างไว้ในฟังก์ชั่นที่ไม่ระบุชื่อดังนั้นวิธีการตัวแปรวัตถุ ฯลฯ ไม่สามารถเปลี่ยนแปลงได้โดยฝั่งไคลเอ็นต์ ซ่อนฟังก์ชั่น 'ของจริง' โดยให้ฟังก์ชั่นอื่นเรียกฟังก์ชั่น 'ของจริง' จากด้านใน ฉันยังคิดถึงการใช้ฟังก์ชั่นเพื่อตรวจสอบว่ามีการเปลี่ยนแปลงฟังก์ชั่นโดยผู้ใช้ในฝั่งไคลเอ็นต์หรือไม่ หากฟังก์ชั่นมีการเปลี่ยนแปลงให้เปลี่ยนกลับโดยใช้ตัวแปรที่ได้รับการป้องกันภายในและไม่สามารถเปลี่ยนแปลงได้

/*Tested in: IE 9.0.8; Firefox 14.0.1; Chrome 20.0.1180.60 m; Not Tested in Safari*/

(function(){
  /*The two functions _define and _access are from Keith Evetts 2009 License: LGPL (SETCONST and CONST).
    They're the same just as he did them, the only things I changed are the variable names and the text
    of the error messages.
  */

  //object literal to hold the constants
  var j = {};

  /*Global function _define(String h, mixed m). I named it define to mimic the way PHP 'defines' constants.
    The argument 'h' is the name of the const and has to be a string, 'm' is the value of the const and has
    to exist. If there is already a property with the same name in the object holder, then we throw an error.
    If not, we add the property and set the value to it. This is a 'hidden' function and the user doesn't
    see any of your coding call this function. You call the _makeDef() in your code and that function calls
    this function.    -    You can change the error messages to whatever you want them to say.
  */
  self._define = function(h,m) {
      if (typeof h !== 'string') { throw new Error('I don\'t know what to do.'); }
      if (!m) { throw new Error('I don\'t know what to do.'); }
      else if ((h in j) ) { throw new Error('We have a problem!'); }
      else {
          j[h] = m;
          return true;
    }
  };

  /*Global function _makeDef(String t, mixed y). I named it makeDef because we 'make the define' with this
    function. The argument 't' is the name of the const and doesn't need to be all caps because I set it
    to upper case within the function, 'y' is the value of the value of the const and has to exist. I
    make different variables to make it harder for a user to figure out whats going on. We then call the
    _define function with the two new variables. You call this function in your code to set the constant.
    You can change the error message to whatever you want it to say.
  */
  self._makeDef = function(t, y) {
      if(!y) { throw new Error('I don\'t know what to do.'); return false; }
      q = t.toUpperCase();
      w = y;
      _define(q, w);
  };

  /*Global function _getDef(String s). I named it getDef because we 'get the define' with this function. The
    argument 's' is the name of the const and doesn't need to be all capse because I set it to upper case
    within the function. I make a different variable to make it harder for a user to figure out whats going
    on. The function returns the _access function call. I pass the new variable and the original string
    along to the _access function. I do this because if a user is trying to get the value of something, if
    there is an error the argument doesn't get displayed with upper case in the error message. You call this
    function in your code to get the constant.
  */
  self._getDef = function(s) {
      z = s.toUpperCase();
      return _access(z, s);
  };

  /*Global function _access(String g, String f). I named it access because we 'access' the constant through
    this function. The argument 'g' is the name of the const and its all upper case, 'f' is also the name
    of the const, but its the original string that was passed to the _getDef() function. If there is an
    error, the original string, 'f', is displayed. This makes it harder for a user to figure out how the
    constants are being stored. If there is a property with the same name in the object holder, we return
    the constant value. If not, we check if the 'f' variable exists, if not, set it to the value of 'g' and
    throw an error. This is a 'hidden' function and the user doesn't see any of your coding call this
    function. You call the _getDef() function in your code and that function calls this function.
    You can change the error messages to whatever you want them to say.
  */
  self._access = function(g, f) {
      if (typeof g !== 'string') { throw new Error('I don\'t know what to do.'); }
      if ( g in j ) { return j[g]; }
      else { if(!f) { f = g; } throw new Error('I don\'t know what to do. I have no idea what \''+f+'\' is.'); }
  };

  /*The four variables below are private and cannot be accessed from the outside script except for the
    functions inside this anonymous function. These variables are strings of the four above functions and
    will be used by the all-dreaded eval() function to set them back to their original if any of them should
    be changed by a user trying to hack your code.
  */
  var _define_func_string = "function(h,m) {"+"      if (typeof h !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if (!m) { throw new Error('I don\\'t know what to do.'); }"+"      else if ((h in j) ) { throw new Error('We have a problem!'); }"+"      else {"+"          j[h] = m;"+"          return true;"+"    }"+"  }";
  var _makeDef_func_string = "function(t, y) {"+"      if(!y) { throw new Error('I don\\'t know what to do.'); return false; }"+"      q = t.toUpperCase();"+"      w = y;"+"      _define(q, w);"+"  }";
  var _getDef_func_string = "function(s) {"+"      z = s.toUpperCase();"+"      return _access(z, s);"+"  }";
  var _access_func_string = "function(g, f) {"+"      if (typeof g !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if ( g in j ) { return j[g]; }"+"      else { if(!f) { f = g; } throw new Error('I don\\'t know what to do. I have no idea what \\''+f+'\\' is.'); }"+"  }";

  /*Global function _doFunctionCheck(String u). I named it doFunctionCheck because we're 'checking the functions'
    The argument 'u' is the name of any of the four above function names you want to check. This function will
    check if a specific line of code is inside a given function. If it is, then we do nothing, if not, then
    we use the eval() function to set the function back to its original coding using the function string
    variables above. This function will also throw an error depending upon the doError variable being set to true
    This is a 'hidden' function and the user doesn't see any of your coding call this function. You call the
    doCodeCheck() function and that function calls this function.    -    You can change the error messages to
    whatever you want them to say.
  */
  self._doFunctionCheck = function(u) {
      var errMsg = 'We have a BIG problem! You\'ve changed my code.';
      var doError = true;
      d = u;
      switch(d.toLowerCase())
      {
           case "_getdef":
               if(_getDef.toString().indexOf("z = s.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_getDef = "+_getDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_makedef":
               if(_makeDef.toString().indexOf("q = t.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_makeDef = "+_makeDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_define":
               if(_define.toString().indexOf("else if((h in j) ) {") != -1) { /*do nothing*/ }
               else { eval("_define = "+_define_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_access":
               if(_access.toString().indexOf("else { if(!f) { f = g; }") != -1) { /*do nothing*/ }
               else { eval("_access = "+_access_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           default:
                if(doError === true) { throw new Error('I don\'t know what to do.'); }
      }
  };

  /*Global function _doCodeCheck(String v). I named it doCodeCheck because we're 'doing a code check'. The argument
    'v' is the name of one of the first four functions in this script that you want to check. I make a different
    variable to make it harder for a user to figure out whats going on. You call this function in your code to check
    if any of the functions has been changed by the user.
  */
  self._doCodeCheck = function(v) {
      l = v;
      _doFunctionCheck(l);
  };
}())

ดูเหมือนว่าการรักษาความปลอดภัยเป็นปัญหาอย่างแท้จริงและไม่มีทางที่จะ "ซ่อน" คุณตั้งโปรแกรมจากฝั่งไคลเอ็นต์ ความคิดที่ดีสำหรับฉันคือการบีบอัดรหัสของคุณเพื่อให้มันยากสำหรับทุกคนรวมถึงคุณโปรแกรมเมอร์ที่จะอ่านและทำความเข้าใจ มีเว็บไซต์ที่คุณสามารถไปที่คือhttp://javascriptcompressor.com/ (นี่ไม่ใช่เว็บไซต์ของฉันไม่ต้องกังวลฉันไม่ได้โฆษณา) นี่เป็นเว็บไซต์ที่จะช่วยให้คุณบีบอัดและทำให้รหัส Javascript แย่ลงได้ฟรี

  1. คัดลอกรหัสทั้งหมดในสคริปต์ด้านบนและวางลงใน textarea ด้านบนในหน้า javascriptcompressor.com
  2. เลือกช่องทำเครื่องหมายการเข้ารหัส Base62 เลือกช่องทำเครื่องหมายย่อตัวแปร
  3. กดปุ่มบีบอัด
  4. วางและบันทึกทั้งหมดในไฟล์. js และเพิ่มลงในหน้าของคุณในส่วนหัวของหน้า

นี่เป็นทางออกที่ดีที่อาจรวมเป็นห้องสมุดเพื่อรวม แต่ฉันไม่ชอบการตั้งชื่อตัวแปรของคุณในรหัสนี้ ทำไมต้องวางชื่อที่สื่อความหมายเช่น "name" และ "value" ตามที่ใช้ในโค้ดของ Keith ปัญหาเล็กน้อย แต่ก็ยัง
Cordle

5

เห็นได้ชัดว่าสิ่งนี้แสดงให้เห็นถึงความจำเป็นในการใช้คำสำคัญ const ข้ามเบราว์เซอร์มาตรฐาน

แต่สำหรับตอนนี้:

var myconst = value;

หรือ

Object['myconst'] = value;

ทั้งสองดูเหมือนเพียงพอและอย่างอื่นก็เหมือนยิงแมลงวันด้วยปืนยิงรถถัง


หา var myconst = value เก่า ๆ และสำหรับการแก้ไขข้อบกพร่องใช้รหัสการแก้จุดบกพร่องพิเศษ ... - ทำงานอย่างบ้าคลั่งตราบใดที่เบราว์เซอร์ไม่สนับสนุนเบราว์เซอร์ทั้งหมด
Quicker

4

ฉันใช้constแทนvarสคริปต์ Greasemonkey ของฉัน แต่เป็นเพราะพวกเขาจะทำงานเฉพาะใน Firefox ...
การประชุมชื่ออาจเป็นหนทางไปด้วยเช่นกัน (ฉันทำทั้งสองอย่าง!)


4

ใน JavaScript การฝึกฝนของฉันคือการหลีกเลี่ยงค่าคงที่มากที่สุดเท่าที่จะทำได้และใช้สตริงแทน ปัญหาค่าคงที่ปรากฏขึ้นเมื่อคุณต้องการแสดงค่าคงที่ของคุณไปยังโลกภายนอก:

ตัวอย่างหนึ่งสามารถใช้ API วันที่ต่อไปนี้:

date.add(5, MyModule.Date.DAY).add(12, MyModule.Date.HOUR)

แต่สั้นกว่าและเป็นธรรมชาติมากกว่าที่จะเขียนเพียง:

date.add(5, "days").add(12, "hours")

ด้วยวิธีนี้ "วัน" และ "ชั่วโมง" จะทำหน้าที่เหมือนค่าคงที่จริงๆเพราะคุณไม่สามารถเปลี่ยนแปลงจากภายนอกได้ว่า "ชั่วโมง" หมายถึงกี่วินาที MyModule.Date.HOURแต่มันเป็นเรื่องง่ายที่จะเขียนทับ

วิธีการเช่นนี้จะช่วยในการแก้ไขข้อบกพร่อง ถ้า Firebug บอกคุณaction === 18มันค่อนข้างยากที่จะเข้าใจว่ามันหมายถึงอะไร แต่เมื่อคุณเห็นaction === "save"มันจะชัดเจนทันที


น่าเสียดายที่มันง่ายที่จะทำการสะกดผิด - เช่น"Hours"แทนที่จะเป็น"hours"- แต่ IDE อาจแจ้งให้คุณทราบล่วงหน้าDate.Hoursว่าไม่ได้กำหนดไว้
le_m

4

โอเคมันน่าเกลียด แต่มันทำให้ฉันมีค่าคงที่ใน Firefox และ Chromium ค่าคงที่ไม่แน่นอน (WTF?) ใน Safari และ Opera และตัวแปรใน IE

แน่นอน eval () เป็นสิ่งที่ชั่วร้าย แต่หากปราศจาก IE ก็เกิดข้อผิดพลาดป้องกันไม่ให้สคริปต์ทำงาน

Safari และ Opera รองรับคำหลัก const แต่คุณสามารถเปลี่ยนค่าของ constได้

ในตัวอย่างนี้โค้ดฝั่งเซิร์ฟเวอร์กำลังเขียน JavaScript ไปยังหน้าโดยแทนที่ {0} ด้วยค่า

try{
    // i can haz const?
    eval("const FOO='{0}';");
    // for reals?
    var original=FOO;
    try{
        FOO='?NO!';
    }catch(err1){
        // no err from Firefox/Chrome - fails silently
        alert('err1 '+err1);
    }
    alert('const '+FOO);
    if(FOO=='?NO!'){
        // changed in Sf/Op - set back to original value
        FOO=original;
    }
}catch(err2){
    // IE fail
    alert('err2 '+err2);
    // set var (no var keyword - Chrome/Firefox complain about redefining const)
    FOO='{0}';
    alert('var '+FOO);
}
alert('FOO '+FOO);

สิ่งนี้ดีสำหรับอะไร? ไม่มากเนื่องจากไม่ใช่เบราว์เซอร์ ที่ดีที่สุดอาจจะอุ่นใจเล็กน้อยว่าอย่างน้อยเบราว์เซอร์บางตัวจะไม่ยอมให้ bookmarklet หรือสคริปต์ของบุคคลที่สามแก้ไขค่า

ทดสอบกับ Firefox 2, 3, 3.6, 4, Iron 8, Chrome 10, 12, Opera 11, Safari 5, IE 6, 9


1
รักรหัสนั้น! น่าเกลียดมาก ๆ แต่เป็นบททดสอบที่ดีสำหรับการสนับสนุน const =)
Stein G. Strindhaug

1
ค่อนข้างตลกขบขัน - คุณสามารถพิมพ์จำนวนบรรทัดเพื่อประกาศ const ได้อย่างไร
เร็ว

4

ถ้ามันเป็นมูลค่าการกล่าวขวัญคุณสามารถกำหนดค่าคงที่ในการใช้เชิงมุม$provide.constant()

angularApp.constant('YOUR_CONSTANT', 'value');

... และคุณสามารถใช้ const ใน VBA ... xbrowser หรือไม่ ... ups ... ;)
เร็ว

OP ถามเกี่ยวกับจาวาสคริปต์ตอบข้อเสนอด้วยเฟรมเวิร์ก JS ที่มีความเห็นเฉพาะอย่างยิ่ง ปิดหัวข้อจริง
rounce

2
@rounce: ตอบ Off-หัวข้อยังคงตอบไม่ธงพวกเขาเป็นไม่ได้คำตอบแต่downvoteและออกเสียงลงคะแนนในการลบแทน ดูฉันจะใช้ธง“ ไม่ใช่คำตอบ” อย่างถูกต้องได้อย่างไร
Kevin Guan

@KevinGuan สังเกตเห็นจะทำในอนาคต
rounce

4

รุ่นปรับปรุงของคำตอบของเบิร์คที่ช่วยให้คุณทำแทนCONFIG.MY_CONSTCONFIG.get('MY_CONST')

ต้องใช้ IE9 + หรือเว็บเบราว์เซอร์ตัวจริง

var CONFIG = (function() {
    var constants = {
        'MY_CONST': 1,
        'ANOTHER_CONST': 2
    };

    var result = {};
    for (var n in constants)
        if (constants.hasOwnProperty(n))
            Object.defineProperty(result, n, { value: constants[n] });

    return result;
}());

* คุณสมบัติเป็นแบบอ่านอย่างเดียวเท่านั้นหากค่าเริ่มต้นไม่เปลี่ยนรูป


4

JavaScript ES6 (ใหม่) แนะนำconstคำหลักที่ได้รับการสนับสนุนในเบราว์เซอร์ที่สำคัญทั้งหมด

ตัวแปรที่ประกาศผ่านconstไม่สามารถประกาศใหม่หรือกำหนดใหม่ได้

นอกเหนือจากที่มีลักษณะการทำงานจะคล้ายกันconstlet

มันจะทำงานตามที่คาดไว้สำหรับประเภทข้อมูลดั้งเดิม (บูลีน, Null, ไม่ได้กำหนด, หมายเลข, สตริง, สัญลักษณ์):

const x = 1;
x = 2;
console.log(x); // 1 ...as expected, re-assigning fails

ข้อควรระวัง:ระวังข้อผิดพลาดเกี่ยวกับวัตถุ:

const o = {x: 1};
o = {x: 2};
console.log(o); // {x: 1} ...as expected, re-assigning fails

o.x = 2;
console.log(o); // {x: 2} !!! const does not make objects immutable!

const a = [];
a = [1];
console.log(a); // 1 ...as expected, re-assigning fails

a.push(1);
console.log(a); // [1] !!! const does not make objects immutable

หากคุณต้องการวัตถุที่ไม่เปลี่ยนรูปและคงที่จริงๆ: เพียงใช้const ALL_CAPSเพื่อทำให้ความตั้งใจของคุณชัดเจน มันเป็นวิธีการที่ดีที่จะปฏิบัติตามconstคำประกาศทั้งหมดต่อไปดังนั้นเพียงแค่วางใจ


จากIE11เท่านั้น :-(
Mo.

3

อีกทางเลือกหนึ่งคือ:

var constants = {
      MY_CONSTANT : "myconstant",
      SOMETHING_ELSE : 123
    }
  , constantMap = new function ConstantMap() {};

for(var c in constants) {
  !function(cKey) {
    Object.defineProperty(constantMap, cKey, {
      enumerable : true,
      get : function(name) { return constants[cKey]; }
    })
  }(c);
}

จากนั้นเพียง: var foo = constantMap.MY_CONSTANT

ถ้าคุณทำแบบนี้constantMap.MY_CONSTANT = "bar"มันจะไม่มีผลอะไรเลยในขณะที่เรากำลังพยายามใช้โอเปอเรเตอร์การมอบหมายกับทะเยอทะยานดังนั้นconstantMap.MY_CONSTANT === "myconstant"มันจะยังคงเป็นจริง


3

ใน Javascript มีค่าคงที่แล้ว คุณกำหนดค่าคงที่เช่นนี้:

const name1 = value;

สิ่งนี้ไม่สามารถเปลี่ยนแปลงได้ผ่านการมอบหมายใหม่


ตามลิงก์ในคำตอบนี้เป็นคุณสมบัติทดลองและควรใช้ด้วยความระมัดระวัง
Johnie Karr

แน่นอนฉันเห็นด้วยกับคุณ แต่ในเบราว์เซอร์เวอร์ชันล่าสุดมันใช้งานได้
Erik Lucio

3

มีการเสนอคำหลัก 'const' ก่อนหน้านี้และขณะนี้มีการรวมไว้อย่างเป็นทางการใน ES6 โดยใช้คำสำคัญ const คุณสามารถส่งค่า / สตริงที่จะทำหน้าที่เป็นสตริงที่ไม่เปลี่ยนรูป


2

การแนะนำค่าคงที่ใน JavaScript ให้ดีที่สุดคือแฮ็ค

วิธีที่ดีในการสร้างค่าที่ถาวรและเข้าถึงได้ทั่วโลกใน JavaScript จะเป็นการประกาศวัตถุตามตัวอักษรด้วยคุณสมบัติ "อ่านอย่างเดียว" เช่นนี้:

            my={get constant1(){return "constant 1"},
                get constant2(){return "constant 2"},
                get constant3(){return "constant 3"},
                get constantN(){return "constant N"}
                }

คุณจะมีค่าคงที่ทั้งหมดของคุณจัดกลุ่มไว้ในวัตถุอุปกรณ์เสริม "ของฉัน" เดียวซึ่งคุณสามารถค้นหาค่าที่เก็บไว้ของคุณหรืออะไรก็ได้ที่คุณอาจตัดสินใจใส่ไว้ในเรื่องนั้น ตอนนี้มาทดสอบว่ามันใช้งานได้ไหม:

           my.constant1; >> "constant 1" 
           my.constant1 = "new constant 1";
           my.constant1; >> "constant 1" 

ดังที่เราเห็นทรัพย์สิน "my.constant1" ได้เก็บค่าเดิมไว้ คุณได้ทำให้ค่าคงที่ชั่วคราวเป็น 'สีเขียว' ที่สวยงามอยู่เสมอ ...

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

ไม่เช่นนั้นฉันก็ยังคิดว่าค่าคงที่นั้นเหมาะกับหุ่น และฉันก็ยังคิดว่าการแลกเปลี่ยนอิสรภาพอันยอดเยี่ยมของคุณสำหรับมุมเล็ก ๆ ของความปลอดภัยที่หลอกลวงนั้นเป็นการค้าที่แย่ที่สุดเท่าที่จะเป็นไปได้


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