+$(".form-submit").on("click", ".product__add", function () {
-$(".product__add").on("click", function () {
.project-details__container.project-details__container__loaded {}
.project-details__cover.project-details__cover_loaded {}
.project-details{
$this: &;
&__container{
&#{$this}__container__loaded{
}
&__cover{
&#{$this}__cover_loaded{
}
}
}
.project-details {
&__container{
&__loaded{
}
}
}
class UserUtils {
public function getUserRank($user) {
// 20-30 строк кода
}
}
Что такое $user? Это строка с логином? Это id-шник? Это объект ORM?
А что возвращает метод? Число? Объект ORM?
class UserUtilsWithTypes {
public function getUserRank(UserModel $user) : int {
// code
}
}
$is_[что-то]
), но речь сейчас не об этом. let user;
alert(user ?? "Аноним"); // Аноним (user не существует)
let user = "Иван";
alert(user ?? "Аноним"); // Иван (user существует)
let firstName = null;
let lastName = null;
let nickName = "Суперкодер";
// показывает первое значение, которое определено:
alert(firstName ?? lastName ?? nickName ?? "Аноним"); // Суперкодер
const mostLeastAndTheRest = names => {
const dict = names.reduce((acc, name) => ((acc[name] ??= 0), acc[name]++, acc), {});
// { "Женя": 3, "Иван": 1, "Виктор": 4, "Константин": 1 }
const values = Object.values(dict);
const max = Math.max(...values);
const min = Math.min(...values);
const entries = Object.entries(dict);
const winners = entries.filter(([_, value]) => value === max).map(([key, _]) => key);
const losers = entries.filter(([_, value]) => value === min).map(([key, _]) => key);
const rest = Object.keys(dict).filter(name => !winners.includes(name) && !losers.includes(name));
return { winners, losers, rest };
};
mostLeastAndTheRest(['Женя', 'Женя', 'Иван', 'Женя', 'Виктор', 'Виктор', 'Константин', 'Виктор', 'Виктор']);
/*
{
"winners": [ "Виктор" ],
"losers": [ "Иван", "Константин" ],
"rest": [ "Женя" ]
}
*/
@RestController
Стрелка=>
ничего не привязывает. У функции просто нетthis
.
При получении значенияthis
– оно, как обычная переменная, берётся из внешнего лексического окружения.
const obj = {
w() {
console.log('w', this);
},
x: function () {
console.log('x', this);
},
y: this,
z: () => {
console.log('z', this);
},
};
obj.w(); // obj
obj.x(); // obj
console.log('y', obj.y); // Window
obj.z(); // Window
this
тот же, что и снаружи:const a = this; // Window
const obj = {
b: this, // тоже Window
}
a === obj.b // true
type="text"
, то выглядеть будет как белый прямоугольник с рамкой, в который ты можешь печать текст и получить этот текст в атрибуте value
type="number"
, то выглядеть будет несколько иначе, появятся кнопочки. Вводить можно будет только цифры. Начинают работать дополнительные атрибуты, которые ограничивают диапазон вводимого числа, шаг инкремента при нажатии на стрелки, а так-же появляется дополнительное форматирование.type="file"
, то вводить ты туда ничего не можешь, в value
будет имя выбранного файла. А через свойство files
можно будет получить доступ к выбранным файлам. Так-же начнет работать атрибут accept
.type
задает тип инпута, это как ничего не сказать.Преподаватель говорит, что атрибут type у input задаёт тип данных для этого элемента.
Но мне кажется, что атрибут type задаёт не тип данных, а лишь формат ввода данных.
swiper.on('slideChange', ({ activeIndex }) => {
document.querySelectorAll('.points .point').forEach((n, i) => {
n.classList.toggle('active', i === activeIndex);
});
})
document.querySelector('.points').addEventListener('click', ({ target: t }) => {
if (t.classList.contains('point')) {
swiper.slideTo([...t.parentNode.children].indexOf(t));
}
});
pagination: {
el: '.points',
bulletClass: 'point',
bulletActiveClass: 'active',
renderBullet: (index, className) => `<div class="${className}">${index + 1}</div>`,
clickable: true,
},