如果是这样,这种声明的语法是什么?
答案 0 :(得分:25)
正如“Pointy”如此仔细地注意到,ECMAscript没有这样的功能。但是,JavaScript does:
const a = 7;
document.writeln("a is " + a + ".");
当然,如果您正在编写代码以便在Web浏览器中运行,那么这可能对您没什么帮助。 : - )
答案 1 :(得分:24)
Javascript实际上没有命名常量的概念,也没有对象的不可变属性。 (请注意,我不是在这里谈论ES5。)
您可以在全局范围内使用简单的var
声明声明全局变量,就像在网页包含的脚本中的任何函数之外:
<script>
var EXACTLY_ONE = 1;
然后你的代码当然可以使用那个常量,虽然它不是真正“常量”,因为值可以改变(换句话说,属性更新)。
答案 2 :(得分:13)
除非使用var
关键字声明,否则一切都是全局的。
也没有常数。您只需在没有var
关键字的情况下声明它们。
如果要确保全局范围,可以将其放入window
对象:
window.GLOBAL_CONSTANT = "value";
您可以在任何范围内执行此操作。然后可以在函数或闭包内声明常量,但我不建议这样做。
答案 3 :(得分:5)
你可以使用getter和setter这样做:
Object.defineProperty(window, 'TAU', {
get: function(){return Math.PI*2;}
});
如果您想要一般功能:
function define(name, value){
Object.defineProperty(window, name, {
get: function(){return value;},
set: function(){throw(name+' is a constant and cannot be redeclared.');},
});
}
// Example use
define('TAU', Math.PI*2);
答案 4 :(得分:3)
如果您想确保该值无法更改,请使用函数。
所以,而不是:
var Const_X=12
使用:
function Const_X() {
return 12;
}
答案 5 :(得分:3)
如果您只关心支持较新的浏览器(或使用像Babel这样的转换器来支持旧版浏览器),您可以执行以下操作:
export const FRUIT = "kiwi"; export const VEGETABLE = "carrot";
import * as Settings from './settings.js'
console.log("The unchangeable fruit is " + Settings.FRUIT);
这比尝试实现全局常量更简洁,特别是当您有多个JavaScript文件要使用常量时。
答案 6 :(得分:2)
该问题的直接答案是“否”。尽管ECMA / JS提供了一种轻松进行函数式编程的方法,但它确实会有所帮助。我用来解决此问题的可行方法是在全局范围内声明const并使用包装函数,请参见以下示例:
:)
global_var = 3; //This can change say inside a function etc. but once you decide to make
//this global variable into a constant by calling on a function
const make_variable_constant = function(variable)
{
const constant = variable;
return constant;
}
const const_global = make_variable_constant(global_var);
:)
当面向对象程序设计大肆宣传时,我班上的一个孩子告诉C讲师,C不是面向对象的,讲师说他甚至还没有想到Java和C ++之前就已经用C进行过面向对象编程。同样,您可以用Javascript进行函数式编程,但难度要大得多。就像在C ++中更容易进行面向对象的编程一样。
答案 7 :(得分:0)
记录下来。
// ES6+ code:
const CONSTGLOBAL1=200; // it is a constant global
function somef() {
document.write(CONSTGLOBAL1); // CONSTGLOBAL1 is defined (because it's global)
const CONSTLOCAL=200; // it's a local constant
document.write(CONSTLOCAL); // CONSTLOCAL is defined
}
somef();
document.write(CONSTLOCAL); // CONSTLOCALis NOT defined.
因此,如果常量在{}内定义,则它是局部的,否则它是全局的。
答案 8 :(得分:-1)
如果您不打算更改任何对象属性的值,可以使用 Object.freeze()
:
window.globalConst = Object.freeze( { x: 1, y: true } );
以下说明了 const
和 Object.freeze()
之间的区别:
const x = Object.freeze({
a: 1,
b: 2
});
x.a = 3;
// x.a is still = 1
console.log("x.a = ", x.a);
const y = {
a: 1,
b: 2
};
y.a = 3;
// y.a has been changed to 3
console.log("y.a = ", y.a);