Quiz, WTF JS
instanceof вернет false, если слева примитив, иначе возьмет prototype справа и будет по левой цепочке идти, пока не найдет null и сравнивать
При приведении к примитиву default (например через +) везде сначала вызывается valueof, потом toString, у дат же наоборот. Сейчас есть Data.prototype[Symbol.toPrimitive]
str += "" - не верно, так как будет default приведение, а не строковое
Если valueof вернет объект (по умолчанию на прототипе объекта), вызывается toString (нужен именно примитив, а не объект)
Array#toString же вызовет join.
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]
Сведение к строке
`${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