Object.defineProperty(window, "test", {
value: "QnA"
});
Присвоение нового значения ошибки не вызовет, но и не сработает: сохранится указанное значение.test = "X";
test // "QnA"
var test = "Y";
test // "QnA"
window.test = "Habr";
test // "QnA"
const test = "Z" // Uncaught SyntaxError: redeclaration of var test
writable: false
– оно и так по умолчанию false. И именно это свойство дескриптора определяет, можно ли назначить новое значение.writable: false
, чтобы свойство стало «константным».var test = "Habr";
Object.defineProperty(window, "test", {
value: "QnA",
writable: false,
});
var v12 = {
valueOf: () => {console.log('valueOf'); return [1];},
toString: () => {console.log('toString'); return '2';}
}
console.log(v12 + 2);
Получается, то сравнение
'hello' == '123'
это
parseInt('hello') == parseInt('123')
так?
И [] == {} аналогично parseInt([]) == parseInt({})?
'hello' == 123
приведёт строку к числу ToNumber('hello') == 123
и получится NaN == 123
→ сравниваем два числа и получаем false
.Number
. let
на каждой итерации создаётся окружение. for(var i = 0; i < 3; i++) {
let j = i; // доступна только на этой итерации в этом блоке
setTimeout(() => console.log(j), 0);
}
/*
0
1
2
*/
async getAll(_sql) {
let conn;
try {
conn = await this.pool.getConnection();
return await conn.query(_sql);
} catch (err) {
throw Error(err);
} finally {
if (conn) {
await conn.release();
}
}
}
getAll("SELECT * FROM users").then(rows => {
if (rows.length) {
return rows[0];
} else {
return null;
}
})