// random order in-place
const shuffle = array => {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1)); // random index from 0 to i
[array[i], array[j]] = [array[j], array[i]];
}
};
// init
let coinIndex = -1;
const button = document.querySelector('.button');
button.addEventListener('click', () => {
if (coinIndex < 0) {
shuffle(coinFlip);
coinIndex = coinFlip.length - 1;
}
console.log(coinFlip[coinIndex]);
coinIndex--;
});
id
?const handleClick = id => () => {
document.querySelector('.container_wrp')?.remove();
const div = document.createElement('div');
div.style.width = '700px';
div.style.height = '500px';
div.id = id;
div.classList.add('container_wrp');
wrpBlock.appendChild(div);
};
jccBtnJap.addEventListener('click', handleClick('jap_container'));
jccBars.addEventListener('click', handleClick('stick_container'));
тут handleClick()
возвращает функцию, которая даёт создаваемому элементу переданный id. Thefor...in
statement iterates over all enumerable properties of an object
that are keyed by strings
(ignoring ones keyed by Symbols),
including inherited enumerable properties.
const m = new Map();
m.set({}, 'obj');
m.set('a', 'A');
// это другое
m.b = 'B';
for (let prop in m) {
console.log('property', prop);
}
// property b
open -n "/Applications/Calculator.app"
– каждое выполнение запустит новую копию Калькулятора для примера.import produce from "immer"
const nextState = produce(this.state, draft => {
// тут можно всё менять, не беспокоясь об иммутабельности
const { catValue } = draft;
catValue.cat.colors = Color.BLACK;
});
this.setState(nextState);
import produce from "immer"
const { catValue } = this.state;
const nextCatValue = produce(catValue, draft => {
// тут можно всё менять, не беспокоясь об иммутабельности
catValue.cat.colors = Color.BLACK;
});
this.setState({ catValue: nextCatValue });
cloneNode()
сработает только если слушатели прописаны прямо в атрибутах элемента <a onclick="alert('Habr')">click me</a>
addEventListener()
скопировать можно примерно никак.function myClickHandler(event) {
// что-то сделать по поводу клика
}
element1.addEventListener('click', myClickHandler);
element2.addEventListener('click', myClickHandler);
element3.addEventListener('click', myClickHandler);
<div id="parent">
<button>1</button>
<button>2</button>
<button>3</button>
</div>
и слушать клики на div#parent Для того, чтобы объект был итерируемым, в нем должен быть реализован метод@@iterator
, т.е. этот объект (или любой из объектов из его prototype chain) должен иметь свойство с именемSymbol.iterator
:
Свойство:[Symbol.iterator]
Значение: Функция без аргументов, возвращающая объект, соответствующий iterator protocol.
{ next() { /* ... */ }}
, или, как в вашем примере, метод next()
определён на самом объекте, поэтому возвращается this
.[...Collection.values()].sort((a, b) => a.guild.raw - b.guild.raw).pop()
Map
. Привести его значения к массиву. Отсортировать по значению guild.raw
по возрастанию. Взять последний объект – он с наибольшим значением raw
.[...Collection.values()]
.reduce((max, current) => max.guild.raw > current.guild.raw ? max : current)
Стрелка=>
ничего не привязывает. У функции просто нет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
(function toster() {
console.log(toster);
})();
{ "кришна": 4, "харе": 4, ":-O": 1 }
Оставить только те, где значения 1. Собрать в массив.const unique = arr => arr.filter((item, i) => i === arr.indexOf(item) && i === arr.lastIndexOf(item));
let offset = 0;
async function requestAndTreatment() {
// ...
const point = res.data[offset++];
data.addData([[res.timestamp, point.open, point.high, point.low, point.close]]);
}
second
,const timerObject = {
DATE: new Date(),
listDATE: {
get second() {
return new Date().getSeconds();
},
},
};
// читать, как обычно
console.log( timerObject.listDATE.second );
// через секунду
setTimeout(() => console.log( timerObject.listDATE.second ), 1000); // на 1 больше
const timerObject = {
DATE: new Date(),
listDATE: {
second: () => new Date().getSeconds(),
},
};
// использование
console.log( timerObject.listDATE.second() );