Преобразование и приведение типов | JavaScript Camp
Приведение типов (type coercion)
Это автоматическое или неявное преобразование значений из одного типа данных в другой (например, строки в число). Преобразование типа похоже на приведение типа, потому что они оба преобразуют значения из одного типа данных в другой с одним ключевым🗝️ различием — приведение типа является неявным, тогда как преобразование типа может быть неявным или явным.
Примеры 👇 :
function learnJavaScript() { const value1 = ‘5’ const value2 = 9 let sum = value1 + value2 return sum }
Loading…
В приведённом выше примере JavaScript приводит число 9
в строку, а затем объединяет два 2️⃣ значения вместе, в результате получается строка 59
. JavaScript имел выбор между строкой или числом и решил использовать строку.
Компилятор мог привести строку 5
к числу и вернуть сумму 14
, но он этого не сделал. Чтобы получить этот результат, вам нужно явно преобразовать строку 5
в число, используя метод Number()
👇 :
function learnJavaScript() { const value1 = ‘5’ const value2 = 9 let sum = Number(value1) + value2 return sum }
Loading…
Видео
Преобразование типов (type conversion)
Означает передачу данных из одного типа данных в другой. Неявное преобразование происходит, когда компилятор автоматически присваивает (назначает) типы данных, но исходный код📟 также может явно требовать преобразования для завершения.
Строковое преобразование
Строковое преобразование происходит, когда требуется представление чего-либо в виде строки. Например, мы можем использовать функцию String(value)
, чтобы преобразовать значение к строке 👇 :
function learnJavaScript() { let value = true // boolean value = String(value) return typeof value }
Loading…
Преобразование происходит очевидным образом. true
✅ становится "true"
✅
Численное преобразование
Численное преобразование происходит в математических функциях⚙️ и выражениях.
function learnJavaScript() { let value = ‘6’ / ‘2’ return value }
Loading…
Мы можем использовать функцию Number(value)
, чтобы явно преобразовать value
к числу 👇 :
function learnJavaScript() { let str = ‘123’ let num = Number(str) return typeof num }
Loading. ..
Явное преобразование часто применяется, когда мы ожидаем получить число из строкового контекста, например из текстовых 📜 полей форм.
Если строка не может быть явно приведена к числу, то результатом преобразования будет NaN
(англ. Not-a-Number, «не число»). Например 👇:
function learnJavaScript() { let age = Number(‘Любая строка вместо числа’) return age }
Loading…
Правила численного преобразования:
Значение | Преобразуется в… |
---|---|
undefined | NaN |
null | 0 |
true / false | 1 / 0 |
string | Пробельные символы по краям обрезаются. Далее, если остаётся пустая строка, то получаем 0, иначе из непустой строки «считывается» число. При ошибке🙅♂️ результат NaN. |
Примеры:
Number(' 123 ') // 123
Number('123z') // NaN (ошибка чтения числа на месте символа "z")
Number(true) // 1
Number(false) // 0
Number(null) // 0
Number(undefined) // NaN
Учтите, что null
и undefined
ведут себя по-разному. Так, null
становится нулём, тогда как undefined
приводится к NaN
.
Логическое преобразование
Логическое преобразование самое простое. Происходит в логических операциях, но также может быть выполнено явно с помощью функции⚙️ Boolean(value)
.
Правила логического преобразования:
Значения, которые интуитивно «пустые», вроде 0
, пустой строки, null
, undefined
и NaN
, становятся false
. Все остальные значения становятся true
.
Boolean(1) // true
Boolean(0) // false
Boolean('Привет!') // true
Boolean('') // false
Более короткий способ функкции Boolean
двойное НЕ(!!) используют для преобразования значений к логическому типу:
!!'non-empty string' // true
!!null // false
То есть первое НЕ преобразует значение в логическое значение и возвращает обратное, а второе НЕ снова инвертирует его. В конце мы имеем простое преобразование значения в логическое.
Заметим, что строчка с нулём «0» — это true
Некоторые языки👅 (к примеру, PHP) воспринимают строку "0"
как false
. Но в JavaScript, если строка не пустая, то она всегда true
Boolean('0') // true
Boolean(' ') // пробел это тоже true (любая непустая строка это true)
Проблемы?
Пишите в Discord или телеграмм чат, а также подписывайтесь на наши новости
Вопросы:
Какую функцию нужно использовать для строкового преобразования?
Boolean(value)
String(value)
Number(value)
Что такое приведение типов?
- Передача данных из одного типа в другой
- Преобразование значений из одного типа данных в другой
- Представление чего-либо в виде строки
Какое ключевое различие между приведением типов и преобразованием типов?
- Приведение типа явное, а преобразование типа неявное
- Приведение типа неявное, а преобразование типа явное
- Приведение типа неявное, а преобразование типа может быть и явным и неявным
В каком случае результатом преобразования будет NaN
?
- Когда строка не может быть явно приведена к числу
- Когда число не может быть явно приведено к строке
- Когда в коде есть ошибка
Чем становятся «пустые» значения при преобразовании?
null
true
false
Для того чтобы понять, на сколько вы усвоили этот урок, пройдите тест в мобильном приложении нашей школы по этой теме или в нашем телеграм боте.
Ссылки:
- MDN web docs — Приведение типов
- для подростков: прекрасное руководство по программированию для начинающих, том 1: Javascript — Jeremy Moritz
- JavaScript.ru
- Арифметические действия с целыми числами
Contributors ✨
Thanks goes to these wonderful people (emoji key):
Dmitriy Vasilev 📖💵 | Resoner2005 🐛 🎨 🖋 |
Приведение и проверка типов — Kotlin
Операторы is и !is
Используйте оператор is
или его отрицание !is
, чтобы проверить соответствует ли объект заданному типу
во время исполнения.
if (obj is String) { print(obj.length) } if (obj !is String) { // то же самое, что и !(obj is String) print("Not a String") } else { print(obj.length) }
Умные приведения
В большинстве случаев вам не нужно использовать явные приведения в Kotlin,
потому что компилятор отслеживает is
-проверки и явные преобразования
для неизменяемых значений и вставляет (безопасно) приведения автоматически, там, где они нужны.
fun demo(x: Any) { if (x is String) { print(x.length) // x автоматически преобразовывается в String } }
Компилятор достаточно умён для того, чтобы понимать, что приведения безопасны в случаях,
когда проверка на несоответствие типу (!is
) приводит к выходу из функции:
if (x !is String) return print(x.length) // x автоматически преобразовывается в String
или в случаях, когда приводимая переменная находится справа от оператора
или ||
, а соответствующая проверка
(обычная или отрицательная) находится слева:
// x автоматически преобразовывается в String справа от `||` if (x !is String || x.length == 0) return // x автоматически преобразовывается в String справа от `&&` if (x is String && x.length > 0) { print(x.length) // x автоматически преобразовывается в String }
Умные приведения работают вместе с when
-выражениями
и циклами while
:
when (x) { is Int -> print(x + 1) is String -> print(x. length + 1) is IntArray -> print(x.sum()) }
Заметьте, что умные приведения работают только тогда, когда компилятор может гарантировать, что переменная не изменится между проверкой и использованием. Точнее говоря, умные приведения будут работать:
- с локальными
val
переменными — всегда за исключением локальных делегированных свойств.; - с
val
свойствами — если поле имеет модификатор доступаprivate
илиinternal
, или проверка происходит в том же модуле, в котором объявлено это свойство. Умные приведения неприменимы к публичным свойствам или свойствам, которые имеют переопределённые getter’ы; - с локальными
var
переменными — если переменная не изменяется между проверкой и использованием, не захватывается лямбдой, которая её модифицирует и не является локальным делегированным свойством; - с
var
свойствами — никогда, потому что переменная может быть изменена в любое время другим кодом.
Оператор «небезопасного» приведения
Обычно оператор приведения выбрасывает исключение, если приведение невозможно, поэтому мы называем его as
:
val x: String = y as String
Заметьте, что null
не может быть приведен к String
, так как String
не является nullable,
т.е. если y
— null, код выше выбросит исключение. Чтобы сделать этот код корректным для null-значений,
используйте nullable-тип в правой части приведения.
val x: String? = y as String?
Оператор «безопасного» (nullable) приведения
Чтобы избежать исключения, вы можете использовать оператор безопасного приведения as?
, который возвращает null
в
случае неудачи.
val x: String? = y as? String
Заметьте, что несмотря на то, что справа от as?
стоит non-null тип String
, результат приведения является nullable.
Стирание и проверка типов у Обобщений (Generics)
Котлин обеспечивает типобезопасность операций, связанных с обобщениями на этапе компиляции, в то время как информация о типе аргумента обобщения недоступна во время выполнения программы. Например, дляList<Foo>
происходит стирание типа, что превращает его в List<*>
. В связи с чем,
нет способа проверить, принадлежит ли объект конкретному типу во время выполнения программы.Учитывая это, компилятор запрещает is
-проверки, которые не могут быть выполнены во время выполнения программы
из-за стирания типов, например ints is List<Int>
или list is T
(параметризированный тип).
Однако у вас есть возможность произвести проверку со «звёздными» проекциями.
if (something is List<*>) { something.forEach { println(it) } // Элементы типа `Any?` }
Таким же образом, когда у вас есть статически определенный тип аргумента, вы можете произвести is
-проверку
или приведение с необобщенной частью типа.
fun handleStrings(list: List<String>) { if (list is ArrayList) { // `list` приводится к `ArrayList<String>` путём "умного приведения" } }
Аналогичный синтаксис, но с пропущенным типом аргумента может использоваться для приведений,
которые не принимают типы аргументы: list as ArrayList
.
Встроенные (inline) функции с параметрами вещественного типа имеют свои
аргументы типа, встроенные на каждый момент вызова, что позволяет arg is T
проверять параметризованный тип, но если arg
является объектом обобщенного типа, его аргумент типа по-прежнему стираются.
inline fun <reified A, reified B> Pair<*, *>.asPairOf(): Pair<A, B>? { if (first !is A || second !is B) return null return first as A to second as B } val somePair: Pair<Any?, Any?> = "items" to listOf(1, 2, 3) val stringToSomething = somePair.asPairOf<String, Any>() val stringToInt = somePair. asPairOf<String, Int>() val stringToList = somePair.asPairOf<String, List<*>>() val stringToStringList = somePair.asPairOf<String, List<String>>() // Нарушает типобезопасность! fun main() { println("stringToSomething = " + stringToSomething) println("stringToInt = " + stringToInt) println("stringToList = " + stringToList) println("stringToStringList = " + stringToStringList) //println(stringToStringList?.second?.forEach() {it.length}) // Это вызовет исключение ClassCastException, так как элементы списка не являются строками }
Непроверяемые (Unchecked) приведения
Как упоминалось выше, стирание типов делает невозможным проверку типа аргумента обобщения на этапе выполнения, и обобщенные типы в коде могут быть недостаточно связаны друг с другом, чтобы компилятор обеспечил типобезопасность.
Тем не менее иногда мы имеем программную логику высокого уровня, которая подразумевает типобезопасность.
fun readDictionary(file: File): Map<String, *> = file. inputStream().use { TODO("Прочитать сопоставление строк с произвольными элементами.") } // Мы сохранили словарь (map) `Int`ов в файл val intsFile = File("ints.dictionary") // Warning: Unchecked cast: `Map<String, *>` to `Map<String, Int>` val intsDictionary: Map<String, Int> = readDictionary(intsFile) as Map<String, Int>
Компилятор выдает предупреждение для приведения в последней строке. Приведение не может быть полностью проверено во
время выполнения и нет дает гарантии, что значения в словаре (map) являются Int
.
Чтобы избежать непроверяемые приведения, вы можете изменить структуру программы: в примере выше
возможно объявить интерфейсы DictionaryReader<T>
и DictionaryWriter<T>
с типобезопасными имплементациями для различных типов. Правильное использование
вариативности обобщений также может помочь.
Для обобщенных функций, используемых встроенные (inline) функции с
параметрами вещественного типа приведение типа arg as T
является
проверяемым, до тех пор, пока тип arg
не имеет свои аргументы типа, которые были стерты.
Предупреждение о непроверяемом приведении можно убрать используя аннотации @Suppress("UNCHECKED_CAST")
.
inline fun <reified T> List<*>.asListOfType(): List<T>? = if (all { it is T }) @Suppress("UNCHECKED_CAST") this as List<T> else null
В JVM, массивы (
Array<Foo>
) сохраняют информацию о стираемом типе их элементов, и приведение типов к массиву частично проверяется: nullability и фактические аргументы для параметризированных элементов массива все еще стираются. Например, приведениеfoo as Array <List <String>?>
будет успешным, еслиfoo
является массивомList <*>
, независимо от того, является ли он nullable или нет.
Связь жестокого обращения с детьми и дисфункции в семье со многими основными причинами смерти взрослых. Исследование неблагоприятных детских переживаний (ACE)
. 1998 г., май; 14(4):245-58.
doi: 10.1016/s0749-3797(98)00017-8.
В. Дж. Фелитти 1 , Р. Ф. Анда, Д. Норденберг, Д. Ф. Уильямсон, А. М. Шпиц, В. Эдвардс, М. П. Косс, Дж. С. Маркс
Принадлежности
принадлежность
- 1 Департамент профилактической медицины, Медицинская группа Перманенте Южной Калифорнии (Kaiser Permanente), Сан-Диего 92111, США.
- PMID: 9635069
- DOI: 10.1016/s0749-3797(98)00017-8
В. Дж. Фелитти и соавт. Am J Prev Med. 1998 май.
. 1998 г., май; 14(4):245-58.
doi: 10.1016/s0749-3797(98)00017-8.
Авторы
В. Дж. Фелитти 1 , Р. Ф. Анда, Д. Норденберг, Д. Ф. Уильямсон, А. М. Шпиц, В. Эдвардс, М. П. Косс, Дж. С. Маркс
принадлежность
- 1 Департамент профилактической медицины, Медицинская группа Перманенте Южной Калифорнии (Kaiser Permanente), Сан-Диего 92111, США.
- PMID: 9635069
- DOI: 10.1016/s0749-3797(98)00017-8
Абстрактный
Фон: Взаимосвязь рискованного для здоровья поведения и заболеваний во взрослом возрасте с широтой подверженности эмоциональному, физическому или сексуальному насилию в детстве и семейной дисфункцией в детстве ранее не описывалась.
Методы: Анкета о неблагоприятном детском опыте была разослана по почте 13 494 взрослым, прошедшим стандартное медицинское обследование в крупной HMO; 9, 508 (70,5%) ответили. Были изучены семь категорий неблагоприятных детских переживаний: психологическое, физическое или сексуальное насилие; насилие над матерью; или проживание с членами семьи, которые злоупотребляли психоактивными веществами, психически больными или склонными к суициду, или когда-либо находились в заключении. Затем количество категорий этих неблагоприятных детских переживаний сравнивали с показателями рискованного поведения взрослых, состояния здоровья и болезней. Логистическая регрессия использовалась для корректировки влияния демографических факторов на связь между кумулятивным числом категорий воздействия в детстве (диапазон: 0–7) и факторами риска основных причин смерти во взрослой жизни.
Полученные результаты: Более половины респондентов сообщили как минимум об одной, а одна четвертая сообщила о > или = 2 категориях воздействия в детстве. Мы обнаружили градуированную взаимосвязь между количеством категорий воздействия в детстве и каждым из изученных видов поведения и заболеваний, связанных с риском для здоровья взрослых (P < 0,001). У лиц, подвергшихся четырем или более категориям воздействия в детстве, по сравнению с теми, кто не испытал ни одного, риск для здоровья в отношении алкоголизма, наркомании, депрессии и попытки самоубийства был в 4–12 раз выше; 2–4-кратное увеличение курения, плохая самооценка здоровья, > или = 50 половых партнеров и заболевания, передающиеся половым путем; и 1,4-1,6-кратное увеличение физической активности и тяжелого ожирения. Количество категорий неблагоприятных воздействий в детском возрасте продемонстрировало градуированную связь с наличием заболеваний у взрослых, включая ишемическую болезнь сердца, рак, хронические заболевания легких, переломы скелета и заболевания печени. Семь категорий неблагоприятных детских переживаний были тесно взаимосвязаны, и люди с несколькими категориями воздействия в детстве, вероятно, будут иметь несколько факторов риска для здоровья в более позднем возрасте.
Выводы: Мы обнаружили сильную градуированную взаимосвязь между широтой подверженности жестокому обращению или домашним дисфункциям в детстве и множественными факторами риска для нескольких основных причин смерти у взрослых.
Похожие статьи
ПЕРЕПЕЧАТАНИЕ: Связь жестокого обращения с детьми и дисфункций в семье со многими основными причинами смерти взрослых: исследование неблагоприятных детских переживаний (ACE).
Felitti VJ, Anda RF, Nordenberg D, Williamson DF, Spitz AM, Edwards V, Koss MP, Marks JS. Фелитти В.Дж. и соавт. Am J Prev Med. 2019 июнь; 56 (6): 774-786. doi: 10.1016/j.amepre.2019.04.001. Am J Prev Med. 2019. PMID: 31104722
Жестокое обращение в детстве, дисфункция семьи и риск попытки самоубийства на протяжении всей жизни: результаты исследования неблагоприятных детских переживаний.
Дубе С.Р., Анда Р.Ф., Фелитти В.Дж., Чепмен Д.П., Уильямсон Д.Ф., Джайлз У.Х. Дубе С.Р. и соавт. ДЖАМА. 2001 г., 26 декабря; 286(24):3089-96. дои: 10.1001/jama.286.24.3089. ДЖАМА. 2001. PMID: 11754674
Суицидальная идея.
Хармер Б., Ли С., Дуонг ТВХ, Саадабади А. Хармер Б. и др. 2023 г., 7 февраля. В: StatPearls [Интернет]. Остров сокровищ (Флорида): StatPearls Publishing; 2023 янв.–. 2023 г., 7 февраля. В: StatPearls [Интернет]. Остров сокровищ (Флорида): StatPearls Publishing; 2023 янв.–. PMID: 33351435 Бесплатные книги и документы.
Связь подверженности сексуальному насилию в детстве с другими формами жестокого обращения, пренебрежения и семейной дисфункции в детстве.
Донг М., Анда Р.Ф., Дубе С.Р., Джайлз В.Х., Фелитти В.Дж. Донг М. и др. Жестокое обращение с детьми Негл. 2003 июнь; 27 (6): 625-39. doi: 10.1016/s0145-2134(03)00105-4. Жестокое обращение с детьми Негл. 2003. PMID: 12818611
Домашнее насилие во Флориде.
Хаусман Б., Семен Г. Хаусман Б. и др. 2022, 26 ноября. В: StatPearls [Интернет]. Остров сокровищ (Флорида): StatPearls Publishing; 2023 янв.–. 2022, 26 ноября. В: StatPearls [Интернет]. Остров сокровищ (Флорида): StatPearls Publishing; 2023 янв.–. PMID: 29630246 Бесплатные книги и документы.
Посмотреть все похожие статьи
Цитируется
Распространенность жестокого обращения с пожилыми людьми и факторы риска: результаты канадского продольного исследования старения.
Бернс Д., Пиллемер К., Розен Т., Лахс М.С., Макдональд Л. Бернс Д. и соавт. Нат Старение. 2022 сен;2(9):784-795. doi: 10.1038/s43587-022-00280-2. Epub 2022 23 сентября. Нат Старение. 2022. PMID: 37118505
Модель восстановительной комплексной поддержки (RIS): общинная интеграция подходов, основанных на информации о травмах, для продвижения справедливости и устойчивости для цветных мальчиков и мужчин.
Дункан С., Хортон Х., Смит Р., Пурнелл Б., Гуд Л., Ларкин Х. Дункан С. и др. Behav Sci (Базель). 2023 31 марта; 13 (4): 299. дои: 10.3390/bs13040299. Behav Sci (Базель). 2023. PMID: 37102813 Бесплатная статья ЧВК.
Смертельное и жестокое насилие: характеристика шведских женщин-правонарушителей с тяжелым психическим расстройством и без него.
Трагард К., Хильдебранд Карлин М., Андини П., Нильссон Т. Trägårdh K, et al. Фронтовая психиатрия. 2023 6 апр;14:1143936. doi: 10.3389/fpsyt.2023.1143936. Электронная коллекция 2023. Фронтовая психиатрия. 2023. PMID: 37091705 Бесплатная статья ЧВК.
Влияние разлуки с матерью, зависящее от возраста, β-эндорфина и пола, на двигательную активность, тревожноподобное поведение и алкогольное вознаграждение.
Scopano MR, Jones HE, Stea SG, Freeman MZ, Grisel JE. Скопано М.Р. и соавт. Фронт Behav Neurosci. 2023 5 апр; 17:1155647. дои: 10.3389/fnbeh.2023.1155647. Электронная коллекция 2023. Фронт Behav Neurosci. 2023. PMID: 37091593 Бесплатная статья ЧВК.
Предварительная оценка эффективности программ благополучия и воспитания, основанных на перинатальной внимательности, для молодых матерей с низким доходом.
Ленгуа Л.Дж., Томпсон С.Ф., Калхун Р., Лонг Р.Б., Прайс С., Кантровиц-Гордон И., Шимомаэда Л., Нуриус П.С., Кац Л.Ф., Соммервиль Дж., Бут-ЛаФорс С., Тредвей А., Метье А., Вилли Д.И., Мойни Н. . Ленгуа Л.Дж. и др. Внимательность (НЮ). 2023;14(4):933-952. doi: 10.1007/s12671-023-02096-6. Epub 2023 7 марта. Внимательность (НЮ). 2023. PMID: 37090851 Бесплатная статья ЧВК.
Просмотреть все статьи «Цитируется по»
Типы публикаций
термины MeSH
Грантовая поддержка
- TS-44-10/12/TS/ATSDR CDC HHS/США
Node.js 20
Это время года, когда сообщество Node.js снова выпускает новую основную версию, и в этом году это Node.js 20. Эта строка выпуска является четной, что означает, что она будет будет переведен на долгосрочную поддержку (LTS) в октябре 2023 г. и получит поддержку до апреля 2026 г.
Однако, прежде чем выпуск будет официально переведен на LTS, команде Node.js требуется помощь более широкого сообщества, чтобы протестировать его и обеспечить обратную связь. Это поможет выявить и устранить любые проблемы до выпуска, обеспечивая более плавную работу для всех.
Для тех, кто использует Red Hat Enterprise Linux (RHEL), поддержка Node.js начнется после того, как выпуск будет переведен на LTS, что означает, что вы можете ожидать найти пакеты для диспетчера пакетов RPM (rpm) и контейнеры в RHEL 8 и 9. примерно в то время. Однако для облегчения расширенного тестирования команда Red Hat Node.js планирует предоставить некоторые неофициальные образы контейнеров.
В проекте Node.js Red Hat уделяет особое внимание аспектам, важным для наших клиентов, включая стабильные и предсказуемые выпуски, поддержку платформы, безопасность, диагностику, производительность и качество кода.
Наша приверженность этим приоритетам в сочетании с нашим сотрудничеством с клиентами и внутренними командами, а также с нашим обменом опытом в эталонной архитектуре Node. js не дает нам скучать.
Во время Node.js 20 мы рады поделиться некоторыми недавними функциями и текущими инициативами, которые вызвали у нас интерес или в которых наша команда сыграла свою роль. Из-за того, как быстро функции возвращаются в существующую линейку выпусков Node.js, все они могут быть технически не новыми в Node.js 20, но стоит упомянуть, что они появились после последнего основного выпуска. Вот несколько основных моментов:
- Стабильный тестировщик
- WASI (экспериментальный) больше не требует флага командной строки, и требуется версия
- Модель разрешения (экспериментальная)
- Одиночные исполняемые приложения (экспериментальные)
- Канал трассировки (экспериментальный)
Как видно из списка основных моментов, в мире Node.js происходит многое. Кроме того, в этом выпуске будет представлена обновленная поддержка платформы и новая версия V8 — оба элемента являются общими элементами новых основных выпусков Node. js. Эти обновления являются свидетельством быстрого темпа разработки Node.js и его непрерывного развития.
Использование Node.js неуклонно растет: за последний год было зарегистрировано миллиарды загрузок двоичных файлов и контейнеров Node.js (на основе нашего неофициального подсчета с использованием данных о загрузках Node.js и запросов DockerHub). С точки зрения клиентов Red Hat, мы наблюдаем постоянный рост числа загрузок контейнеров Red Hat Node.js, а также увеличение количества запросов от наших клиентов.
Обзор последних функций
Стабильная программа запуска тестов
В прошлом году Node.js выпустила экспериментальную встроенную программу запуска тестов. Эта функция не предназначена для замены полнофункциональных тестовых фреймворков, таких как Jest или Mocha, но предлагает быстрый и простой способ написать и запустить набор тестов без необходимости установки дополнительных зависимостей. С момента его добавления было сделано много улучшений, в том числе:
- Средство запуска тестов из командной строки, которое можно вызвать через узел
--test
- Настраиваемые и настраиваемые тестовые отчеты через
--test-reporter
- Экспериментальное тестовое покрытие через
--experimental-test-coverage
- Возможности имитации
С помощью Node. js 20 средство выполнения тестов переходит от стабильного к экспериментальному благодаря тестированию и отзывам конечных пользователей. Подробную информацию об использовании можно найти в документации по API.
WASI больше не требует флага командной строки, требуется версия
Новые технологии, такие как Web Assembly (WASM) и системный интерфейс Web Assembly (WASI), набирают популярность благодаря компактному коду, межплатформенной совместимости и модели безопасности . Red Hat — одна из компаний, изучающих эти технологии, и вы можете узнать больше о Red Hat и WebAssembly.
Существует множество различных сред выполнения для выполнения WASM с WASI, и Node.js — одна из них! Хотя WASI остается экспериментальной функцией в этом выпуске, --experimental-wasi-unstable-preview1 флаг
больше не требуется для его включения. Эта разработка упрощает использование WASI и приближает его к поддержке.
Другое важное изменение в Node.js 20 заключается в том, что параметр версии становится обязательным при создании объекта WASI. Теперь вы получите сообщение об ошибке, если version
пропущено вместо preview1
, используемого по умолчанию. Поскольку поддерживаются разные версии WASI, приложения должны указывать конкретную версию, на которую они полагаются, а не полагаться на версию по умолчанию, соответствующую их потребностям.
Если вас интересуют WASM/WASI и Node.js, мы будем рады, если вы присоединитесь к команде uvwasi и поможете нам.
Модель разрешений
Node.js 20 поставляется с экспериментальной функцией модели разрешений. Модель разрешений предоставляет механизм, с помощью которого разработчик может ограничить доступ к указанным ресурсам во время выполнения процесса.
Эта функция в настоящее время доступна с флагом командной строки —experimental-permission. После включения этой функции вы можете управлять следующими разрешениями с помощью соответствующих флагов командной строки:
Файловая система с
--allow-fs-read и --allow-fs-write
Дочерний процесс с
--allow-child-process
рабочих потоков с
--allow-worker
Дополнительные сведения см. в разделе «Модель разрешений» документации Node.js.
Одиночные исполняемые приложения
Сообщество давно просило о возможности поддержки одиночных исполняемых приложений (SEA), созданных с помощью Node.js. Это включает в себя связывание вашего приложения с двоичным файлом Node.js, чтобы конечные пользователи могли распространять и запускать его как один исполняемый файл (например, .exe в Windows). назад, а Node.js теперь включает экспериментальную поддержку упаковки приложений в двоичные файлы сообщества Node.js. Для объединения приложения в двоичные файлы можно использовать различные инструменты, после чего двоичный файл Node.js распознает связанное приложение и запустит его при запуске.
Канал трассировки
Диагностика важна для клиентов Red Hat, которые запускают приложения в рабочей среде, и приятно видеть, что этот выпуск приносит прогресс в этом направлении. Node.js 20 включает недавно представленный канал трассировки в качестве экспериментального расширения функции канала диагностики. Каналы трассировки помогают сгруппировать диагностические каналы для использования при создании и использовании данных трассировки.
Механизм JavaScript V8, версия 11.3
Механизм JavaScript V8 функционирует как среда, в которой выполняется код JavaScript, что позволяет ему беспрепятственно работать на множестве платформ. Это избавляет разработчиков от необходимости беспокоиться об особенностях платформы, таких как используемая операционная система (Linux, Windows, macOS) или аппаратная архитектура (x64, Arm или Power PC), которая лежит в ее основе. V8 написан на C++ и требует, чтобы сообщество Node.js взяло на себя ответственность за обслуживание и улучшение V8 для различных конфигураций оборудования и операционных систем.
Члены группы Node.js в Red Hat несут ответственность за поддержку V8 на Power PC и s390, и каждую неделю вносят изменения, чтобы обеспечить его постоянную работу на этих платформах. В результате команда Red Hat Node.js получила представление о новых изменениях и функциях в будущих версиях движка V8 JavaScript.
Первоначальный выпуск Node.js 20 обновляет движок JavaScript V8 до версии 11.3. Новые функции в V8 с момента последнего основного выпуска включают:
- String.prototype.isWellFormed и String.prototype.toWellFormed
- Флаг RegExp v с заданным обозначением + свойства строк
- ArrayBuffer с изменяемым размером и расширяемый SharedArrayBuffer
- Хвостовой вызов WebAssembly
Поддержка платформ
Как и в большинстве основных выпусков, в этом выпуске обновлены минимальные поддерживаемые уровни для платформ и инструментов, используемых для сборки Node.js. В инструкциях по сборке Node.js указаны новые минимальные уровни.
Недавние изменения в поддержке платформы включают обновление компилятора, используемого для сборок на основе gcc, до gcc10. Windows на ARM также недавно была повышена до платформы уровня 2, и проект теперь предоставляет готовые двоичные файлы для Node. js версии 19.и позже.
Для тех, кто использует бинарные файлы или контейнеры Red Hat Node.js, это изменение не повлияет на вас, поскольку Red Hat создает и делает доступными бинарные файлы, соответствующие основным версиям Fedora и RHEL, посредством пакетов rpm и контейнеров.
Безопасность и безопасность цепочки поставок
Хотя безопасность и безопасность цепочки поставок всегда были важны, в последние годы растет осведомленность и интерес к этим областям. В рамках проекта Node.js значительное количество усилий уделяется работе, связанной с безопасностью, начиная от выявления и устранения уязвимостей и заканчивая выполнением выпусков безопасности.
Мы хотели бы выразить нашу признательность компаниям и частным лицам, которые помогли с выпусками безопасности в качестве распорядителей выпусков безопасности или в составе группы сортировки безопасности, Рабочей группы по выпускам, а также всех тех, кто вносит свой вклад в обеспечение безопасности. отпустить усилия. В то время как основные выпуски привлекают значительное внимание, выпуски безопасности не менее важны. Мы хотели бы, чтобы больше компаний брали на себя обязательство помочь с сортировкой, управлением безопасностью и устранением уязвимостей.
Что касается хороших новостей, то финансирование со стороны Open Source Security Foundation (OSSF) позволило проекту лучше отслеживать уязвимости и ускорить продвижение ключевых инициатив, включая:
- автоматизацию обновлений зависимостей
- отслеживать и устранять уязвимости в зависимостях с помощью узла js-dependency-vuln-assessments
- оценка соответствия передовым практикам
- улучшение процесса выпуска безопасности
В рамках проекта также рассматриваются новые методы и технологии, такие как Sigstore и SLSA, для определения их потенциального применения в проекте.
Если вы планируете принять участие в саммите по открытым исходным кодам в мае и хотите узнать больше о некоторых из этих работ, обязательно ознакомьтесь с разделом Повышение безопасности крупного проекта с открытым исходным кодом шаг за шагом.
В соответствии с тем, что важно для наших клиентов, Red Hat гордится тем, что выполняет часть этой работы, участвуя в группе сортировки, выпуская выпуски безопасности и способствуя усилиям группы рабочей группы по безопасности вместе со всеми другие участники проекта.
Next-10
В то время как основные выпуски — это время, когда люди смотрят, что нового. Также важно с нетерпением ждать того, что произойдет в будущем. Проект работает над этим в рамках работы Next-10 и определил группы клиентов, потребности этих групп и технические приоритеты, основанные на этих потребностях. Следует отметить, что команда Next-10 скоро проведет опрос при поддержке фонда OpenJS. Мы надеемся, что вы примете участие, чтобы следующая 10 команда могла учесть ваши отзывы в своей будущей работе.
Большое спасибо
Мы выражаем благодарность каждому, кто участвовал в выпуске Node.js. В проекте Node.js работает разнообразная группа участников, которые неустанно работают, и каждый выпуск является кульминацией их коллективных усилий.