const arr = ['banner-0', 'banner-1', 'banner-2']
Math.floor( Math.random( arr.length)))
alert([
"Красный цвет задаётся HEX-кодом "
,"#"
,"FF"
,"00"
,"00"
].join(''));
document.getElementById()
– это метод getElementById()
у объекта document
. Вызов возвращает Element. Или null
, если нет элемента с таким ID.getElementById()
уже у объекта Element. А у него такого метода нет.document.getElementById()
не ищет, а просто берёт, если есть такой. bind()
создаёт каждый раз новую копию функции.const listener = this.onclickWindowHandler.bind(this);
window.addEventListener('click', listener);
// ...
window.removeEventListener('click', listener);
alert(value)
возвращает undefined
myalert(value)
возвращает value
A || B && C
разбирается как A || (B && C)
A
. Если оно приводится к false
, требуется проверить второй аргумент ||
, т.е. (B && C)
B
. Если оно приводится к false
, то проверять C
уже не нужно. function resort(selector) {
const nodeList = document.querySelectorAll(selector);
const dict = {};
const parent = nodeList[0].parentNode;
nodeList.forEach(node => {
const key = node.querySelector('p').innerText;
dict[key] = node;
node.parentNode.removeChild(node);
});
const keys = Object.keys(dict);
keys.sort().forEach(k => parent.appendChild(dict[k]));
}
resort('.slide');
function fn(words, target) {
const length = words.length, targetLength = target.length;
const aWord = []; // индексы слов в aWords
const aWant = []; // какой длины не хватает до целого
const bWord = [];
const bWant = [];
for (let i = 0; i < length; i++) {
const word = words[i];
const x = target.indexOf(word);
if (-1 === x) continue;
const wordLength = word.length;
const want = targetLength - wordLength;
if (x === 0) { // в начале составного, первое подслово
aWord.push(i);
aWant.push(want);
const bIndex = bWant.indexOf(wordLength);
if (-1 === bIndex) continue;
const bWordIndex = bWord[bIndex];
return [words[bWordIndex], word, [i, bWordIndex]];
} else { // не в начале слова встретилось - второе слово, в конце цели
if (x + wordLength !== targetLength) continue; // не попадает в конец
bWord.push(i);
bWant.push(want);
const aIndex = aWant.indexOf(wordLength);
if (-1 === aIndex) continue;
const aWordIndex = aWord[aIndex];
return [words[aWordIndex], word, [aWordIndex, i]];
}
}
return null;
}
filter=managers
доступен только Администраторам сообщества.var isCollided = false; // изначально нет столкновения
На каждой итерации – будь то по setInterval()
или requestAnimationFrame()
– проверяйте, есть ли столкновение сейчас. И сравнивайте с предыдущим.const isNowCollided = checkIfCollided(); // как-то проверяем, есть ли сейчас наложение
if (isNowCollided && !isCollided) { // впервые столкнулись!
// alert! alert!
} else if (!isNowCollided && isCollided) { // выехали из зоны
// всем неинтересно
} else {
// вообще без новостей
}
isCollided = isNowCollided;
npm install googleapis --save
npm install google-auth-library --save
0..n
, в случайном порядке выдёргивая из этой «колоды» очередную карту. Когда колода пустеет, открываем новую.// Итератор случайных уникальных - Random Unique
function getRUIterator(max) {
let buffer = [];
const ruIterator = {
next: function() {
if (buffer.length === 0) { // если колода пуста
for (let i = 0; i < max; i++) buffer.push(i); // открываем новую 0..max
}
const index = Math.floor(Math.random() * buffer.length);
return buffer.splice(index, 1)[0]; // вынимаем из колоды случайную карту
}
}
return ruIterator;
}
/**
* генерим в каждый див по случайной картинке
* как можно дольше без повторов
* @param int iTotal число доступных картинок
* @param Array массив строк - айдишки div'ов, куда вставлять
*/
function placeRandomImages(iTotal, aDivs) {
function placeImage(n, id) {
const img = new Image();
img.src = `img/${n}.png`;
img.border = '0';
document.getElementById(id).appendChild(img);
}
// будет генерить случайные неповторяющиеся
const RUI = getRUIterator(iTotal);
for (let i = 0; i < aDivs.length) {
placeImage( RUI(), aDivs[i]);
}
}
placeRandomImages(2, ["imaaaga", "imaaaga2"]);
push()
, принимающий пачку новых параметров. Но мы готовы к обоим вариантам: пушим или в крутой объект, или в пустой массив.(function(w, n) {
w[n] = w[n] || [];
w[n].push({a: "A", b: "B"});
})(window, 'tosterQuery');
// в скрипте подгружаемом позже
(function(w, n) {
// не перезаписать объкт. Только если пустой или массив.
if (w[n] && !Array.isArray(w[n])) return;
function f() {
const data = w[n] || [];
// определяем свой push с блекджеком
this.push = function(x) {return data.push(x);}
this.getData = function() {return data;}
}
w[n] = new f(); // занимаем глобальное свойство
})(window, 'tosterQuery');
tosterQuery.getData(); // [{"a":"A","b":"B"}]
tosterQuery.push({z:"Z"});
tosterQuery.getData(); // [{"a":"A","b":"B"}, {"z":"Z"}]
if (!roofpt) Price2 = 5500; // null, 0, undefined, false, пустая строка
else if (roofmat == 1) Price2 = 7900; // и так известно, что не пустое
else if (roofmat == 2) Price2 = 8900; // и так известно, что не пустое
else Price2 = 0; // по умолчанию
&&
выше, чем ||
. Эти два условия выглядят похоже, имелась в виду, наверное, лишняя перепроверка на null/ноль:(roofpt == null || roofpt == 0)
(roofpt !== null || roofpt !== 0 && roofmat == 1)
&&
, потом ||
:A || B && C === A || (B && C)
// и второе условие на деле считается так:
(roofpt !== null || (roofpt !== 0 && roofmat == 1))
rootpt
, неравном null
.==
и строгое неравенство !==
. Разжёвывать не буду, чтобы вы провалили собеседование./root
создать папку .ssh
с правами 700
. В ней создать файл authorized_keys
в который вставить текст публичного ключа и chmod 600 /root/.ssh/authorized_keys
mkdir -p /root/.ssh
chmod 700 /root/.ssh
echo "ваш пуб.ключ тут" >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys