Подтвердить что ты не робот

Особенности JavaScript, которые разработчики C не могут воспользоваться?

Штабелеры,

В первом классе Computer Science, который я взял, профессор использовал С++ в качестве учебного языка. Он подчеркнул, что важными вещами для понимания являются концепции программирования, а не только сам язык.

В последние несколько лет я попал в карьеру в веб-разработке, основанной на базе данных. Сначала я был занят обучением использованию серверных инструментов программирования, а именно ASP.net. Большинство моих коллег из моих ранних дней не использовали большой код сценариев на стороне клиента, но я прилагаю большие усилия, чтобы научиться писать хорошие сценарии на стороне клиента.

Я начал серьезно использовать jQuery.

Первое, что большинство разработчиков С++ или .net заметят о JavaScript после первого столкновения с ним, заключается в том, что синтаксис очень похож на языки C-стиля.

Существуют важные отличия. JavaScript использует различные типы данных, позволяет объявлять массивы в строке и использует собственный синтаксис объекта с фигурными фигурными скобками. Прежде всего, JavaScript является интерпретируемым языком, который позволяет пользователю взаимодействовать с "моделью документа-объекта" с помощью веб-браузера, который, как правило, скомпилирован на С++ в собственный код (или иногда управляемый код). Было бы глупо сделать более поверхностное сравнение двух языков.

Я хотел бы спросить: "Когда я научу писать код JavaScript, часть моего разума не может не думать о нем как о том, как C-код, потому что он похож на код C. Какие ошибки я могу сделать из-за этого? Какие полезные функции языка я, вероятно, не использую?"

Обновление: Я редактировал заголовок вопроса, потому что он ясно, что мой старый заголовок был неоднозначным: -/

4b9b3361

Ответ 1

В основном это проблема с написанием процедурного кода в JavaScript. Вы пропустите две большие функции, если вы пишете JavaScript, как C:

Прототипный ООП и Функции первого класса

Прототипный ООП позволяет создавать новые объекты и применять многие шаблоны ООП других языков. Это довольно отличается от классического ООП.

Хорошая статья о том, что это будет JavaScript Garden Objects раздел

Функции первого класса позволяют передавать функции в качестве аргументов, и это позволяет писать функциональный код. Только с этим вы можете приблизиться к мощности LISP, ML или Haskell. Снова хорошая статья Раздел JavaScript сада JavaScript.

Причина, по которой эти две вещи велики, заключается в том, что они позволяют использовать парадигму ООП и Функциональную парадигму.

В противном случае вы застрянете в написании процедурного JavaScript навсегда.

Ответ 2

Здесь не хватает места, кроме того, поскольку есть хотя бы один отличный источник, я просто разместил ссылку:

Чтобы узнать REAL (глубокие концептуальные) основы Javascript, посмотрите видео от Дугласа Крокфорда в http://developer.yahoo.com/yui/theater/

Он один из самых важных людей, который выявил (до тех пор) скрытую великую силу языка. Кроме того, он очень хороший ведущий даже для такой относительно сухой темы, как язык программирования.

Однако эти видеоролики не очень подходят для новичков в программировании, но тогда вопрос, который вы поднимаете, не является для них полезным, поскольку любой ответ требует более глубокого понимания и совсем немного практики.

Core Javascript - это очень RAW. Вы делаете то, что происходит на других языках во время компиляции, например, когда ваша программа JS загружена, вы уже выполняете код, который динамически собирает объекты, "классы" и т.д., И после этой начальной загрузки и выполнения он может быть ПОЛНОСТЬЮ другой части программного обеспечения. У вас нет этих двух этапов на любом другом (старом) языке (вы можете сделать это в Ruby, аналогичная история, эти современные языки имеют определенные функции). Поэтому НЕ полезно сравнивать JS и C/С++, особенно когда вы смотрите только на материал синтаксиса leven, и в этом случае вы ничего не узнаете вообще. Тем не менее, это может обеспечить иллюзию обучения. ЧАСЫ CROCKFORD.


Пример области блока для обсуждения в другом ответе здесь, так как у меня нет другого места, чтобы поместить его сейчас (для удобства, завернутого в функцию "foo" ). Существует претензия, что вы не можете обладать блоком в Javascript. Конечно, на других языках вы используете гораздо более знакомый синтаксис, часто просто включающий {} или иногда BEGIN... END. Во всяком случае, нижеследующее обеспечивает ТОЧНОСТЬ блока. Да, он использует ключевое слово "function", но только потому, что вы не привыкли к нему, это не меняет фактов.

function foo () {
    var a = 1;

    (function () {
        //THIS IS BLOCK SCOPE
        var a = 2;
        console.log(a);
    })();  //IMPORTANT: the "()" executes it immediately, INLINE

    console.log(a);
};

Вызов foo():

2
1

Если кто-то все еще говорит, что "область блока невозможна (в JS)", они должны указать, какой "объем блока" должен иметь тот, что приведенный выше пример не обеспечивает, за исключением того, что некоторые из них привыкают и менее эстетичны чем обертывание кода в {} или BEGIN... END.

Ответ 3

Я бы сказал

  • Затворы
  • Безымянные встроенные объекты
  • Динамическая типизация
  • Сбор мусора
  • Динамические массивы и объекты

но кто-то из C не может "пропустить" эти функции... можно с радостью использовать javascript как C (конечно, потерять много), а также создать настоящий кошмар для стипендиатов программист, который действительно знает javascript, если они должны работать над одним и тем же проектом).

Ответ 4

(Удалено предыдущий пример)

Я думаю, что причина 1 путаницы - отсутствие области блока в JavaScript:

Вот пример:

if (true) {
    var foo = 7;
}
alert(foo);

"7" предупреждается. Не ожидаемый результат для программиста на С++.

Ответ 5

Как JS отличается от С++:

  • Динамический ввод
  • Функциональное программирование (приводящее к вложенным функциям, целям областей и закрытие)
  • Бесклассовое ООП и прототипное наследование
  • Отсутствие области действия блока
  • Интерпретированный язык
  • Язык сценариев (поэтому зависит от среды)

На самом деле, я написал несколько руководств по JavaScript, которые выделяют эти же моменты. Вы можете прочитать его на мой блог

Ответ 6

То, что я всегда пропустил:

(s)printf

или что-то очень похожее (= форматированный ввод/вывод).

Что разработчики C, вероятно, не будут использовать так много (вначале): функции (lambdas), если они не использовали указатели функций в C.

Ответ 7

Вот пример, который я недавно узнал: переменная arguments. Эта переменная может использоваться в любой функции для доступа к аргументам, переданным функции как массив.

Когда я впервые узнал, что вы можете объявить функцию с параметрами x и вызвать ее с параметрами y
(x!= y), я подумал, что это ужасно. Я думал, что делать что-то подобное должно создаст ошибку; результат мышления о Javascript-коде, как если бы это был код C.

Переменная arguments позволяет вам работать с функцией, которая может получать любое количество переменных. Рассмотрим следующий пример:

function returnCount() {
    var count = 0;
    for(i=0;i<arguments.length;i++) {
        count++;
        alert(arguments[i]);
        }
    return count;
}

var number = returnCount('alpha','bravo','charlie');
alert(number);

Когда returnCount вызывается с 'альфа', 'bravo' и 'charlie', он будет предупреждать со всеми тремя значениями и затем возвращать номер три. Узнайте что-то новое каждый день!

Ответ 8

Я нашел Дугласа Крокфорда достаточно информативным. В дополнение к видео, упомянутым в предыдущем ответе, у Crockford есть веб-сайт с очень хорошей информацией: http://javascript.crockford.com/.

Я хотел бы добавить что-то новое, что я узнал, что разработчики C скорее всего пропустят: небольшое количество примитивных типов данных и строгий оператор равенства (===).

Javascript имеет только boolean, string и число для примитивных типов данных.

Конечно, C имеет логические и строковые (C-строки, yada yada yada...), но C имеет много разных типов примитивов чисел: 16-битное целое число, 32-битное целое число, 32-битный байтовый float, 48-бит и т.д. Javascript имеет только 64-битный float, плавающая точка с двойной точностью IEEE 754.

К сожалению, это делает странные вещи с арифметикой, так что, например, 0.1 + 0.2 == 0.3 оценивается как false из-за того, как работает арифметика с плавающей запятой.

Что касается строгого оператора равенства (===), он работает как обычный оператор равенства, но без принуждения типа. Это означает, что 3 == "3" оценивает значение true, но 3 === "3" оценивает значение false.

Ответ 9

Вот еще один фрагмент кода (исключая из следующей ссылки) кода, который дает моей C-голове мигрень. Он позволяет вам определять пользовательские события для вашего кода Javascript.

http://www.geekdaily.net/2008/04/02/javascript-defining-and-using-custom-events/

var CustomEvent = function() {
    //name of the event
    this.eventName = arguments[0];
    var mEventName = this.eventName;

    //function to call on event fire
    var eventAction = null;

    //subscribe a function to the event
    this.subscribe = function(fn) {
        eventAction = fn;
    };

    //fire the event
    this.fire = function(sender, eventArgs) {
        this.eventName = eventName2;
        if(eventAction != null) {
            eventAction(sender, eventArgs);
        }
        else {
            alert('There was no function subscribed to the ' + mEventName + ' event!');
        }
    };
};