Nodejs中如何定義JavaScript常量?

Nodejs中如何定義JavaScript常量?

<p>例如可以使用</p>

<pre><code>const PI = 3.14159265; </code></pre>

<p>但如何把對象的成員定義爲常量?例如,我想這樣,但是卻不可以:</p>

<pre><code>const MathLib.PI = 3.14159265; </code></pre>

6 回复

Node.js 中如何定义 JavaScript 常量?

在 Node.js 中,定义常量通常使用 const 关键字。这与浏览器环境中的 JavaScript 定义方式相同。例如,你可以定义一个简单的常量:

const PI = 3.14159265;
console.log(PI); // 输出: 3.14159265

然而,当你尝试将对象的成员定义为常量时,可能会遇到一些问题。例如,下面的代码会引发错误:

const MathLib.PI = 3.14159265; // 这行代码会引发错误

这是因为你不能直接将属性添加到一个尚未声明为常量的对象上。你需要先声明一个对象为常量,然后再给它赋值。

如何正确地定义对象的常量属性

正确的做法是首先声明一个对象为常量,然后在该对象上定义常量属性。例如:

const MathLib = {}; // 首先声明一个对象为常量
MathLib.PI = 3.14159265; // 然后给对象添加常量属性

console.log(MathLib.PI); // 输出: 3.14159265

这样做的好处是,MathLib 对象本身是不可变的(即你不能重新分配 MathLib 变量),但它的属性可以被修改。如果你希望整个 MathLib 对象及其所有属性都是完全不可变的,可以使用 Object.freeze() 方法来冻结对象:

const MathLib = Object.freeze({
  PI: 3.14159265,
  E: 2.718281828459045
});

console.log(MathLib.PI); // 输出: 3.14159265
// 尝试修改 PI 的值会导致错误
MathLib.PI = 4.0; // 该操作不会改变 MathLib.PI 的值
console.log(MathLib.PI); // 输出: 3.14159265

通过这种方式,你可以确保 MathLib 对象及其所有属性都是不可变的,从而提高代码的稳定性和可维护性。


一般不推荐使用 const 关键字,因为它不是 ECMAScript 语法的一部分。

当需要常量的时候一般是以命名习惯来约束的,亦即使用大写字母加下划线。

如果需要“真正的”常量的话,可以使用 ECMA 5 的 defineProperty 方法,

例如:

var M = {};
Object.defineProperty(M, 'PI', {
  get: function() { return 3.14; }
});

或者

var M = {};
Object.defineProperty(M, 'PI', {
  value: 3.14,
  writable: false
});

注意由于这个方法是 ECMA 5 的一部分,所以在 node 上用是完全没有问题的,但是就请不要在浏览器端用了(除非不打算支持 IE 以及一些旧版本的浏览器用户)。

关于 defineProperty 的详细用法可以参考 MDNJohn Resig 的 blog

這種定義方法看起來很不優美啊,大家都是依靠約定大寫字母加下劃線來定義常量的嗎?

嗯,一直一来都是靠约定俗成的方式用大写字母定义常量的,关于代码风格的问题可以参考 Google JavaScript Style GuideFelix’s Node.js Style Guide

然而,const将会成为ECMAScript 6标准中的一部分,但是将会有不同的语义:使用const声明的常量会和使用let语句声明的变量一样,拥有块级作用域. ---------引自MDN

在 Node.js 中定义 JavaScript 常量可以使用 const 关键字。这与浏览器环境中的用法是相同的。对于对象成员,你可以通过在对象上定义属性并将该属性声明为常量来实现。

示例代码

假设你想定义一个数学库,并希望将一些常用的数学常量存储在这个库中:

// 定义 MathLib 对象
const MathLib = {};

// 将 PI 定义为 MathLib 的一个常量属性
Object.defineProperty(MathLib, 'PI', {
  value: 3.14159265,
  writable: false, // 确保 PI 不可被修改
  enumerable: true, // 可枚举
  configurable: false // 不可重新配置
});

console.log(MathLib.PI); // 输出 3.14159265

// 尝试修改 PI 的值
MathLib.PI = 3.14;
console.log(MathLib.PI); // 仍然输出 3.14159265

解释

  • const 关键字:用于声明不可变的变量。声明后,变量的引用不能改变。
  • Object.defineProperty 方法:允许你在对象上定义新的属性,并设置其描述符。这里我们设置了 writable: false 来确保属性不可写(即不可修改),configurable: false 来确保属性不可删除或重新配置。

这种方式确保了 MathLib.PI 是只读的,并且一旦定义就不能再修改。

回到顶部