【发布时间】:2011-08-12 18:21:23
【问题描述】:
我想在 JavaScript 中声明字符串常量。
有没有办法做到这一点?
【问题讨论】:
-
与其他语言(如 java)的方式不同,但您可以返回一个返回值的函数。见stackoverflow.com/questions/130396/…
标签: javascript constants
我想在 JavaScript 中声明字符串常量。
有没有办法做到这一点?
【问题讨论】:
标签: javascript constants
许多浏览器的实现(和 Node)都有常量,与 const 一起使用。
const SOME_VALUE = "Your string";
这个const 意味着您不能将它重新分配给任何其他值。
检查compatibility notes 以查看您的目标浏览器是否受支持。
或者,您也可以修改第一个示例,使用defineProperty() 或其朋友,并将writable 属性设为false。这意味着变量的内容不能像常量一样改变。
【讨论】:
' 来进一步节省一些击键,例如= { constant1: 'value1',}
const SOME_VAR = "Your string";
使用全局命名空间或全局对象,如常量。
var Constants = {};
并使用defineObject编写函数将所有属性添加到该对象并为其赋值。
function createConstant (prop, value) {
Object.defineProperty(Constants , prop, {
value: value,
writable: false
});
};
【讨论】:
从 ECMAScript 2015(又名 ES6)开始,您可以使用 const
const constantString = 'Hello';
但并非所有浏览器/服务器都支持这一点。为了支持这一点,请使用像 Babel 这样的 polyfill 库。
【讨论】:
你可以使用 Object 的 freeze 方法来创建一个常量。例如:
var configObj ={timeOut :36000};
Object.freeze(configObj);
这样你不能改变configObj。
【讨论】:
当然,当 OP 提交问题时,这不是一个选项,但 ECMAScript 6 现在还允许通过“const”关键字的方式使用常量:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
您可以看到 ECMAScript 6 采用 here。
【讨论】:
JavaScript 中没有常量,但要声明一个字面量,您所要做的就是:
var myString = "Hello World";
我不确定您将它们存储在资源文件中是什么意思;这不是 JavaScript 概念。
【讨论】:
内置 Object 的标准冻结功能可用于冻结包含常量的对象。
var obj = {
constant_1 : 'value_1'
};
Object.freeze(obj);
obj.constant_1 = 'value_2'; //Silently does nothing
obj.constant_2 = 'value_3'; //Silently does nothing
在严格模式下,在不可变对象上设置值会引发 TypeError。更多详情请见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
【讨论】:
好吧,你可以这样做:
(function() {
var localByaka;
Object.defineProperty(window, 'Byaka', {
get: function() {
return localByaka;
},
set: function(val) {
localByaka = window.Byaka || val;
}
});
}());
window.Byaka = "foo"; //set constant
window.Byaka = "bar"; // try resetting it for shits and giggles
window.Byaka; // will allways return foo!
如果您在全局范围内执行上述操作,这将是一个真正的常量,因为您无法覆盖窗口对象。
我创建了一个库来在 javascript 中创建常量和不可变对象。它仍然是 0.2 版,但它做得很好。 http://beckafly.github.io/insulatejs
【讨论】:
给这只猫剥皮的方法有很多。您可以在闭包中执行此操作。此代码将为您提供一种只读的、命名空间的方式来获取常量。只需在 Public 区域中声明它们即可。
//Namespaced Constants
var MyAppName;
//MyAppName Namespace
(function (MyAppName) {
//MyAppName.Constants Namespace
(function (Constants) {
//Private
function createConstant(name, val) {
Object.defineProperty(MyAppName.Constants, name, {
value: val,
writable: false
});
}
//Public
Constants.FOO = createConstant("FOO", 1);
Constants.FOO2 = createConstant("FOO2", 1);
MyAppName.Constants = Constants;
})(MyAppName.Constants || (MyAppName.Constants = {}));
})(MyAppName || (MyAppName = {}));
用法:
console.log(MyAppName.Constants.FOO); //prints 1
MyAppName.Constants.FOO = 2;
console.log(MyAppName.Constants.FOO); //does not change - still prints 1
【讨论】:
你在使用 JQuery 吗?您想在多个 javascript 文件中使用常量吗?然后继续阅读。 (这是我对相关 JQuery 问题的回答)
有一个方便的 jQuery 方法称为“getScript”。确保使用与从 html/jsp/etc 文件访问文件时相同的相对路径(即,该路径不是相对于您放置 getScript 方法的位置,而是相对于您的域路径)。例如,对于 localhost:8080/myDomain 的应用程序:
$(document).ready(function() {
$.getScript('/myDomain/myScriptsDir/constants.js');
...
那么,如果你在一个名为 constants.js 的文件中有这个:
var jsEnum = { //not really an enum, just an object that serves a similar purpose
FOO : "foofoo",
BAR : "barbar",
}
您现在可以使用
打印出 'foofoo'jsEnum.FOO
【讨论】:
jsEnum.FOO = "booboo"。不是常数。
只需声明任何 js 函数范围之外的变量。此类变量将是全局变量。
【讨论】: