Эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.
Но самый сок, когда в кириллическом названии фирмы встречаются только те буквы, которые есть в латинице, тут даже и не сообразишь на каком языке следует
читать вывеску:


Хочу порекламировать тир в Казани, находится в торговом центре «ИксЭль». Исключительно хорошо пристрелено оружие и посетителей нет,
я сегодня там из пневматики выбил 21 из 21 (справедливости ради должен сказать, что одна из фигурок не упала, я прицелился ниже середины, не смог
повалить, но попадание есть) и выиграл для жены вот этого мишку.
Календарь находился на северной стене, рядом с изображением монарха. Из этого календаря можно было узнать о лунных затмениях, а также соединениях Луны, Марса и Венеры, которые произойдут в ближайшие несколько тысяч лет. Вычисления продолжалась и на восточной стене дома. Там изображены четыре колонки цифр — это расчеты фаз Луны и солнечный календарь. «Когда мы с моими студентами изучили эти колонки, мы обнаружили, что это календарь на два с половиной миллиона дней — то есть на семь тысячелетий вперед!» — говорит Уильям Сатурно.
Стоит отметить, что никакого упоминания 23 декабря 2012 года — даты, когда произойдет завершение одного из больших циклов календаря майя и которую многие ошибочно принимают за предсказание конца света, — в таблицах нет.
Я пропал и не пишу в блог, потому что отдыхаю с женой в Таиланде, в Паттайе. Бесплатный интернет есть только в лобби отеля, а в номерах
час стоит почти 200 рублей. Меня жаба душит.var_dump( (bool) "0"); // false
var_dump( (bool) "00"); // true
Сделано это по определённым причинам. ПХП, исторически, был языком не просто для чайников, а для фанерных чайников,
когда снаружи приходят параметры в GET или POST запросе, ПХП их раскладывает в специальные переменные, но все данные имеют
тип «строка» (иногда — массив строк).var_dump(array_filter( [ 0, null, false, "00", "0" ])); // останется один элемент — "00"
var_dump(in_array("0", [ false ])); // true
Или вот, например, поведение конструкции «empty» с той же строкой (именно из документации по этой конструкции я узнал о существовании такого нуля, ещё в ПХП3):
$z = "0"; $zz = "00";
var_dump(empty($z)); // true
var_dump(empty($zz)); // false
При этом, один пробел и всё, ноль перестаёт быть «магическим»:
var_dump(in_array(" 0", [ false ])); // false
If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.Причём, «похоже на число» — это не обязательно нечто десятичное:
var_dump("0x01" == "1"); // true
// но при этом
var_dump("0b01" == "1"); // false
var_dump("014" == "12") // false
Эта проблема косвенно проявляется при поиске в массиве. Казалось бы, строкового значения «1.5» в массиве нет:
var_dump(in_array("1.5", ["01.5000"])); // true
// правда есть специальный флаг для строгого стравнения, о котором почему-то мало кто знает:
var_dump(in_array("1.5", ["01.5000"], true)); // false
Но настоящая проблема вот в чём. ПХП, конечно, смотрит, похожа ли строка на то, что он считает числом, но никак не проверяет сможет ли он «съесть то, что укусил»:
var_dump("10000000000000000000000000000000" == "10000000000000000099999999999999"); // true
Сюрприз?switch ("1.5") {
case "0001.500": echo "пичалька"; // ещё какая!
}
Конструкция «switch» всегда использует нестрогое сравнение, об этом нужно помнить.



Николай Басков в комиксе. На обложке — Халк, Железный человек, другие супергерои, внутри — Басков.
Сегодня утром вернулись из Лениногорска, были с женой и младшим братом в гостях у родителей, навестили ещё и двоюродную бабушку, сестру
моей бабушки со стороны мамы.console.log([] instanceof Array); // true
А редко его используют, потому что конструкция «instanceof» не везде реализована. Я заблуждался. Вот правильный способ:
console.log(Object.prototype.toString.call([]) == '[object Array]'); // true
И вот почему. Оказывается, у каждого фрейма своя иерархия типов, если один фрейм передаёт во второй какой-то объект, то «instanceof» даст «false», так как сравнивает c «Array», локальным для этого фрейма. Проблему иллюстрирует следующий пример:
<script>
function Up(arr, iframeWindow) {
alert(arr instanceof Array); // false
alert(arr instanceof iframeWindow.Array); // true
alert(Object.prototype.toString.call([]) == '[object Array]'); // true
}
</script>
<iframe src="data:text/html, <script>parent.Up([], window)</script>"></iframe>
with (function () {
// тело функции
}) call();
На мой взгляд, весьма и весьма семантично. Что скажете?
(function () {
// скобки вокруг функции говорят интерпретатору, что это выражение
})();
Вообще говоря, можно использовать любые средства, чтобы декларация стала частью выражения. Например, можно что-то прибавить к декларации. Или использовать любую унарную операцию.!function () {
//
}();
Во-первых, на один байт меньше. Если таких функций много, экономия существенная. Во-вторых, скобки надо балансировать, а унарный оператор — нет.var a = 5
(function() {})()
Причём ошибку, которую найти иногда довольно трудно, да и сообщение о ней не самое дружественное: «TypeError: 5 is not a function». На самом деле, тут пропущена точка с запятой. Интерпретатор считает, что ему встретились две части выражения, между которыми пропущен какой-то знак. Эта ситуация часто встречается при автоматическом объединении двух скриптов в один.var a = 5
!function () {}()
Тут интерпретатор, встретив унарный оператор, понимает, что предыдущее выражение закончилось и началась новая конструкция.