【发布时间】:2015-07-30 14:55:39
【问题描述】:
我想要做的是尽可能多地使用不可变变量,从而减少代码中移动部分的数量。我只想在必要时使用“var”和“let”。
这行不通:
function constParam(const a){
alert('You want me to '+a+'!');
}
有什么想法吗?
【问题讨论】:
标签: javascript ecmascript-6 constants
我想要做的是尽可能多地使用不可变变量,从而减少代码中移动部分的数量。我只想在必要时使用“var”和“let”。
这行不通:
function constParam(const a){
alert('You want me to '+a+'!');
}
有什么想法吗?
【问题讨论】:
标签: javascript ecmascript-6 constants
函数参数在 ES6 中将保持可变绑定(如 var),对此您无能为力。您得到的最佳解决方案可能是在 const 初始化中解构 arguments object:
function hasConstantParameters(const a, const b, const c, …) { // not possible
…
}
function hasConstantParameters() {
const [a, b, c, …] = arguments;
…
}
请注意,此函数将具有不同的元数 (.length),如果需要,您必须声明一些占位符参数。
【讨论】:
function hasConstantParameters(...args) { const [a, b] = args; }; 怎么样?
args),并且我故意在通常的位置不放置任何参数,而是将所有内容都移到了 const 声明中。
.length 属性提供
您不能创建参数const。将其用作局部变量的初始值:
function constParam(a) {
const const_a = a;
...
}
另请注意,const 仅在 IE11 起的 Internet Explorer 中受支持。看到这个compatibility table
【讨论】:
对于不可变结构,我相信您正在寻找Immutable.js。
正如@Andreas_Gnyp 所说,在 ES6 之前,JavaScript 中没有 let / const。 (一旦 ES6 出来并得到完全支持,也不会有 function(const a) {...}。)如果你想使用 const,你可以实现自己的 const 功能,或者在一些第三方 ES6 的帮助下开始使用 ES6 表示法- to-ES5 编译器,如Babel。
但是,请记住,ES6 表示法中的const不会使变量不可变。例如。 const a = [1, 2]; a.push(3); 是一个完全有效的程序,a 将变为 [1, 2, 3]。 const只会阻止你重新分配a,这样你就不能再分配a = []或a = {}或一旦const a = [1, 2];已经定义了(在那个特定的范围内)。
function hasConstantParameters(...args) {
const [a, b] = args;
}
Immutable.js 将确保,当您定义var a = fromJS([1, 2]); 并将a 作为函数参数传递时,在接收函数中a.push(3) 不会影响a。这是你想要达到的目标吗?
【讨论】:
没有办法强制参数在 JavaScript 中是不可变的。您必须自己跟踪。
只要写出你碰巧不会改变变量的风格。语言没有提供任何工具强制你这样做并不意味着你仍然不能这样做。
【讨论】:
我们可以使用 ES6 解构从参数创建常量
function test(...args) {
const [a, b, c] = args;
}
【讨论】:
这就是我的工作:
代替:
function F(const a, const b, const c, const d, const e, const f, const g){ // Invalid Code
// lorem
// ipsum
}
..使用:
function F(){const[a, b, c, d, e, f, g] = arguments;
// lorem
// ipsum
}
【讨论】:
首先,JS 中没有常量(直到 ECMAScript 6 提案)。您将不得不使用var 来构建类似的东西。如果你想在你的 JS 代码中拥有“私有”区域,你可以使用该语言的特性之一,即作用域。
所以,例如,像这样:
var kindaConstant = function(){
var donttouchthis
... do something with it
return whateveryouvedonewithit
}
在这种情况下,donttouchthis 并不那么容易从“外部”改变。
【讨论】:
function wrapper(i){
const C=i
return new Function("a","b", "return a+b+"+C)
}
f100 = wrapper(100) //ƒ anonymous(a,b/*``*/) {return a+b+100}
f100(1,2) //OUTPUT 103
f200 = wrapper(200) //ƒ anonymous(a,b/*``*/) {return a+b+200}
f200(1,2) //OUTPUT 203
【讨论】: