Рубрики
Без рубрики

Константы в JavaScript (и все эти быки ** т)

Если бы вы программировали в JavaScript на некоторое время, вы бы заметили, что это Const in Javasc … Tagged с JavaScript, Node, TypeScript.

Если бы вы программировали в JavaScript некоторое время, вы бы заметили, что const В JavaScript не означает, что вы не можете его изменить. Там также нет памяти, производительности или любого другого преимущества. Черт возьми!

Хорошо хорошо. Посмотрите на этот кусок кода:

const toastStatus = "burnt"; // why though?
// let's change this
toastStatus = "not ok";

Вы будете ожидать, что это даст ошибку, верно? Ага. Ты прав. Это дает эту ошибку:

Uncaught typeerror: Назначение постоянной переменной.

Все идет нормально. Допустим, мы хотим дать id до статуса тоста:

const toast = {
    id: "da_best_toast",
    status: "burnt"
};

И что -то происходит, и этот тост внезапно становится несгоревшим (случайно, конечно):

toast.status = "all ok"

Вы бы ожидали ту же старую ошибку, верно? Но угадайте, что? Нет ошибок. Даже не намек. Все в порядке (как сказал тост). Черт возьми! То же самое и с любым Объект (то есть массивы, объекты, классы, функции и т. Д.)

Wtf !!

Хорошо хорошо. Я думаю, что сейчас это достаточно хорошая напыщенная речь. Так в чем проблема?

Эта проблема

В JavaScript ничего не неизбежно. В JavaScript нет ничего неизменного. Все может стать чем угодно в JavaScript. Вот почему у вас есть TypeScript, но даже тогда в JavaScript есть некоторые причуды, которые заставит вас вытащить волосы.

Итак, что мы делаем, если хотим совершенной неизменности? Так, чтобы никто не мог изменить объект. Вообще?

Вы можете использовать стороннюю библиотеку, такую как: Необычный-JS или погрузить . Но почему? Почему, почему, почему? Когда JavaScript может сделать это, но по какой -то причине не делает это по умолчанию (через const ключевое слово)?

Если вы уже не заметили: объекты расширяются в JavaScript. Это означает, что вы можете добавить, удалить или редактировать без каких -либо ограничений. Любой объект. Даже стандартные такие, как Глобал или окно . Теперь я понимаю, что это крутая вещь и все Но у него много, много недостатков. Итак, давайте попробуем сделать наши объекты … постоянные.

Решение ..s

Object.Freeze:

От mdn:

Метод Object.Freeze () замораживает объект. Замороженный объект больше не может быть изменен; Замораживание объекта предотвращает добавление новых свойств к нему, существующие свойства удаляются, предотвращает изменение перечисления, конфигурации или записи существующих свойств и предотвращает изменение значений существующих свойств. Кроме того, замораживание объекта также предотвращает изменение его прототипа. Freeze () возвращает тот же объект, который был передан.

Я думаю, ты понял. Это делает ваш объект неизменным. Навсегда.

Вот тот же пример, что и выше:

const toast = Object.freeze({
    id: "da_best_toast",
    status: "burnt"
});

Теперь, если вы хотите изменить статус таким:

toast.status = "all ok"

Это даст эту ошибку (быть хорошим ребенком и включить строгий режим ):

TypeError: не может назначить только свойство «Готово» объекта ‘#

А также Позже, если вы случайно добавите другое свойство:

toast.bread = "baba bread";

Это даст еще одну ошибку:

TypeError: не удается добавить хлеб свойств, объект не расширяется

А потом, если вы попытаетесь удалить Статус (случайно, конечно):

delete toast.status

Вы получите:

TypeError: не удается удалить свойство «выполнено» #

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

function im(obj){
    return Object.freeze(obj)
}

// and then use it like so:

const immutable = im({ data: "some_data" });

И если вы хотите проверить, заморожен ли объект, просто сделайте:

Object.isFrozen(toast); // === true

Теперь, что если вы хотите отказаться от добавления/удаления только новых свойств, но не позволяют изменять существующие свойства. Другими словами, что, если вы хотите «частичной» неизменности?

Ну, для этого у вас есть:

Object.seal:

От mdn:

Object.Seal () Метод герметизирует объект, предотвращая добавление новых свойств к нему и маркировку всех существующих свойств как неконфигурируемые. Значения нынешних свойств все еще могут быть изменены до тех пор, пока они доступны для записи.

Таким образом, в основном это позволит отредактировать только существующие свойства (не удаленные). Давайте посмотрим пример.

const network = Object.seal({
    stable: true,
    speed: "50mbps",
    status: "connected"
});

// let's suppose, the network is disconnected suddenly, you'd simply do:
network.status = "disconnected";

// however if you wanted to add upstream speed, it will throw:
network.upstream = "25mbps";

// or if you try and delete, it will also throw.
delete network.stable

Вы можете легко проверить, закрыт ли объект или не используется:

Object.isSealed(network); // === true

Все идет нормально. Но что, если вы хотите запретить только дополнения, но разрешить изменения и удаления? Для этого у вас есть Object.preventextensions Анкет

Object.preventextensions

От mdn:

Object.preventextensions () Метод предотвращает добавление новых свойств в объект (то есть предотвращает будущие расширения объекта).

Посмотрим пример:

const person = Object.preventExtensions({
    name: "Baker Yota",
    age: 35,
});

// now let's say you wanted to add a new property, it will throw.
person.father = "Samhil Yota"

// But you can edit the age:
person.age = 36;

// And delete it too:
delete person.age;

И если вы хотите проверить, расширяется ли объект или нет, просто сделайте:

Object.isExtensible(person); // === false

Итак, у вас есть: Неизменность в JavaScript Анкет

Заметки:

  1. Объекты, которые манипулируют таким образом, не изменяют их ссылки. Так Frozen_object дает Верно Анкет
  2. Вы можете поместить любой вид Объект Анкет Будь то Массив , Функция , Класс и т.п.

Вывод:

JavaScript – хороший язык, но у него есть некоторые дурацкие области, которые новичок не ожидал. Надеемся, что этот маленький урок в неизменности заставит вас понять эту область «науки». Теперь не будь раздражайте и дайте мне реакцию.: D. Просто шутка. А если серьезно, оставьте комментарий со своими мыслями.

Спасибо за чтение, TheCodrr

П.с. Вот мой последний проект, если вы заинтересованы:

Thecodrr/fdir

⚡ Самая быстрая библиотека Globing Crawler & Globing для Nodejs. Ползание 1M файлы в <1S

Самый быстрый: Ничего подобного (в мире Nodejs) удары fdir в скорости. Он может легко ползти каталог, содержащий 1 миллион файлов в <1 секунду.

💡 Глупо просто: fdir Использует выразительный шаблон строителя для построения повышения Code Code Code.

🤖 Нулевые зависимости: fdir только использует Nodejs fs & Путь модули.

🕺 Удивительно маленький: <2 КБ по размеру gzipped & minified.

🔥 Все версии узлов поддерживаются: В отличие от других подобных библиотек, которые отказались от поддержки версий узлов <10, fdir поддерживает все версии.

🖮 Взломать: Расширение fdir чрезвычайно прост, теперь, когда новый API строителя здесь. Не стесняйтесь экспериментировать.

Поддерживать

Вам нравится этот проект? Поддержите меня, пожертвовав , создание проблемы, становятся звездным дневным или открывая запрос на тягу. Спасибо.

🚄 QuickStart

Монтаж

Вы можете установить с помощью npm :

$ npm i

Оригинал: “https://dev.to/thecodrr/constants-in-javascript-and-all-that-bulls-t-481k”