LINUX.ORG.RU
ФорумTalks

В жабаскрипт почти доехали нормальные регулярки

 ,


0

1

https://v8project.blogspot.ru/2017/07/upcoming-regexp-features.html

Наконец-то добавят поддержку \p \P и lookbehind. Скоро станет не нужен гребаный ад вроде такого

Больше недостатков у яваскрипта не осталось :)

★★★★★

Больше недостатков у яваскрипта не осталось :)

там щас недостаток это отличие (function(){})() от () => {} и прочие вещи нацеленные на исправление костылей прошлого

но вообще новость позитивная

Deleted
()

Зачем люди пишут серверную часть на этом языке?

lochness
()

Когда уже наконец регулярки допилят до полноты по тьюрингу и ими можно будет парсить html?

Bad_ptr ★★★★★
()
Ответ на: комментарий от Bad_ptr

Когда уже наконец регулярки допилят до полноты по тьюрингу и ими можно будет парсить html?

Так они и используются в библиотеках для «разбора» DOM :)

lochness
()
Ответ на: комментарий от Deleted

недостаток это отличие (function(){})() от () => {}

Разве это не фича? Как -> и => в CoffeeScript.

Anatolik ★★
()

Ещё в stage-3 (кроме регексов) `for async` есть, но его пока не запили. Но он очень крут.

ChALkeR ★★★★★
()
Ответ на: комментарий от ChALkeR

А ее до этого разломали или изначально кривая была? Просто регулярки - это вечная юникодная попаболь.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Не гуглится потому что я написал не то, что думал =). `for await`, конечно же, asynchronous iteration. Нужен он в т.ч. для итерирования асинхронного потока данных — например, при чтении из файла или загрузки чего-то чанками можно будет забыть про .on('data' и .on('end'.

ChALkeR ★★★★★
()
Последнее исправление: ChALkeR (всего исправлений: 1)
Ответ на: комментарий от Vit

Так было давно, скорее всего изначально. Буферы дёргают только mark-sweep, что во-первых само по себе плохо, а во-вторых происходит когда занимаемая память уже довольно разрастётся. При этом буферы отлично чистятся scavenge, но почему-то их не вызывали. Тот коммит, на который я сослался, это почти чинит, но не включает ещё.

Простейший костыль с gc мог скостить память в несколько раз и увеличить производительность потоков (которые используют буферы) в некоторых случаях процентов на 20%.

ChALkeR ★★★★★
()
Ответ на: комментарий от Vit
for await (const line of readLines(filePath)) {
  console.log(line);
}

Вот пример. Это, по сути, асинхронное перечисление.

Два момента:

  • Итерации идут асинхронно.
  • Они могут кончиться (когда закончится файл или поток). Причём этот флаг тоже, очевидно, прилетает асинхронно, вместе со значением.

Да, его можно реализовать через for () { await }, но тогда в каждой итерации надо будет получать не строчку, а каскад из строчки и флага останова/продолжения и проверять их ручками, делая break.

Генераторы, собственно, и нужны для этого — они на каждой итерации выдают такую пару, и сахар for-of спасает от проверки этого руками. Но этого сахара до for await не было для асинхронного перечисления.

В примере выше readLines — генератор, который выдаёт промисы.

Аналогичный вышеприведённому код у тебя выглядел бы так:

const stream = readLines(filePath);
for (;;) {
  const { value, done } = await stream.next();
  if (done) break;
  const line = value;
}

Ну и плюс сахар для самого определения генераторов, которые возвращают промисы.

ChALkeR ★★★★★
()
Последнее исправление: ChALkeR (всего исправлений: 1)
Ответ на: комментарий от ChALkeR

Примерно понятно. through2, eos. У меня нет таких задач, чтобы оценить, но какой-то смысл в подобной конструкции имеется.

Надо бы глянуть сорцы модных библиотек, которые смогут подобное массово заюзать.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Deleted

там щас недостаток это отличие (function(){})() от () => {}

В чем тогда польза будет от твоих стрелочных функций? как ты будешь делать new Promise(() => {}).then(() => {}); elem.addEventListener('click', () => {});, снова function писать?

Вот так вот обычно оборачивают:

var foo = (function(){
   var a = [];
   var b = 0;
   
   return function(c, d) {
      b += d;
      a.push(c * b);
      return a;
   }
})()

что бы изолировать какие то переменные которые нужны для внутренней программы от внешнего мира. Их используют в крайне единичных случаях arrow-function можно точно так же обернуть (() => {})() - пожалуйста.

Со своей стороны я вообще не понимаю этих arrow-function и прочих новвоведений es6 var etc = 123; etc => {} - вот что оно дает? При этом именованные функции стрелками делать нельзя (можно если через переменные только), а () => {} !== function(){} arrow-functions не имеют свойств типа arguments/caller и наверно своих свойств добавлять нельзя (впрочем то же самое примерно у 0 и Number(); «» и Strring(); [] и new Array() так что может тут и ничего необычного, сделали типа легкую короткозаписываемую функцию)

uin ★★★
()
Ответ на: комментарий от ChALkeR

Чет какой то адов говнокод вообще.
Зачем вы константами как простыми переменными обмазываетесь? Вам делать нечего что ли?

Запишите на лбу себе про let и const:

const MAX_BUF_SIZE = 2048;

MAX_BUF_SIZE += 10;  //эксепшн
MAX_BUF_SIZE = 1024; //эксепшн

let a = 3;
let b = 1;

if (b < 10) {
   let a = 23;
   b += a;
}

b //=> 24;
a //=> 3;


Про авейт и цикл несколько не понял, то есть функция типа читает строки, выплевывает наружу промис, а потом внешний цикл начинает этот промис сзади пихать вытряхивая из него данные и ответ о том закончилась ли у него там или нет.
Зачем вот это порно и что оно дает?

uin ★★★
()

Недостаток останется - совместимость с легаси, как следствие, возможность легко говнокодить. Ад неизбежен. Вот когда введут уголовное наказание за отсутствие в коде типизации, злоупотребления лямбдами и рекурсивное запутывание контекста - тогда яваскрипт будет спасен.

Shadow ★★★★★
()
Последнее исправление: Shadow (всего исправлений: 1)
Ответ на: комментарий от Shadow

злоупотребления лямбдами

А, так это лямбда выражения сделанные через функции, понятно тогда.
А для чего и как они вообще используются?

var etc = 2.5,
    lm  = etc => etc * 2;

lm() //=> возвращает NaN потому что etc становится неизвестно чем и умножает себя на два

Как правильно вообще это выглядит?

uin ★★★
()
Ответ на: комментарий от uin

блин до меня доперло это что бы как во всяких модных молодежных языках писать:
(a = 1, b = ' чая') => a * 2 + b;
только непонятно почему можно просто test => resolve(test) написать (я где то такое видел) или test в данном случае это то же самое что (test) => resolve(test) то есть просто аргумент и просто скобочки не обязательно писать если он один. Тогда все в принципе на свои места встает.

uin ★★★
()
Последнее исправление: uin (всего исправлений: 1)
Ответ на: комментарий от uin
var etc = 2.5, // это объявлена переменная etc, которой присвоено значение 2.5
    lm  = etc => etc * 2; // Это объявлена "функция" с одним параметром etc, возвращающая etc*2 (к переменной etc это не относится никак)

lm(); // здесь мы вызвали функцию lm, передав ей параметр etc=undefined

lm(5); // здесь мы вызвали функцию lm, передав ей параметр etc=5. в результате получим 10
Qasta
()
Ответ на: комментарий от uin

Вообще рекомендую книжку прочесть. Себе купил вот эту - https://habrahabr.ru/company/piter/blog/309298/ (Книга «ES6 и не только» Кайл Симпсон).

Стоила мне рублей 300 (электронная версия). Написана хорошо, легко читается.

Там вообще много разной хрени полезностей навводили в javascript. Без пол-литры книги не разобраться

Qasta
()
Ответ на: комментарий от Qasta

Вообще рекомендую книжку прочесть.

Мне не нужно, я все таки на браузеры больше и web ориентирован а не на узкий мир ноды.

uin ★★★
()
Ответ на: комментарий от uin

А я про браузеры и пишу. Ещё ни одной серверной штуки на NodeJS не писал (и не собираюсь - даже приветмир, имхо сервер на nodejs - очень и очень плохая идея).

Дело в том, что под браузеры тоже давно используют транспиляцию - пишут на ES6, а написанное потом преобразуется в «старый» JavaScript. Ключевые слова для поиска: webpack, babel.

Для средних и больших приложений - самое то. Ну а если нужно что-то простенькое - это, конечно, JQuery.

Qasta
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.