const s = `login password a=23 b=73 c=3
login password a=23 b=3
login password a=73 c=3
login password b=23 c=73`;
const iterator = s.matchAll(/(?<=login password )(a=(?<a>\d+) ?)?(b=(?<b>\d+) ?)?(c=(?<c>\d+) ?)?/g);
[...iterator].forEach(match => console.log(match.groups));
{a: "23", b: "73", c: "3"}
{a: "23", b: "3", c: undefined}
{a: "73", b: undefined, c: "3"}
{a: undefined, b: "23", c: "73"}
"a=23 b=73 c=3"
, разбить по пробелам, потом каждый элемент разбить по знаку =
на ключ и значение. Копирую его в проект и при вызове метода на кнопку получаю в консоли:
Нашел пример в документации. Копирую его в проект
<!DOCTYPE html>
<html>
<head>
<script src="https://unpkg.com/vue@next"></script>
</head>
<body>
<div id="mount-point"></div>
<script>
const Profile = {
template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
data() {
return {
firstName: 'Walter',
lastName: 'White',
alias: 'Heisenberg'
}
}
}
Vue.createApp(Profile).mount('#mount-point')
</script>
</body>
</html>
Что это и почему?
functionName
существует в контексте контент скрипта.onclick="functionName()"
по клику на нее functionName
будет вызывать в контексте веб страницы, где данной функции нет.addEventListener
на нее.let input = "4865 6c6c 6f20 576f 726c 6421 20d0 9ad0 b0d0 ba20 d182 d0b2 d0be d0b8 20d0 b4d0" +
"b5d0 bbd0 b03f 20d0 a7d1 82d0 be20 d0b4 d0b5 d0bb d0b0 d0b5 d188 d18c 3f20 d09f" +
"d0be d187 d0b5 d0bc d183 20d1 82d0 b0d0 ba3f 0a";
let utf8HexBytesStr = input.replaceAll(" ", ""); // "48656c6c6f2..."
let utf8HexBytes = utf8HexBytesStr.match(/.{2}/g); // ["48", "65", "6c", "6c", ...]
let utf8Bytes = utf8HexBytes.map(hexByte => parseInt(hexByte, 16)); // [72, 101, 108, 108, ...]
let ui8a = new Uint8Array(utf8Bytes);
let blob = new Blob([ui8a]);
let text = await blob.text();
console.log(text);
"Hello World! Как твои дела? Что делаешь? Почему так?
"
async function timer() {
let countdown = 5;
while (countdown--) {
console.log(countdown + 1);
await sleep(1000);
};
console.log("done");
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
let execId = 0;
async function timer() {
let countdown = 5;
const id = ++execId;
while (countdown--) {
if (id !== execId) {
return;
}
console.log(countdown + 1);
await sleep(1000);
};
console.log("done");
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function hasBanWords(text) {
const url = "banwords.json";
const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.send();
return new Promise(resolve => {
xhr.addEventListener("load", function() {
if (this.status === 200) {
const words = JSON.parse(this.response);
const hasSomeWords = words.some(word => text.includes(word));
resolve(hasSomeWords);
}
});
});
}
console.log(await hasBanWords("bitch on the beach"));
function appendScript(src, integrity) {
return new Promise((resolve, reject) => {
const script = document.createElement("script");
script.onload = resolve;
script.onerror = event => reject({message: "Failed to load script", src, integrity, event});
script.src = src;
script.async = true;
if (integrity) {
script.integrity = integrity;
script.crossOrigin = "anonymous";
}
document.body.append(script);
});
}
А что в такой ситуации мешает просто создать объект
export const singleton = {name: "foo"}; // Полноценный синглтон для JS
Какие здесь преимущества именно в создании класса?
instanceof
, чтобы удостовериться, что передается именно инстанс того класса, который может быть лишь в одном экземпляре, а не какой-то другой объект. А если это "просто объект" — ты сможешь подсунуть полную "копию" без каких-либо проблем, создав ее с помощью литеральной записи. Как отключить асинхронность в JS?
XMLHttpRequest
, что в приведенном примере кода как раз таки и сделано. filter.update.country()
this
является объект update
, а не filter
.class Filter {
static sex = null;
static player = null;
static country = null;
static updateSex() {
Filter.sex = document.querySelector("#sex").value;
}
static updatePlayer() {
Filter.player = document.querySelector("#player").value;
}
static updateCountry() {
Filter.country = document.querySelector("#country").value;
}
}
Filter.updatePlayer();
console.log(Filter.player);
class Filter {
constructor() {
this.sex = null;
this.player = null;
this.country = null;
}
updateSex() {
this.sex = document.querySelector("#sex").value;
}
updatePlayer() {
this.player = document.querySelector("#player").value;
}
updateCountry() {
this.country = document.querySelector("#country").value;
}
}
const filter = new Filter();
filter.updateCountry();
console.log(filter.country);
class Filter {
fields = {
country: null,
}
update = {
caller: this,
country() {
this.caller.fields.country = "123";
}
}
}
const filter = new Filter();
filter.update.country();
console.log(filter.fields.country);