Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
it('section', () => checkMarkBegin('section', renderDOM`
|#doc
| #section^1
| #heading "1. txt"
| #text "2. txt"*
| #section^3
| #heading "3. txt"
`, renderDOM`
|#doc
| #section^1
| #heading "1. txt"
| #section^2
| #heading "2. txt"
| #section^3
| #heading "3. txt"`));renderDom делает гораздо больше, чем просто поправляет отступы и убирает лишние переносы строк. Но, касаемо самого текста, суть примерно та же. Для большей очевидности и наглядности каждую строку начинаю с |.String.raw за пределами тестов мне пока не пригодилось. А вот в них позволили очень сложные вырвиглазные вещи описать, используя в 10 раз меньше кода и улучшив раз в 5 наглядность. Правда попутно сочиняя новый язык шаблонов, но это уже другая история :)if (verbose) {
console.log(
/*`````````````````*/
`const a is ${a}.
const b is ${b}.`
/*`````````````````*/
);
} else {
console.log(
/*`````````````````*/
`a = ${a}.
b = ${b}.`
/*`````````````````*/
);
}| я словил одну проблему: я использую повсеместно Tab-ы. А т.к. | завершает indent-часть кода, то последующие за ним Tab-ы каждый редактор рисует как ему хочется. К примеру sublimetext делает с ними что-то совершенно невменяемое (длина таба варьируется в зависимости от расположения Марса). В итоге я до | использую табы, а после (т.е. "внутри шаблонной строки") ― пробелы.var firstname = 'Firstname';
var lastname = 'Lastname';
console.log(xs`user: ${firstname} ${lastname}`); // 'user: FirstnameLastname' пробел отсутствуетstr.replace(/^ +/mg, '')console.log(`a = ${a}.`);
console.log(`b = ${b}.`);2 Для каждой переменной в шаблоне создается новый RegExp.

3… И в этой функции он будет оформлен как надо.
JS-движок сам кеширует ...Он не может всегда кешировать, особенно если есть RegExp c изменяемой переменной
console.timer('t1');
const re = /a{331}/;
for(i=0;i<100000;i++) 'baab'.match(re);
console.timerEnd('t1');
t1: 65.231ms
console.timer('t2');
const re;
for(i=0;i<100000;i++) 'baab'.match(/a{331}/);
console.timerEnd('t2');
t2: 97.846
Vivaldi 1.0.435.26: 70 vs 75Chrome 50: 13 vs 11Firefox 45: 105 vs 101nodeJS v5.2.0: 9.7 vs 10у меня даже без изменяемых переменных в регулярке
Хм. Подскажите, а что вы имеете ввиду?К примеру:
for(i=0;i<100000;i++) 'baab'.match(new RegExp(i%5, g))new RegExp
Chrome 49 — 280x172, 226x162, 131x102. (ссылка)Firefox 44 — 124x107, 114x103, 115x119 (ссылка)IE 9 — 112x89, 113x87, 116x88 (ссылка)<script type="text/javascript">
var t1=new Date();
var a = "a{331}"; //К примеру эту переменную a получаем из какой-то функции
const re = new RegExp(a,"g");
for(i=0;i<100000;i++) 'baab'.match(re);
alert(new Date()-t1);
var t2=new Date();
for(i=0;i<100000;i++) 'baab'.match(RegExp(a,"g"));
alert(new Date()-t2);
</script>new RegExp? Никто вроде и не спорит с тем, что new RegExp нужно выносить за пределы цикла, если она не должна быть уникальной для каждой итерации. /blabla/, то нет резона выносить её за пределы циклов, т.к. браузеры и без того будут её кешировать, а код будет более читаемым. Т.е. пункта из root-комментария выше, я считаю, из разряда неработающих микрооптимизаций, которые, как известно, — зло. Ибо я пока не понимаю причины даже небольшого уменьшения времени
C++ кода и смотреть почему оно так, мне лень. В одном из своих парсеров, который работает десятки часов напролёт, я думал, что смогу сэкономить хотя бы 5-10% времени именно на выносе всех регулярок из класса куда-нибудь повыше, и дёргать уже экземпляры RegExp-а. Это сильно бы усложнило понимание кода (прямо реально сильно, т.к. регулярки были уникальны и будучи оторванными от контекста...), но я ожидал от этого каких-нибудь явных преимуществ в производительности.прямо реально сильно, т.к. регулярки были уникальны и будучи оторванными от контекста...),При наличии хорошего очевидного названия переменной для регулярки — проблемы вроде как не стоит, тем паче вынесение переменных перед циклом, — стандартная практика.
тем паче вынесение переменных перед циклом
При наличии хорошего очевидного названия переменной для регулярки
Мой первый пример с цифрами для Оперы 12.17
var jsstr =
"test" +
"middle" +
"end";var jsstr = "\
test\
middle\
end";var html = template.compile(`
extends layout
block main
include menu
ul.submenu
li.item home
li.item about
block footer
.end footer text
`);ну да, не отличаются, лишних пробелов не будет и переводов строк.
C, вопрос:void fn()
{
if(some)
char *str = "\n
line1\n
line2\n
line3";
}str равным \nline1\n line2\nline3?function xs(str){
return str.replace(/\n +/g, '\n').replace(/^\n|\n$/g, '');
}
const a = 1;
const b = 2;
console.log(xs(`
a = ${a}.
b = ${b}.
`));
function textConst (){ /*==123==;
<style type="text/css">
#pun .main{
display:none;
}
</style>
<div id=world>
Привет Мир!
</div>
==123==;*/
} textConst = textConst.toString().split('==123==;')[1];
alert(textConst)const str = 'A: ${1+2}\nB: ${3+4}';
function compileTL(str) {
const strings = str.split(/\$\{.*?\}/);
const expressions = str.match(/\$\{.*?\}/g).map(expr => eval(expr.replace(/^\$\{|\}$/g, '')));
return String.raw({ raw: strings }, ...expressions);
}
console.log(compileTL(str));
A: 3
B: 7
Обновил функцию для сохранения вложенных отступов.
Удобная вставка многострочных шаблонных литералов в код на JavaScript