this
.function outer() {
var a = 1; // переменная в лексическом окружении ф-ии inner()
// внутри inner() можно использовать значение a
return function inner() {
console.log("a == ", a, "this == ", this);
}
}
var f1 = outer(); // f1 - функция
f1(); // a == 1, this == window или self
var f2 = f1.bind({title: "Ololo"}); // f2 - новая функция
f2(); // a == 1, this.title == "Ololo"
valueOf()
, который для обоих возвращает не примитив (тогда бы сравнивали эти примитивы) а this
, себя же, объект. Поэтому во вторую очередь вызывается метод toString()
, который возвращает примитивы: пустую строку для массива и "[object Object]" для объекта.Когда происходит преобразование типов (т.е в случаях использования нестрогого сравнения), JavaScript преобразует типы String, Number, Boolean и Object, следующим образом:
- При сравнении числа (Number) и строки (String), JavaScript пытается преобразовать числовой литерал строки в число. Затем полученное число округляется до ближайшего возможного значения типа Number.
- Если один из операндов является логическим (Boolean), то он преобразуется в значение типа (Number). Если значение логического операнда равняется истине (true), то значение этого операнда преобразуется в 1. Иначе - в 0 (ложь / false).
- Если объект сравнивается с числом или строкой, JavaScript пытается получить значение по умолчанию для данного объекта. Полученное значение преобразуется в примитив, посредством методов valueOf() и toString(). Если преобразовать объект не удается, генерируется ошибка времени выполнения.
- Обратите внимание на то, что объект преобразуется в примитив, если, и только если, второй операнд является примитивом. В ином случае, операнды сравниваются как объекты, соответственно, операция сравнения вернет истину в том случае, если внутренние ссылки обоих объектов ссылаются на один и тот же объект в памяти.
new String('foo');
по сравнению с простой строкой.src
и потом вы добавляете свойство srcAssets
.const X = {...}
сначала правая часть – создаётся объект без имени с указанными свойствами; потом ссылка на этот объект записыватся в константу X
. Поэтому в правой части рано использовать X
– он ещё не определён.X
с известными и независимыми свойствами, а позже задать ему ещё свойства:const PATHS = {
src: 'src'
};
PATHS.srcAssets = PATHS.src + '/assets';
-1..1
. Одинаковые seed
и x, y
всегда вернут одинаковое значение. в каких случаях использовать тернарные операторы
https://vash-site.com/proxy/google.com
– а все запросы к /proxy/*
будут проксироваться на указанный после слеша домен.// меняет два элемента массива in-place
function swap(arr, a, b) {
arr[a] = arr.splice(b, 1, arr[a])[0];
}
const Twelve = [1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10 ,11 ,12];
swap( Twelve, 2, 5); // индексы считаются от 0
swap( Twelve, 7, 11);
swap( Twelve, 9, 4);
Twelve // [1,2,6,4,10,3,7,12,9,5,11,8]
function isAscending(arr) {
if (arr.length < 2) return true;
let prev = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < prev) return false;
prev = arr[i];
}
return true;
}
isAscending([1,2,3,4,5]) // true
isAscending([1,2,1,4,5]) // false
const n = Math.floor(((new Date()) - (new Date(2016, 0, 15))) / 864e5);
document.querySelector('div.statistic-block h2').innerText = n;