Reputation: 3024
What I want to do is to use as many immutable variables as possible, thus reducing the number of moving parts in my code. I want to use "var" and "let" only when it's necessary.
This won't work:
function constParam(const a){
alert('You want me to '+a+'!');
}
Any ideas?
Upvotes: 62
Views: 54652
Reputation: 12347
We can use ES6 destructuring to create constants from params
function test(...args) {
const [a, b, c] = args;
}
Although const
isn't immutable. If a
was an object a.x = 1
would also change x
on any outter reference to object a
I often use lodash
cloneDeep
on arguments before doing anything further on them
With Typescript we get type safety using readonly
, but that's a different topic
Upvotes: 5
Reputation: 5
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
Upvotes: -5
Reputation: 2674
For immutable structures I believe you're looking for Immutable.js.
As @Andreas_Gnyp is saying, until ES6 there is no let
/ const
in JavaScript. (Nor there will be function(const a) {...}
once ES6 is out and fully supported.) If you want to use const
, you can either implement your own const
feature, or start using ES6 notation with help of some third party ES6-to-ES5 compiler, such as Babel.
However, bear in mind that const
in ES6 notation does not make the variable immutable. E.g. const a = [1, 2]; a.push(3);
is a completely valid program and a
will become [1, 2, 3]
. const
will only prevent you from reassigning a
, so that you can't do a = []
or a = {}
or whatever once const a = [1, 2];
already defined (in that particular scope).
function hasConstantParameters(...args) {
const [a, b] = args;
}
Immutable.js will make sure that, when you define var a = fromJS([1, 2]);
and pass a
as a function parameter, in the receiving function a.push(3)
will not affect a
. Is this what you wanted to achieve?
Upvotes: 1
Reputation: 89603
This is what I do:
Instead of:
function F(const a, const b, const c, const d, const e, const f, const g){ // Invalid Code
// lorem
// ipsum
}
..Use:
function F(){const[a, b, c, d, e, f, g] = arguments;
// lorem
// ipsum
}
Upvotes: -1
Reputation: 664297
Function parameters will stay mutable bindings (like var
) in ES6, there's nothing you can do against that. Probably the best solution you get is to destructure the arguments
object in a const
initialisation:
function hasConstantParameters(const a, const b, const c, …) { // not possible
…
}
function hasConstantParameters() {
const [a, b, c, …] = arguments;
…
}
Notice that this function will have a different arity (.length
), if you need that you'll have to declare some placeholder parameters.
Upvotes: 71
Reputation: 780798
You can't make a parameter const
. Use it as the initial value of a local variable:
function constParam(a) {
const const_a = a;
...
}
Note also that const
is only supported in Internet Explorer as of IE11. See this compatibility table
Upvotes: 15
Reputation: 844
There is no way to force a parameter to be immutable in JavaScript. You have to keep track of that yourself.
Just write in a style where you happen not to mutate variables. The fact that the language doesn't provide any facilities to force you to do so doesn't mean that you can't still do it anyway.
Upvotes: 3