Ключевое слово JavaScript const
Ли const
ключевое слово в JavaScript создать неизменную ссылку на неизменные структуры данных? [Я предполагаю, что неизменяемые структуры данных существуют в JavaScript.]
За string
похоже, для этого:
var x = "asdf";
const constantX = x;
alert("before mutation: " + constantX);
x = "mutated"
alert("after mutation: " + constantX);
выход:
до мутации: asdf
после мутации: asdf
8 ответов
Да, он создает неизменную ссылку, но он не стандартизирован и поддерживается не во всех браузерах.
Смотрите эту статью MDN на const
ключевое слово для деталей и совместимости.
Однако он не делает ничего, чтобы установить ссылочную структуру данных как неизменную. Несколько ответов ниже, чтобы ответить на этот вопрос, используя, например, Object.freeze
Сначала вы не изменяете строку, вы переназначаете ссылку.
Ты прав что const
не доступно во всех распространенных браузерах. Но даже если бы это было так, этого недостаточно. const
предотвратит переназначение ссылки - но если у вас есть постоянная ссылка на изменяемый объект, вы не достигли очень многого.
const var o = { foo: 'bar' };
o = { foo: 'baz'}; // throws
o.foo = 'baz'; // allowed
Итак, это подводит нас к вашему вопросу: есть ли у js неизменные структуры данных? Нет, JS не идет с ними. Неизменяемые структуры данных могут быть закодированы как библиотека - и назначение даже не определено, поэтому o.foo = 'baz'
даже не имеет смысла. Вы должны написать это как const var o2 = o.assoc('foo', 'baz')
который вернет совершенно новый объект o2
вместо того, чтобы мутировать o
Но неизменные структуры данных как библиотека не имеют большого значения, если их никто не использует. Например, если angular использует обычные структуры данных javascript, вы должны использовать их тоже. В противном случае вам придется конвертировать между изменяемым и неизменным на границе между вашим кодом и угловым.
Мнение следующее:
ИМО. Единственные практические возможности для создания реального функционального программирования для производственных браузерных приложений - это ждать, пока что-то вроде ClojureScript станет зрелым. ClojureScript перезагружает библиотечную экосистему, поэтому по мере написания библиотек они используют неизменяемые структуры данных по умолчанию.
Конечно, вы можете выполнять полусгоревшее функциональное программирование в javascript, используя такие инструменты, как underscore.js и Facebook React, что я и делаю для рабочих веб-приложений, которые я создаю. Но вы должны установить неизменность по соглашению, и люди будут мутировать вещи случайно или потому, что они не знают ничего лучше, и вам придется справляться с этими проблемами.
Неправильно. Это не является неизменным, из MDN:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const
Объявление const создает доступную только для чтения ссылку на значение. Это не означает, что значение, которое оно содержит, является неизменным, просто то, что идентификатор переменной не может быть переназначен.
Единственная неизменная структура данных (то, что размещается в куче) - это строка. Все остальные объекты, такие как объекты, массивы и функции, по умолчанию являются изменяемыми.
const
создает неизменяемую переменную. Да, "константной переменной" звучит спорно, но это ближайший срок я могу придумать для JS.
Содержимое const не может быть изменено вне его декларации. Но он может содержать ссылку, например, на объект, который изменчив сам по себе. Таким образом, вы можете изменить его свойства через эту константную ссылку на него.
И если вы хотите сделать объект неизменным, тогда существует метод Object.freeze(obj).
Вы можете создавать значения, подобные CONST, используя ES5 Object.defineProperty. Неприятная часть в том, что она должна быть привязана к объекту
CONSTS = {};
Object.defineProperty(CONSTS, 'FOO', {
value: 'bar'
});
CONSTS.FOO = 'derp' // Will throw error in strict mode
delete CONSTS.FOO // will throw error in strict mode
Да, именно так. Const объявляет только именованную константу только для чтения. Изменение его значения не будет иметь никакого эффекта.
Ссылка для const на MDN:
Const создает константу, которая может быть глобальной или локальной для функции, в которой она объявлена. Константы следуют тем же правилам области видимости, что и переменные.
Значение константы не может быть изменено посредством переназначения, и константа не может быть повторно объявлена. Из-за этого, хотя можно объявить константу без ее инициализации, это было бы бесполезно.
Константа не может делиться своим именем с функцией или переменной в той же области видимости.
Например:
const basket = [1,2,3];
//Even though the variable is declared as const this one works
basket[0] = 1111;
console.log(basket);
//This one throws an error
basket = "Other primitive type."
const - это предлагаемая особенность ECMAScript(вместе с правильно заданной областью действия пусть он должен заменить var и неявный global). ECMAScript Harmony - это набор идей для следующих версий ECMAScript.
Если вы ищете переменную только для чтения, вы можете сделать это
var constants = new (function() {
var x = 200;
this.getX = function() { return x; };
})();
Вы можете использовать как это
constants.getX()