JavaScript const Ключевое слово

Является ли ключевое слово const в JavaScript создавать неизменяемую ссылку на неизменяемые структуры данных? [Я предполагаю, что в JavaScript существуют неизменные структуры данных.]

Для string это выглядит так:

var x = "asdf";
const constantX = x;

alert("before mutation: " + constantX);
x = "mutated"
alert("after mutation: " + constantX);

выход:

перед мутацией: asdf

после мутации: asdf

http://jsfiddle.net/hVJ2a/

Ответ 1

Да, он создает неизменяемую ссылку, но не стандартизирован и не поддерживается во всех браузерах.

См. эту статью MDN в ключе const для получения подробной информации и совместимости.

Однако он не делает ничего, чтобы установить ссылочную структуру данных как неизменяемую. Ниже приведено несколько ответов на этот вопрос, используя, например, Object.freeze

Ответ 2

сначала вы не изменяете строку, вы переназначаете ссылку.

Вы правы, что const недоступен во всех распространенных браузерах. Но даже если это было, этого недостаточно. 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 использует обычные javacript-структуры данных, вы также должны их использовать. В противном случае вам нужно будет преобразовать между изменяемыми и неизменяемыми на границе между вашим кодом и angular.

следует:

IMO Ваши единственные практические возможности для осуществления реального функционального программирования для приложений для браузеров приложений - это подождать, пока что-то вроде ClojureScript созреет. ClojureScript перезагружает библиотечную экосистему, так как библиотеки записываются, по умолчанию они используют неизменяемые структуры данных.

Разумеется, вы можете делать полупродуманное функциональное программирование в javascript с помощью таких инструментов, как underscore.js и Facebook React, что я и делаю для создания webapps, которые я создаю, Но вы должны установить неизменность по соглашению, и люди будут мутировать вещи в результате несчастного случая или потому, что они не знают ничего лучшего, и вам приходится решать эти проблемы.

Ответ 3

Неправильно. Это не является неизменным из документации MDN для const:

Объявление const создает доступную только для чтения ссылку на значение. Это не означает, что значение, которое оно содержит, является неизменным, просто то, что идентификатор переменной не может быть переназначен.

Ответ 4

Единственная неизменяемая структура данных (то, что выделяется в куче) - это строка. По умолчанию все другие объекты, такие как объекты, массивы и функции, изменяются.

const создает неизменяемую переменную. Да, "константной переменной" звучит спорно, но это ближайший срок я могу придумать для JS.

Содержимое const не может быть изменено вне его объявления. Но он может содержать ссылку, например, на объект, который изменяет сам по себе. Таким образом, вы можете изменить свои свойства с помощью этой ссылки const.

И если вы хотите сделать объект неизменным, то существует метод Object.freeze(obj).

Ответ 5

Вы можете создавать значения 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

Ответ 6

Да, это правильно. Константа будет объявлять константу только для чтения. Изменение значения не будет иметь эффекта.

Ссылка для const на MDN:

Const создает константу, которая может быть глобальной или локальной для функции, в которой она объявлена. Константы следуют тем же правилам области, что и переменные.

Значение константы не может быть изменено путем повторного назначения, и константа не может быть повторно объявлена. Из-за этого, хотя можно объявить константу без ее инициализации, было бы бесполезно сделать это.

Константа не может делить свое имя с функцией или переменной в той же области.

Здесь матрица совместимости браузера.

Ответ 7

const - это предлагаемая функция ECMAScript (вместе с соответствующим блочным областью, пусть предполагается, что она заменяет var и неявный глобальный), ECMAScript Harmony - это захватывающая идея для следующих версий ECMAScript.

Если вы ищете переменную только для чтения, вы можете сделать это следующим образом:

var constants = new (function() {
  var x = 200;
  this.getX = function() { return x; };
 })();

Вы можете использовать это как

constants.getX()

Ответ 8

Например:

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."