age
, и возвращать всегда валидное значение.length
у массива reasons
, чтобы он всегда был "пустой". const QA = [
{
q: ['Привет', 'Hi', 'Здарова', 'Ы'],
a: ['Привет', 'Здравствуйте', 'Доброго времени суток'],
},
{
q: ['Как дела?', 'Как жизнь?', 'Как день прошёл?', 'Как настроение?'],
a: ['Хорошо', 'Отлично', 'Лучше всех, надеюсь и у вас так же'],
},
];
q.includes(вопрос)
a
и его случайный элементfunction answer(questionText, QA) {
if (!questionText || questionText.length === 0) {
return 'Пустой вопрос - пустой ответ';
}
const pair = QA.find(pair => pair.q.map(text => text.toLowerCase()).includes(questionText.toLowerCase()));
if (!pair) {
return 'Даже и не знаю, что ответить!..';
}
const randomIndex = Math.floor(Math.random() * pair.a.length);
return pair.a[randomIndex];
}
// использование
answer('Ы', QA); // Привет
for..in
прямо пишут, что порядок детерминирован и одинаков во всех браузерах/движках:The traversal order, as of modern ECMAScript specification, is well-defined and consistent across implementations.
Within each component of the prototype chain, all non-negative integer keys (those that can be array indices) will be traversed first in ascending order by value, then other string keys in ascending chronological order of property creation.
learn.javascript.ru
const obj = { a: "AAA", b: "BBB", "outer space": "UFO" };
let name = "a";
console.log( obj[name] ); // "AAA"
name = "outer space";
console.log( obj[name] ); // "UFO"
true
или false
переводятся в строки "true" и "false".{ "true": function1, "false": function2 }
вызывается одна из этих двух функций, в зависимости от значения true или false. const f1 = function() {
console.log("I am F 1");
};
const f2 = f1;
f2(); // I am F 1
function call_if_true(value, func) {
if (value) {
func();
}
}
call_if_true(
1,
function() { console.log("It's true!"); }
);
const students = [
{ name: 'One', marks: [8, 10, 7, 5, 4] },
{ name: 'Two', marks: [5, 2, 8, 5, 3] },
{ name: 'Three', marks: [6, 9, 3, 6, 7] },
{ name: 'Fore', marks: [1, 7, 8, 4, 10] },
{ name: 'Five', marks: [5, 8, 6, 9, 3] },
];
const min = { student: null, avg: Number.POSITIVE_INFINITY };
const max = { student: null, avg: Number.NEGATIVE_INFINITY };
students.forEach(student => {
const { marks } = student;
const avg = marks.reduce((acc, c) => acc + c) / marks.length;
if (avg > max.avg) {
max.avg = avg;
max.student = student;
} else if (avg < min.avg) {
min.avg = avg;
min.student = student;
}
});
console.log('Student with mininal average mark', min.student);
console.log('Student with best average mark', max.student);
location.hash
соотв. хэш.const news = (new URL(document.location)).searchParams.get('news');
if (news) document.location.hash = news;
input
, а сбоку от него, именно на div
'е, то порядок событий такой же как во втором. Как вешали обработчики, в том же порядке отрабатывают: 1, 2.div
со слушателями, то 2-й сработает первым, ещё на фазе «погружения» события, т.к. у второго слушателя третьим аргументом true
. for (let key in objectEmployee) {
что будет в key?objectEmployee.key['age']
есть ли у objectEmployee
свойство key
? (нет)const filters = {
age: v => v >= 25,
education: v => v === 'higher',
experience: v => v >= 1,
};
const employee = {};
const defaultDescriptor = { writable: true, enumerable: true, configurable: true };
Object.defineProperties(employee, {
name: { ...defaultDescriptor, value: 'Dmitriy', writable: false },
age: { ...defaultDescriptor, value: 21 },
education: { ...defaultDescriptor, value: 'higher' },
experience: { ...defaultDescriptor, value: 0 },
});
const hireNewEmployee = (employee, filters) => {
const errors = [];
Object.entries(filters).forEach(([name, func]) => {
if (!func(employee[name])) {
errors.push(name);
}
});
return errors.length
? `Not hired: sorry we cannot hire you. Here is why: ${errors.join(', ')}`
: 'You are Hired! Congrats!';
};
hireNewEmployee(employee, filters);
// "Not hired: sorry we cannot hire you. Here is why: age, experience"
async..await
равносильно throw
catch
.v.0.22.0
event.target
– это кликнутый элемент.document.addEventListener('click', ({ target }) => {
if (!target.classList.contains('button')) return; // не тот клик
target.classList.toggle('active');
});
const isEmpty = obj => Object.keys(obj).length <= 2;
console.log( isEmpty({ a: "AAA" }) ? 'object is empty' : 'object is full of properties' );
// выведет "object is empty"
console.log( isEmpty({ a: "AAA", b: "BB", c: "C" }) ? 'object is empty' : 'object is full of properties' );
// выведет "object is full of properties"
<span class="animals" data-allowed="{{$cabin->HasAnimals}}">
{{$cabin->HasAnimals?Translate::GetTranslation('Animals Allowed'):Translate::GetTranslation('Animals Not Allowed')}}
</span>
const span = document.querySelector('span.animals');
const isAnimalsAllowed = !!span.dataset.allowed;
span
бэк отрисовываетid
– видимо, массив.id.length
– длина массива. Например, для массива [7, 7, 7]
длина 3.id.length - 1
– индекс последнего элемента в массиве. Индексы считаются от 0.id
. И из него вытаскивают его свойство default
.` text ${ js_expression } `
почитайте про строки в обратных кавычках и интерполяцию выражений в них.const word = "мир";
`Привет, ${ word }!` // "Привет, мир!"