Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Web-программирование - это просто!


Новое на сайте Программирование - это просто! (www.easyprog.ru):

В платном разделе

В бесплатном разделе

WEB-программирование: "Java Script(JS): Сильные стороны JS"

 

Не секрет, что часто многие программисты считают JavaScript очень геморройным языком. Однако у него есть много и сильных стороны, рассмотрению которых будет посвящено несколько уроков. Крокфорд Дуглас в своей книге "JavaScript. Сильные стороны" пишет, что использование некоторых функций приносит больше вреда, чем пользы. Одни функции плохо определены, другие хорошо, вероятно, это объясняется проблемой переносимости. Есть функции, которые превращают код в нечитаемый и плохо модифицируемый. Кроме того, есть функции, которые просто ужасно спроектированы.  Да, создатели языков программирования тоже ошибаются.

Для начала, давайте задаемся вопросом: что что хорошего в JavaScript? Во-первых, его связь с браузером:. Благодаря ей JS стал самым популярным языком программирования, хотя и самым презираемым.  Да, API-браузера, объектная модель документов (DOM), просто ужасны. Но она одинаковая для всех языков, путь то JS или, например, C#. Во-вторых, в основу JS положены такие хорошие идеи, как наличие функций и динамических объектов. Крокфорд Дуглас к хорошим идеям относит также и нестрогую типизацию, хотя это и весьма спорное утверждение. Плохой же идей является модель программирования на основе глобальных переменных.

Функции в JS - это объекты (в питоне, кстати, тоже). Также в JavaScript есть лямбда-выражения. По своей сути он имеет гораздо больше общего с Lisp и Scheme, чем, например, с  Java. Грубо говоря, JS - это Lisp в "шкуре" C.

Итак, давайте сначала рассмотрим грамматику языка. Начнем с комментариев. Комментарии могут быть однострочные, обозначаемые двумя наклонными чертами //, и многострочные, ограниченные внутри блока /*     */. Последние далеко не безопасны, так как символы "*/" могут встречаться в регулярных выражениях. Рассмотрим пример:

<html>

    <head>

        <meta charset="UTF-8">

        <title>Урок 123. Java Script (JS)</title>

        <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

            function validate(form) {

                var str=form.numbers.value;

                var templ=/^[ws]{3}a*/;

                if(!templ.test(str)) {

                    alert("Неверный формат!");

                    form.numbers.focus();

                    return false;

                }

                alert("Все OK!");

                return true;

            }

        </SCRIPT>

    </head>

    <body>

        <form name="myform" method="GET">

            Сюда введите что-нибудь <input type="text" name="numbers" ONKEYPRESS="return onKeyPress(event)"></input><br>

            <input type="submit" value="OK" name="ok" ONCLICK="return validate(this.form)">

        </form>

    </body>

</html>

 

Но попробовал закомментить внутренности функции validate мы "выстрелим себе в ногу":

            function validate(form) {

                /*var str=form.numbers.value;

                var templ=/^[ws]{3}a*/;

                if(!templ.test(str)) {

                    alert("Неверный формат!");

                    form.numbers.focus();

                    return false;

                }

                alert("Все OK!");

                return true;*/

            }

 

То есть, у нас регулярное выражение сработало как закрывающий комментий. Поэтому, рекомендуется отказаться от /*     */ и использовать //:

            function validate(form) {

                //var str=form.numbers.value;

                //var templ=/^[ws]{3}a*/;

                //if(!templ.test(str)) {

                //  alert("Неверный формат!");

                //  form.numbers.focus();

                //  return false;

                //}

                //alert("Все OK!");

                //return true;

            }

 

Также следует помнить о некоторых подводных камнях:

Грабли 1. В качестве имен переменных, параметров и меток нельзя использовать зарезервированные слова: break, default, function, return, var, case, delete, if, switch, void, catch, do, in, this, while, const, else, instanceof, throw, with, continue, finally, let, try, debugger, for, new, typeof. Также не следует в качестве идентификаторов назначать имена undefined, NaN и Infinity.

Грабли 2. Значения false, null, undefined, '', "", 0, NaN, если они участвуют в логических операциях, воспринимаются как "ложь", все остальные как "истина". Грабли состоят в том, что значение "0" будет интерпретировано как "истина", а 0 как число - как "ложь". Для проверки сего утверждения воспользуйтесь вот таким примером:

 

<html>

    <head>

        <meta charset="UTF-8">

        <title>Урок 123. Java Script (JS)</title>

        <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

            function test() {

                var a="0";

                if(a)

                {

                    alert("Истина");

                }

                else

                {

                    alert("Ложь");

                }

            }

        </SCRIPT>

    </head>

    <body>

        <form name="myform" method="GET">

            <input type="submit" value="OK" name="ok" ONCLICK="return test()">

        </form>

    </body>

</html>

 

Грабли 3. Для значений null и массивов (array) функция typeof возвращает "object".

Грабли 4. При использовании знака "+" происходит приведение типов. Если в выражении присутствуют срочные типы, происходит приведение к строке. Таким образом, выражение "1"+1 вернет "11"а не 2. А вот знак "-" работает по другому, выражение 1-"1" приведет все к числу и выдаст 0. Более того, даже если в выражении вычитания будет обе строки, то они приводятся к числу. Эта закономерность будет действовать и тогда, когда в выражении присутствуют и "+" и "-".  Например, результатом вот такой операции "1"-"1"+"4" будет "04".

 

Итак, с граблями более менее разобрались.  Теперь перейдем к объектам. Объект можно создать путем присваивания переменной нечта в фигурных скобках. Например, вот так можно создать пустой объект:

 

var empry_object={};

 

Что можно делать с пустым объектом? Во-первых, у него можно создать поля, см пример:

<html>

    <head>

        <meta charset="UTF-8">

        <title>Урок 123.</title>

        <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

            function test() {

                var empry_object={};

                empry_object.a=1;

                alert(empry_object.a);

            }

        </SCRIPT>

    </head>

    <body>

        <form name="myform" method="GET">

            <input type="submit" value="OK" name="ok" ONCLICK="return test()">

        </form>

    </body>

</html>

 

Данная программа не ругнется, а вполне корректно отработает. То есть, нет проверки существования полей при попытке записи в них, они просто тупо создаются!

Создать объект можно и поместив в фигурные скобки описания свойств, например вот так:

<html>

    <head>

        <meta charset="UTF-8">

        <title>Урок 123. Java Script (JS)</title>

        <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

            function test() {

                var test_object={

                    name:"Александр",

                    age:41};

                alert(test_object.name+" "+test_object.age);

            }

        </SCRIPT>

    </head>

    <body>

        <form name="myform" method="GET">

            <input type="submit" value="OK" name="ok" ONCLICK="return test()">

        </form>

    </body>

</html>

 

Именем свойства может быть любая строка, но в том случае, если это не является допустимым именем идентификатора,  то имя поля берется в кавычки. Например, вот так нельзя:

 

            function test() {

                var test_object={

                    1name:"Александр",

                    age:41};

                alert(test_object.1name+" "+test_object.age);

            }

 

А вот так можно:

            function test() {

                var test_object={

                    "1name":"Александр",

                    age:41};

                alert(test_object["1name"]+" "+test_object.age);

            }

 

Так можно, но НЕ нужно. Если хотите использовать сильные стороны, откажитесь от плохого кода.

 

Объекты могут быть и вложенными:

            function test() {

                var test_object={

                    name:"Александр",

                    passport: {

                        ser:123,

                        number:123456

                    },

                    age:41};

                alert(test_object.name+" "+test_object.age+" "+test_object.passport.ser);

            }

 

Как вы увидели из примеров,  получить значение поля объекта можно через точку, а можно через [] задав имя поля в кавычках. При попытке получить несуществующее поле возвращается значение undefined.

Следует помнить, что объекты передаются по ссылке, то есть, их присваивание не делает копирование. Давайте это проверим:

 

<html>

    <head>

        <meta charset="UTF-8">

        <title>Урок 123. Java Script (JS)</title>

        <SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">

            function test() {

                var test_object={

                    name:"Александр",

                    passport: {

                        ser:123,

                        number:123456

                    },

                    age:41};

                var test_object1=test_object;

                test_object1.name="Иван";

                alert(test_object.name+" "+test_object.age+" "+test_object.passport.ser);

            }

        </SCRIPT>

    </head>

    <body>

        <form name="myform" method="GET">

            <input type="submit" value="OK" name="ok" ONCLICK="return test()">

        </form>

    </body>

</html>

 

Данный код выдаст сообщение "Иван 41 123", несмотря на то, что мы изменили значение поля у другой переменной. А все потому, что обе переменные ссылаются на один и тот же объект. Об этом следует помнить, дабы не наступить на очередные грабли. Собственно, такое же положение дел и в других языках, например, в C#.

 

 

 


В избранное