Câu hỏi Có hằng số trong JavaScript?


Có cách nào để sử dụng hằng số trong JavaScript?

Nếu không, thực hành phổ biến để chỉ định các biến được sử dụng làm hằng số là gì?


1061
2017-09-24 22:45


gốc


Chrome cho phép bạn sử dụng từ khóa const để sử dụng hằng số. ví dụ const ASDF = "asdf". Tuy nhiên, kể từ const không tương thích với nhiều trình duyệt, tôi thường gắn bó với var tờ khai. - Jacksonkr
try{const thing=1091;}catch(e){var thing=1091;} công trinh. - Derek 朕會功夫
Derek: sẽ không thử / bắt của bạn giới hạn phạm vi của điều bạn đang tuyên bố cho khối try / catch? Nếu bạn không dò đúng cách thì điểm cụ thể là gì const hoặc là var ở tất cả? - Coderer
@ Bộ mã hóa trong việc triển khai hiện tại, điều này sẽ hoạt động, như const có cùng phạm vi với varvà đó là cấp chức năng chứ không phải cấp khối. Nếu bạn làm theo tiêu chuẩn ECMAScript sắp tới, const có cùng phạm vi với let, có nghĩa là nó sẽ không hoạt động. - Jasper
@Coderer Ngôn ngữ không đúng. Các biến trong javascript là phạm vi chức năng. Đây không phải là C. - doug65536


Các câu trả lời:


ES2015, JavaScript có khái niệm về const:

const MY_CONSTANT = "some-value";

Điều này sẽ làm việc trong khá nhiều tất cả các trình duyệt ngoại trừ IE 8, 9 và 10. Một số cũng có thể cần chế độ nghiêm ngặt đã bật.

Bạn có thể dùng var với các quy ước như ALL_CAPS để cho thấy rằng các giá trị nhất định không được sửa đổi nếu bạn cần hỗ trợ các trình duyệt cũ hơn hoặc đang làm việc với mã cũ:

var MY_CONSTANT = "some-value";

966
2017-09-24 22:46



Làm thế nào về const x = 24; - Zachary Scott
Lưu ý rằng nếu bạn không cần khả năng tương thích giữa các trình duyệt (hoặc bạn đang lập trình phía máy chủ trong Rhino hoặc Node.js), bạn có thể sử dụng const từ khóa. Nó hiện được hỗ trợ bởi tất cả các trình duyệt hiện đại ngoại trừ IE. - Husky
Những ngày này (3,5 năm sau) bạn có thể sử dụng Object.defineProperty để tạo các thuộc tính chỉ đọc cũng không thể xóa được. Điều này làm việc trong phiên bản hiện tại của tất cả các trình duyệt chính (nhưng không chính xác trong IE8). Xem câu trả lời của @NotAName - Phrogz
@Amyth Điều đó không thực sự hữu ích. Đó là một phong cách hướng dẫn được đề xuất bởi một nhà cung cấp duy nhất. Theo điểm của Husky ở trên, khả năng tương thích của IE hoàn toàn không liên quan khi viết JS phía máy chủ. - aendrew
Vì câu trả lời này vẫn được Google xếp hạng cao trong năm 2015 nên nên nói rằng nó bây giờ đã lỗi thời. Các const từ khóa bây giờ chính thức là một phần của ngôn ngữ và được hỗ trợ bởi mọi trình duyệt. Theo statcounter.com chỉ một vài phần trăm người dùng internet vẫn sử dụng các phiên bản trình duyệt cũ không hỗ trợ const. - Tristan Berger


Bạn đang cố gắng bảo vệ các biến chống lại sửa đổi? Nếu có, thì bạn có thể sử dụng mẫu mô-đun:

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

Sử dụng cách tiếp cận này, các giá trị không thể sửa đổi được. Tuy nhiên, bạn phải sử dụng phương thức get () trên CONFIG: (.

Nếu bạn không cần phải bảo vệ nghiêm ngặt giá trị biến, thì chỉ cần làm như gợi ý và sử dụng một quy ước của ALL CAPS.


304
2017-09-25 03:14



Lưu ý rằng bạn chỉ có thể trả về một hàm cho giá trị của CONFIG. Điều đó sẽ giúp bạn tiết kiệm gọi CONFIG.get () mọi lúc. - Mathew Byrne
Giải pháp khá. Nhưng những thứ như vậy nên được bao bọc như một thư viện để không tái tạo lại chúng trong bất kỳ dự án mới nào. - Anders D
CONFIG.get = someNewFunctionThatBreaksTheCode... Tất cả trong tất cả, bạn hoàn toàn không thể thực thi các hằng số trong JS (w / o const keyword). Chỉ là về điều duy nhất bạn có thể làm là khả năng hiển thị giới hạn. - Thomas Eding
Tôi tin rằng private là một từ dành riêng trong tương lai trong JavaScript, tôi sẽ không sử dụng nó nếu tôi là bạn. - Zaq
Đây cũng là mẫu đăng ký.


Các const từ khóa đang ở bản nháp ECMAScript 6 nhưng nó cho đến nay chỉ thích một lượng hỗ trợ trình duyệt: http://kangax.github.io/compat-table/es6/. Cú pháp là:

const CONSTANT_NAME = 0;

119
2018-03-26 20:29



Nếu bạn cố gán giá trị cho const, nó không ném bất kỳ lỗi nào. Nhiệm vụ chỉ thất bại và hằng số vẫn có giá trị ban đầu của nó. Đây là một lỗ hổng thiết kế chính IMHO nhưng miễn là có một quy ước đặt tên rõ ràng, nhất quán (chẳng hạn như ALL_CAPS phổ biến) tôi không nghĩ rằng nó sẽ gây ra quá nhiều đau buồn. - MatrixFrog
Theo dõi hỗ trợ trình duyệt tại đây: kangax.github.io/es5-compat-table/es6/#const - Mark McDonald
Bài tập @MatrixFrog sẽ gây ra lỗi với 'use strict'. - sam
Tôi có nên xác định các hằng số trong ALL CAPS? - Lewis
@Tresdin Nó là một quy ước đặt tên phổ biến để xác định các hằng số trong tất cả các mũ. Không có gì trong spec ngôn ngữ buộc nó, nhưng nó không phải là một ý tưởng tồi. Nó làm cho nó rõ ràng hơn ý định của bạn là gì, vì vậy nó cải thiện khả năng đọc mã. - Bill the Lizard


"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

Xem Object.freeze. Bạn có thể sử dụng const nếu bạn muốn làm constants tham khảo chỉ đọc là tốt.


64
2018-05-04 23:58



Nên đề cập đến điều này chỉ hoạt động trên IE9 + kangax.github.io/compat-table/es5 . - Cordle
Tôi sẽ, nếu nó không có sự thực thi bị hỏng i - Alnitak
Lưu ý: điều này hoạt động tương tự như ES6 const tuyên bố, ví dụ: các thuộc tính không thể được khai báo lại hoặc gán lại, nhưng nếu chúng thuộc kiểu dữ liệu object, chúng có thể bị đột biến. - le_m
Chính xác những gì tôi đang tìm kiếm. Bạn cũng có thể dùng const constants thay vì var constants để ngăn biến được gán lại. - Jarett Millard
Xem, ví dụ: đóng băng sâu cho việc đóng băng đệ quy. - sam


IE hỗ trợ các hằng số, loại, ví dụ:

<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>

63
2017-10-26 19:22



Boy, nói về một cái gì đó không phải là trình duyệt chéo. . . Vẫn +1 để suy nghĩ một chút bên ngoài hộp. - Tom
VBScript? Cái gì thế? ;) - tybro0103
Tôi thường bỏ phiếu cho câu hỏi về các trình duyệt chéo liên quan chung, với câu trả lời cụ thể của IE. Nguyên nhân tôi ghét những người nghĩ rằng việc thực hiện javascript của IE là 'một' và những người khác chỉ bị bỏ qua. Ai đang sử dụng các borws khác hơn IE, btw? - Ant
Có khả năng trong ES6: wiki.ecmascript.org/doku.php?id=harmony:const - Ciro Santilli 新疆改造中心 六四事件 法轮功
@Cooluhuru tập lệnh này xuất hiện để xử lý cả trình duyệt IE (sử dụng VBScript) và trình duyệt không phải của IE (sử dụng JavaScript const). Bạn có thể giải thích những gì sai với nó? - Andrew Grimm


ECMAScript 5 giới thiệu Object.defineProperty:

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

nó là được hỗ trợ trong mọi trình duyệt hiện đại (cũng như IE ≥ 9).

Xem thêm: Object.defineProperty trong ES5?


57
2018-01-09 00:41



Cần lưu ý rằng đây không phải là một hằng số truyền thống. Điều này sẽ chỉ cho phép bạn xác định một thuộc tính cố định (của một đối tượng không liên tục). Ngoài ra, điều này không tạo ra lỗi và thậm chí trả về giá trị bạn cố gắng đặt. Nó chỉ đơn giản là không viết giá trị. - Cory Gross
Gần đây tôi đã đọc rằng cố gắng chỉ định cho một thuộc tính có writable: false  sẽ thực sự ném một lỗi nếu mã thực hiện nhiệm vụ được diễn giải trong chế độ nghiêm ngặt của ECMAScript 5. Chỉ cần một lý do khác để viết 'use strict' vào mã của bạn. - Cory Gross
Bạn thực sự có thể bỏ qua writable: false vì đó là mặc định. - sam


Không, nói chung là không. Firefox thực hiện const nhưng tôi biết IE thì không.


@John chỉ vào một thực hành đặt tên phổ biến cho các const đã được sử dụng trong nhiều năm ở các ngôn ngữ khác, tôi không thấy lý do tại sao bạn không thể sử dụng nó. Tất nhiên điều đó không có nghĩa là ai đó sẽ không ghi giá trị của biến. :)


24
2017-09-24 22:45



Như mọi người đều biết, nếu IE không thực hiện nó, nó có thể cũng không tồn tại. - Josh Hinman
Thật không may, và thực tế nói - đó là sự thật. IE không sở hữu một phần lớn thị trường. Nếu tôi sở hữu một doanh nghiệp và có các ứng dụng web được sử dụng trong nội bộ, tôi sẽ chuẩn hóa FF. Tôi không biết tại sao rất nhiều người quan tâm đến IE, nó thổi. - Jason Bunting
@Rich: Ai nói ý kiến ​​của tôi là sự thật? Bạn đã thực hiện khá giả định. Bên cạnh đó, theo như tôi quan tâm, thực tế là IE sucks là một thực tế. Bạn có thể có sự thật của riêng bạn, tôi không nói bạn phải tin tôi. : P Lấy một Xanax hoặc một cái gì đó ... - Jason Bunting
@Rich B, yea đó chỉ là một nhận xét câm để thực hiện, và tin tưởng tôi, tôi sẽ biết, tôi thực hiện rất nhiều ý kiến ​​câm. @ Jason B. - thú vị, tôi chạy vào vấn đề này rất đêm qua .. const làm việc trong FF nhưng không phải là IE. Cảm ơn vì đã làm rõ
Ai quan tâm đến IE? Tôi không! FF hoặc Chrome hoặc Opera vv ... có thể được cài đặt gần như trong mọi nền tảng hệ điều hành. Ngoài ra các nhà bán lẻ máy tính thường biết phiên bản IE cũ nên họ thường xuyên (hoặc thậm chí mỗi lần) cài đặt các trình duyệt thay thế trước khi bán máy tính. Vì vậy, tôi đã quyết định ứng dụng phát triển của mình không quan tâm đến các trình duyệt không tương thích: nếu nhà phát triển trình duyệt quan tâm đến các tiêu chuẩn, sản phẩm của họ có thể sử dụng ứng dụng của tôi, nếu không, người dùng sẽ sử dụng trình duyệt khác ... Tôi có thể sống với nó; -) Nhưng Microsoft có thể sống mất một phần của thị trường? Không họ không thể như vậy "Họ" sẽ thay đổi chính trị dev của họ! - willy wonka