Приятные новости
Состоялся релиз TypeScript 5.4. В новой версии языка программирования, построенного на основе JavaScript и позволяющего объявлять и описывать типы, в Microsoft поработали над производительностью языка, добавили новые возможности автодополнения кода для редакторов и упростили способы переподключения библиотек. Типы также используются в инструментах редактора TypeScript, таких как автодополнение, навигация по коду и рефакторинг, которые доступны в Visual Studio и VS Code. Проект доступен через NuGet или
npm
(npm install -D typescript
).В TypeScript 5.4 появился новый тип утилиты
NoInfer
, добавлена поддержка вызовов require()
в пакете --moduleResolution
и --module save
, быстрое исправление при добавлении отсутствующих параметров, поддержка автоматического импорта для подпутей, исправлены ранее обнаруженные ошибки.С выходом TypeScript 5.4 Microsoft продолжает работу над TypeScript 5.5. Согласно дорожной карте, бета-версия этого проекта должна выйти 16 апреля, релиз-кандидат — 4 июня, а финальный релиз — 18 июня.
Что ж, ждём)
Также стало возможно запускать тестовые ночные сборки TypeScript 5.4 Nightlies через
npm
, которые выпускаются каждый день в полночь (npm install -D typescript@next
) для VS Code, Visual Studio, Sublime Text и IntelliJ.@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤3🔥2
Forwarded from React JS
This media is not supported in your browser
VIEW IN TELEGRAM
Тут на днях года состоялся релиз Boa v0.18 — экспериментального лексера, парсера и компилятора Javascript, а также движка ECMAScript, написанного на языке программирования Rust.
Разработчики пояснили, что этот выпуск Boa также знаменует собой серьёзное обновление дизайна сайта проекта и появление нового логотипа.
«Поскольку Boa используется все большим количеством проектов, важно, чтобы мы могли предоставить стабильный и надёжный API. Нам кажется, что мы ещё не достигли этого результата, но после обсуждения с командой мы решили нацелиться на выпуск версии 1.0 в ближайшем будущем. Это станет для нас важной вехой, и мы надеемся, что к тому времени у нас будет много новых функций и улучшений», — пояснили разработчики проекта.
Впервые проект Boa был представлен на конференции JSConf EU 2019 разработчиком Джейсоном Уильямсом.
4.6К
@react_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Никаких фреймворков или библиотек, только JS, HTML5 и CSS
Среди проектов:
Самое то, чтобы прокачать понимание JS, отточить работу с событиями, потренировать разные техники
Just JS it
https://javascript-mini-projects.netlify.app/
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤3🔥2🤔1
В JavaScript,
truthy
– это всё, что в логическом контексте считается истиной. Если что-то не является явно ложным (например, 0
или пустая строка ""
), то это truthy
.Это решает проблему непредсказуемости в условных конструкциях и логических операциях. Вместо того, чтобы каждый раз явно проверять каждое возможное значение на истинность или ложность, можно полагаться на общие правила. Это делает код более читаемым и лаконичным.
truthy
и falsy
.В JavaScript, если строка не пустая, она считается
truthy
, а пустая строка — это falsy
. Это значит, что вы можете использовать простую проверку, чтобы узнать, заполнено ли поле:let userName = form.userName.value; // значение, введённое пользователем
if (userName) {
// Если userName truthy
console.log("Спасибо за заполнение имени, " + userName + "!");
} else {
// Если userName falsy
console.log("Пожалуйста, заполните поле с именем.");
}
Этот пример показывает, как использование понятий
truthy
и falsy
может сделать ваш код более кратким и читаемым. Вместо того чтобы писать сложные условия для проверки, не является ли строка пустой, не равна ли она null
или undefined
, вы можете просто проверить, truthy
ли значение переменной.Примеры
falsy
значений включают:0
и -0
""
(пустая строка)null
undefined
NaN
Всё остальное в JavaScript считается
truthy
, включая:"0"
(строка, содержащая символ нуля)"false"
(строка, содержащая текст false){}
и массивы []
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤4🔥2
Полезная статья для лучшего понимания JavaScript.
В ней описывается:
— внутреннее устройство host-среды
— расширяемость и встраиваемость
— асинхронность
— инструменты организации многопоточности
— и ещё много всего
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6❤1
Согласно пояснению разработчиков проекта, Restate отлично подходит для создания:
В версии Restate 0.8 разработчики уделили большое внимание доработке API, учтя отзывы пользователей, чтобы уменьшить трудности при создании сервисов Restate. Также там добавлены комбинаторы промисов (Promise combinators), которые позволяют детерминированно комбинировать промисы. Например, если вы хотите дождаться вызова службы A или вызова службы B, то Restate позаботится о записи того, какой из промисов был выполнен первым, и в конечном итоге воспроизведёт этот выбор, когда это необходимо. В новой версии проекта доступны все комбинаторы стандартной библиотеки JavaScript.
Всё это звучит многообещающе, посмотрим)
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
It's just CSS
Эффект при наведении на картинку, выполненный на чистом CSS, без использования JavaScript.
https://codepen.io/tiffachoo/pen/wvyXRzL
Эффект при наведении на картинку, выполненный на чистом CSS, без использования JavaScript.
https://codepen.io/tiffachoo/pen/wvyXRzL
🎉12❤8👍6🔥4😱3
eval()
:eval("alert('Выполнено!');");
В результате появится всплывающее окно с текстом "Выполнено!".
Но будьте осторожны: функция
eval()
может выполнить любой скрипт, который ей будет предоставлен.Функция
eval()
обладает большими рисками для безопасности. Важно убедиться в том, что JavaScript-строка правильно обработана перед ее использованием в eval()
, так как инъекции кода могут иметь серьезные последствия.Альтернативы для запуска строк JavaScript
let func = new Function("return 'Привет, мир!';");
func(); // Привет, мир!
Этот метод умеет обходить внешний контекст.
В Node.js существует модуль
vm
, который предоставляет отдельный контекст для выполнения JavaScript-строк.const vm = require('vm');
const script = new vm.Script("console.log('Привет из VM');");
script.runInThisContext(); // Привет из VM
vm2
предоставляет ограниченное окружение для запуска ненадежного кода.const { VM } = require('vm2');
const vm = new VM();
vm.run("console.log('Выполнение в песочнице');"); // Выполнение в песочнице
Не забудьте следить за обновлениями в части безопасности и обратите внимание на устаревшие API в
vm2
, чтобы избежать проблем.Ни одна замена не сможет заменить добрые старые теги
<script>
, которые можно использовать для запуска JavaScript-строк с помощью jQuery.let code = "$('body').append('<p>Привет от jQuery!</p>');";
$('<script>').attr('type', 'text/javascript').text(code).appendTo('body'); // Привет от jQuery!
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤4🔥2
Мы работаем с Node.js, и нам нужно прочитать файл, строка за строкой. В Node есть API для такого типа функций, который называется
readLine
(полную документацию можно найти здесь). Это API событий, которые вы можете прослушивать следующим образом:
const fs = require('fs')
const readline = require('readline')
const reader = readline.createInterface({
input: fs.createReadStream('./file.txt'),
crlfDelay: Infinity
})
reader.on('line', (line) => console.log(line))
И допустим, у нас есть простой файл:
line 1
line 2
line 3
Если мы запустим этот код для созданного нами файла, то получим построчный вывод на консоль. Однако работа с событиями — не самый лучший способ получить сопровождаемый код, так как они срабатывают не по порядку, ну и не только.
В дополнение к API событий
readline
также предоставляет асинхронный итератор. Это означает, что вместо чтения строки через слушателей в событии line
мы будем читать строку при помощи нового способа использования ключевого слова for
.Представим, что у нас есть интерфейс, который всегда возвращает промис, разрешенный для нашей строки рассматриваемого файла. Чтобы разрешить эти промисы по порядку, нам нужно сделать примерно следующее:
async function readLine (files) {
for (const file of files) {
const line = await readFile(file) // Imagine readFile is our cursor
console.log(line)
}
}
Однако благодаря асинхронным итерациям (например,
readline
) мы можем сделать так:const fs = require('fs')
const readline = require('readline')
const reader = readline.createInterface({
input: fs.createReadStream('./xpto.txt'),
crlfDelay: Infinity
})
async function read () {
for await (const line of reader) {
console.log(line)
}
}
read()
Обратите внимание, что теперь мы используем новое определение
for
— for await (const x of y)
.@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🎉5🔥1🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
https://codepen.io/creativeocean/pen/gOvYEgq
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3❤2
Чтобы понять суть замыканий, мы сначала рассмотрим их характеристики:
— Даже если внешняя функция перестает существовать, замыкание по-прежнему имеет доступ к ее переменным.
— Замыкания не имеют доступа к параметру
args
своей внешней функции.Давайте разберем подробнее первый пункт. Это основная функциональность любого замыкания. В этом сама суть замыканий и принцип работы.
Чтобы увидеть это в действии, мы выполним вот эту функцию
buttonProps
:let buttonProps = (borderRadius) => {
const createVariantButtonProps = (variant, color) => {
const newProps = {
borderRadius,
variant,
color
};
return newProps;
}
return createVariantButtonProps;
}
let primaryButton = buttonProps("1rem");
Вызов функции
buttonProps
вернет нам другую функцию, которая является нашим замыканием.Теперь давайте выполним это замыкание:
const primaryButtonProps = primaryButton("primary", "red");
В результате выполнения замыкание возвращает следующий объект:
{
"borderRadius":"1rem",
"variant":"primary",
"color":"red"
}
borderRadius
)?@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5🔥1
String.fromCharCode()
возвращает строку, созданную из указанной последовательности значений единиц кода UTF-16.Синтаксис
String.fromCharCode(num1[, ...[, numN]]
num1, ..., numN
— Последовательность чисел, являющихся значениями единиц кода UTF-16. Диапазон составляет от 0 до 65535 (0xFFFF). Числа больше 0xFFFF усекаются. Проверка достоверности не производится.
Метод
String.fromCharCode()
возвращает примитивную строку, а не объект String
.Поскольку метод
fromCharCode()
является статическим методом объекта String
, вы всегда должны использовать его как String.fromCharCode()
, а не как метод созданного вами экземпляра String
.fromCharCode()
. String.fromCharCode(65, 66, 67); // "ABC"
Хотя большинство распространённых значений Юникода может быть представлено одним 16-битным числом (как ожидалось на ранней стадии стандартизации JavaScript) и метод
fromCharCode()
может использоваться для возврата одного символа для самых распространённых значений (точнее, значений UCS-2, которые являются подмножеством самых распространённых символов UTF-16), для работы со всеми допустимыми значениями Юникода (занимающими до 21 бита) одного метода fromCharCode()
недостаточно. Поскольку большие кодовые точки используют (самое меньшее) два «суррогатных» числа для представления одного символа, для возврата таких пар можно использовать метод String.fromCodePoint()
(являющийся частью черновика ES6) и, таким образом, адекватно представлять эти символы.@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4😁1🎉1
const isRelative = (path) => !/^([a-z]+:)?[\\/]/i.test(path);
isRelative('/foo/bar/baz'); // false
isRelative('C:\\foo\\bar\\baz'); // false
isRelative('foo/bar/baz.txt'); // true
isRelative('foo.md'); // true
const isHexColor = (color) => /^#([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i.test(color);
isHexColor('#012'); // true
isHexColor('#A1B2C3'); // true
isHexColor('012'); // false
isHexColor('#GHIJKL'); // false
const diffDays = (date, otherDate) => Math.ceil(Math.abs(date - otherDate) / (1000 * 60 * 60 * 24));
diffDays(new Date('2014-12-19'), new Date('2020-01-01')); // 1839
const copyToClipboard = (text) => navigator.clipboard.writeText(text);
copyToClipboard("Hello World");
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤3🔥3👎2
О чём говорится в статье:
vh
, vw
, vmin
и vmax
.svh
и svw
.nth-child
позволяет выбирать дочерние элементы по порядковому номеру и добавлять класс элемента.@scope
позволяет создавать пространства имён и задавать стили с ограниченной областью видимости.Enjoy)
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍7❤1