// export или module.export =
function formatText(text, formatters) {
return formatters.reduceRight(applyFormatter, text);
}
function applyFormatter(text, formatter) {
const {offset, length, type} = formatter;
const endOffset = offset + length;
const wrapper = getWrapper(type);
return `${text.slice(0, offset)}${wrapper(
text.slice(offset, endOffset),
formatter
)}${text.slice(endOffset)}`;
}
function getWrapper(type) {
switch(type) {
case 'bold':
return boldWrapper;
case 'text_link':
return linkWrapper;
default:
return identityWraper;
}
}
function boldWrapper(text) {
return `<b>${text}</b>`;
}
function linkWrapper(text, {url}) {
return `<a href="${url}">${text}</a>`
}
function identityWraper(text) {
return text;
}
console.log(formatText('qwerty Ссылка', [
{ offset: 0, length: 7, type: 'bold' },
{ offset: 7, length: 6, type: 'text_link', url: 'https://vk.com/' }
])); // <b>qwerty </b><a href="https://vk.com/">Ссылка</a>
function add(left, right) {
const typeLeft = typeof left;
const typeRight = typeof right;
if(typeLeft === 'string') {
return left.concat(right);
}
if(typeRight === 'string') {
return right.concat(left);
}
if(canConvertToNumber(left, typeLeft) && canConvertToNumber(right, typeRight)) {
return Number(left) + Number(right); // тут уже не перегруженный вариант + иначе будет бесконечная рекурсия
}
if(typeLeft === 'bigint' && typeRight === 'bigint') {
return left + right; // опять не перегруженный вариант
}
if(
(typeLeft === 'bigint' && canConvertToNumber(right, typeRight))
|| (typeRight === 'bigint' && canConvertToNumber(left, typeLeft))
) {
// если предыдущий if не прошел, а проходит этот
// то мы складываем bigint с не bigint, а так нельзя
throw new TypeError('Cannot mix BigInt and other types, use explicit conversions');
}
// во всех остальных случаях приводим к строке:
return String(left).concat(right);
}
function canConvertToNumber(item, type) {
return item === null || type === 'number' || type === 'boolean' || type === 'undefined';
}
делаю проект на laravelЗначит у Вас уже есть laravel-mix, который под капотом использует webpack, а значит можно нормально работать с import
А потом эти классы импортировать и объекты уже этих классов делать глобальными:window.text= new Text(); window.cart = new Cart(); window.Form = new Form();
Что бы потом это не получилось в неуправляемую кашу.Как раз такой подход приведет к неуправляемой каше.
А потом уже в разметке в событиях вызывать методы соответствующих объектовДа Вы батенька мазахист...
let x = 10;
console.log(x++); // 10
console.log(x--); // 11
значение сначала будет передано в console.log, а потом посчитано новоеlet x = 10;
console.log(++x); // 11
console.log(--x); // 10
сначала посчитает, а потом передаст в console.logobj.field++;
obj.field += 5;
const variable = obj.field = 10;
const human = {
name: 'Andrew'
};
Мы уже в коде много где использовали это поле как поле, и вдруг понадобилось делать что-то, когда это поле меняется, что проще, сделать сеттер или поменять весь остальной код? addItem = text => {
return axios.post("/task", {
headers: { "Content-Type": "application/json" },
text: text
})
.then(res => {
this.arr.push(res.data.task);
})
.catch(e => console.log(e));
};
describe("STORE", () => {
it("create new task", () => {
const store = new Store();
const text = "test";
expect(store.addItem(text)).resolves.toBe(1);
});
});
var m_top = $('.go').offset().top;
запомнит оффсет только для самого первого элемента найденного по селектору, поэтому и обрабатывается только он.$(document).ready(function(){
var observer = new IntersectionObserver(function(entries){
entries.forEach(function(entry){
if(entry.isIntersecting) {
$(entry.target).addClass('active bounceInLeft');
} else {
$(entry.target).removeClass('active bounceInLeft');
}
});
}, {threshold: 0.1});
$('.go').each(function(){
observer.observe(this);
});
});