Если бы вы программировали в 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 Анкет
Заметки:
- Объекты, которые манипулируют таким образом, не изменяют их ссылки. Так
Frozen_objectдаетВерноАнкет - Вы можете поместить любой вид
ОбъектАнкет Будь тоМассив,Функция,Класси т.п.
Вывод:
JavaScript – хороший язык, но у него есть некоторые дурацкие области, которые новичок не ожидал. Надеемся, что этот маленький урок в неизменности заставит вас понять эту область «науки». Теперь не будь раздражайте и дайте мне реакцию.: D. Просто шутка. А если серьезно, оставьте комментарий со своими мыслями.
Спасибо за чтение, TheCodrr
П.с. Вот мой последний проект, если вы заинтересованы:
Thecodrr/fdir
⚡ Самая быстрая библиотека Globing Crawler & Globing для Nodejs. Ползание 1M файлы в <1S
fdir в скорости. Он может легко ползти каталог, содержащий 1 миллион файлов в <1 секунду.
fdir Использует выразительный шаблон строителя для построения повышения Code Code Code.
fdir только использует Nodejs fs & Путь модули.
fdir поддерживает все версии.
🖮 Взломать: Расширение fdir чрезвычайно прост, теперь, когда новый API строителя здесь. Не стесняйтесь экспериментировать.
Поддерживать
Вам нравится этот проект? Поддержите меня, пожертвовав , создание проблемы, становятся звездным дневным или открывая запрос на тягу. Спасибо.
🚄 QuickStart
Монтаж
Вы можете установить с помощью npm :
$ npm i
Оригинал: “https://dev.to/thecodrr/constants-in-javascript-and-all-that-bulls-t-481k”