Quiz, WTF JS


david shariff's quiz

y combinator

instanceof вернет false, если слева примитив, иначе возьмет prototype справа и будет по левой цепочке идти, пока не найдет null и сравнивать

При приведении к примитиву default (например через +) везде сначала вызывается valueof, потом toString, у дат же наоборот. Сейчас есть Data.prototype[Symbol.toPrimitive]

str += "" - не верно, так как будет default приведение, а не строковое

Если valueof вернет объект (по умолчанию на прототипе объекта), вызывается toString (нужен именно примитив, а не объект)
Array#toString же вызовет join.

kangax quiz

Array instanceof Array // false
Array instanceof Function // true
Function instanceof Function // true
Object instanceof Object // true

Чтобы не искало в with есть

var find = 10
with ([]) {
  find // 10
  indexOf // функция массива
}

Array.prototype[Symbol.unscopables]

lazy load

es6-quiz

js puzzlers herokuapp

Сведение к строке
`${val}`
String(val)

val += "" - так делать не надо


Сведение к числу
+val
Math.trunc(val) - к целому, больше, чем 2 в 32
val | 0
val >> 0
val >>> 0 - целое положительное

Если reduce передать пустой массив - будет ошибка

Number.MAX_SAFE_INTEGER - 2 в 53 - самое большое число в js
Number.isInteger
Number.MIN_VALUE - минимальное значение больше нуля

В es5, es3 RegExp.prototype, Array.prototype, Date.prototype, Function.prototype все того же типа, что и их пораждения.

Array.isArray( Array.prototype ) // true
function func(a, b, c) {
  c = 10 // arguments[2] == 10
}
func(1, 1, 1)
(function fun(Infinity, length, __proto__) {
  return [,,~0.[0|0]][fun.__proto__.length
    && Infinity, -~String(this).length >> __proto__] << (0. === .0) + Infinity;
}).apply(typeof fun, [,,2]); // -1

приоритет операторов