Что легче javascript или c
Перейти к содержимому

Что легче javascript или c

Почему JavaScript работает быстрее, чем С++?

Да, вы не ослышались. Глючный, тупой, тормознутый JavaScript работает быстрее, чем С++. Подождите тянуться к return userKarmaVote(), дайте мне возможность всё объяснить. Адвокат!

Есть три вида лжи

Есть такой проект под названием Benchmarks Game. Ребята написали программы (обход бинарных деревьев, n-body и т.д.) на всех популярных языках программирования и разработали методику измерения скорости и потребления памяти. Прежде чем читать дальше, просьба ознакомиться с методологией измерений.
Реализация каждого алгоритма подробно описана (например, nbody). Это open-source и если вы считаете, что какой-то алгоритм реализован не самым оптимальным способом, то можете предложить собственное решение.

Из всех интерпретируемых языков JavaScipt работает быстрее других. Он в пять раз быстрее, чем Python и Ruby (в том числе JRuby).

На сегодняшний день JavaScript — это самый быстрый интерпретируемый язык в мире.
Возвращаясь к C++. По алгоритму regexdna JavaScipt отрабатывает чуть быстрее, чем C++. При этом нагружает CPU в два раза меньше, хотя и потребляет в два раза больше памяти.
По другим алгоритмам JavaScript, естественно, отрабатывает медленнее C++, но учитывая что они изначально в разных весовых категориях (компилируемый язык со статической типизацией против интерпретируемого языка с динамической), разница не такая уж большая.

Почему JavaScript такой быстрый?

Интерпретаторы для Python/Ruby были написаны ограниченным числом людей. Эти люди, возможно, безумно талантливы, но на стадии разработки у них не было никакой конкуренции. Они конкурировали только с собой, со своими представлениями о скорости и качестве. Интерпретатор же для JS родился в конкурентной борьбе лучших умов мира. Mozilla разработала SpiderMonkey, Google разработал V8, Microsoft открыли Chakra. Все они работали в жесточайшей конкурентной борьбе.

Когда у команды NodeJS встал вопрос о выборе движка для JS, они просто посмотрели бенчмарки, увидели что V8 намного быстрее и выбрали его. Если завтра Chakra от Microsoft будет работать быстрее Google V8, то не будет никакой проблемы перейти на него.

Почему JavaScript такой медленный?

Как было сказано выше, JavaScript как язык — быстрый. Однако считается, что «нативное» предназначение JS — манипуляции с DOM. На самом деле это уже давно не так и JS успешно используется на сервере, в мобильных устройствах и даже в микроконтроллерах. Но речь не об этом. Речь о том, что когда вы с помощью JavaScript работаете с DOM, то тормозит не JS, а DOM. Есть много причин, почему DOM такой медленный, но я позволю себе сузить фокус только на одной причине. Проблема в самой спецификации HTML. В разделе 1.1.1 The DOM Structure Model есть следующий абзац:

…objects in the DOM are live; that is, changes to the underlying document structure are reflected in all relevant NodeList and NamedNodeMap objects…

Смысл в том, что объекты в дереве DOM — «живые». Это означает, что при любом изменении любой части DOM эти изменения отражаются в каждом объекте DOM.
Крупные кампании, такие как Flipboard, упорно боролись с лагами DOM. В итоге у них ничего не получилось и они смогли добиться 60 FPS только заменив DOM на Canvas. JavaScript никуда не делся, а лаги пропали. По этой же причине Netflix отказались от DOM на своих TV-приставках, а Реакту пришлось придумывать свой «виртуальный DOM».

Еще раз: JavaScript на клиенте не лагает. Лагает медленный DOM (точнее манипуляции с DOM). Не важно чем вы будете менять DOM — джава-скриптом или ассемблером. DOM все равно будет притормаживать. Именно из-за тормознутости DOM, JavaScript стал считаться медленным языком. Это историческая несправедливость и от нее давно пора избавиться.

WebAssembly

В этой связи у многих существуют неоправданные ожидания от прихода WebAssembly. Дескать, придет WebAssembly порядок наведет и мы наконец-то откажемся от «тормознутого» JS. Во-первых, даже после прихода WebAssembly работа с DOM останется за JavaScript. Да, какие-нибудь фреймворки (типа AngularJS) получат возможность перенести тяжелую логику на C/C++, но суммарный прирост от этого будет минимальным. Во-вторых, когда WebAssembly сможет напрямую манипулировать DOM’ом, минуя JS, прироста по скорости не будет, т.к. тормозит DOM, а не JS.

Хейт

Я понимаю, что скорость работы — не главный критерий оценки языка. Нужно учитывать потребление памяти, нагрузку на CPU и т.д. Я понимаю, что одно дело — скорость работы каких-то академических алгоритмов, а другое дело — скорость работы настоящего продакшн-приложения. Я понимаю, что кроме алгоритмов есть еще паттерны и подходы, и что ваш асинхронный ASP.NET может работать быстрее асинхронного NodeJS.

Однако JavaScript уже достаточно подвергся нападкам (заслуженным и незаслуженным) за свое «странное» поведение, за свое отношение к типам, к наследованию и т.д. Но вешать на него еще и ярлык тормознутости — это перебор. Остановитесь!

Хочу войти в IT, что лучше, JavaScript или C++?

Мне 29, я не училась на программиста, но с математикой в школе было неплохо, и еще немного изучала на одной работе язык 1С. У меня есть идея программы и мечта создать её. А мой молодой человек сейчас переучивается на художника, чтобы рисовать для игр, и хочет в будущем создать игру на движке Unreal Engine, язык в котором, как известно, C++. Слышала, что C++ используется в играх и многих программах. Так что этот язык может быть полезен и мне и моему молодому человеку, если я буду делать вместе с ним игру. С другой стороны, в интернете пишут, что C++ очень сложный язык для новичка и на рынке труда джуниоры требуются не часто, а вот, например, JavaScript и вообще программирование сайтов — это сфера, через которую легче и быстрее всего можно войти в программирование, к тому же веб-разработка мне в принципе тоже интересна. Отсюда вопрос: стоит ли изучить JavaScript и быстрее войти в эту сферу, а потом переключиться на игры и программы или лучше не тратить время на другой язык и сразу углубиться в C++?

Лучший ответ

Насколько понял по описанию, вариантов по сути нет. Есть обычный мандраж перед неизвестностью. с++ не то, чтобы сложен, он многообразен, широк, глубок и полноценен. Можно сидеть в 4х стенах рядом с плитой и раковиной, а можно жить в лесу. среди диких зверей .Так что, вперёд и вверх
https://academiait.ru/course/uroki-unreal-engine-4/

«переучивается на художника». Смело сказано, жизнеутверждающе, бодрит.

ваша задумка грешит излишним оптимизмом. геймдев (в т. ч. на UE) доходов не принесёт, а вот для чсв это вполне нормальное времяпровождение.

Остальные ответы

Джаву учи. Там побольше возможностей, считаю. Он сложный, но того стоит.
На джаве тоже можно делать игры. Конечно не прям крутые, но можно.

КонстантинМастер (2481) 3 года назад
Ахаха, а чего не ассемблер! Чем современный Котлин хуже старогй Java-ы?

Hoodlum Гуру (3650) Константин, Так не говорил я что Котлин плохой, просто Джава как-то прогрессированная более, сложная, но имеет больше возможностей. Совмещает в себе все с других языков программирования. Хорошо это, или плохо, решать только вам, я держусь на позиции Джавы.

Голова РоботаПросветленный (36288) 3 года назад

Ява несложный язык. Ява проще, чем C#, и гораздо проще, чем C++. Сложность Явы в её фреймворках (J2EE, Spring)

с++ интересный язык, но мне например не подходят те области в которых он применяется, но чтобы понять принципы процедурного и объектно-ориентированного программирования рекомендую его выучить, это так сказать заложит базу
Чтобы изучать было проще, рекомендую канал на ютубе #simpleCode

Изучайте JavaScript, будет полезнее. Вы поможете с созданием игры даже без C++. Там есть более простая система Blueprints, которую вы помёте в любом случае.

C# лучше на старте. Он проще заходит и потом на С++ перейти не сложно. Если начинать с С++ это приятная боль.

Забей, если тебе не дается нихира не один язык ты всю жизнь будешь спрашивать тут. Начни учить алгоритмы, ТУПО АЛГОРИТМЫ! не поймешь их не поймешь ни один язык

JavaScript плохой язык для новичка, потому что он кривой. Недостаток C++ в том, что он очень сложный. Это не тот язык, который изучают, чтоб быстрее начать зарабатывать деньги.
Рекомендую C#, Java или Python. Из этих языков для игр годится только C# (с движком Unity).
Невозможно работать только со знаниями этих языков. Нужно ещё много чего знать.

Человек СкрытностьГуру (2844) 3 года назад

А где JavaScript кривой то? Уже сколько лет с ним работаю и ни разу не натыкался на логическую неувязку. Он весьма логичен, хоть и не похож синтаксисом ни на один другой язык. Тут я конечно соглашусь, перейти на другой язык с JS будет куда сложнее, нежели чем с C# или того же Python. Но где он кривой? я не понимаю.

Голова Робота Просветленный (36288) Человек Скрытность, > не похож синтаксисом ни на один другой язык как же не похож? Синтаксис частично заимствован из C++.

. Мне 29. А мой молодой человек.

Учи с МОЛОДЫМ язык камасутра.
А на остальное — наплюй: есть дырка промеж ног — вот и будь довольна.
С++, блин!

Редис АлександровичОракул (75089) 3 года назад
Сразу видно что ты первый в мире программист который зарабатывает дыркой и делится опытом!

psholty46 Искусственный Интеллект (135107) . Сразу видно что. Милейший, но очинно малограмотный в этих вопросах Редис Александрович. Вишь ли, ПРОГРАММИСТОМ можно ТОЛЬКО родиться — научиться без получения особых способностей при зачатии етому делу никак НЕвозможно. Впрочем, если ты под программистом подразумеваешь умельца по втыканию в системник мышки и клавы, тады. это подтверждает мою правоту в отношении тебя.

а) на jave можно — писать игрушки и приложения на андроид — не путать с javascript

б) javascript обычно вместе с html изучают и вдобавку css
javascript то он не много не логичен по сравнению с С++ java и с # sharp

в) c # sharp не помещает изхучить

но сначало надо браться за что нибудь одно
а то голова будет пухнуть и понимания будеть ноль

Какие ещё игры? Если как гта вы их сука 1000 лет будете делать.
Над такими (похожими играми работают сотни людей профессионалов, а не геймеров которые играют игры сука в 30 лет как дети не зная какой язык програмирования выбрать и не один год).
Начни с языка C.

С++ или Javascript? [закрыт]

Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Закрыт 8 лет назад .

Здравствуйте. Недавно я начал поверхностное изучение JS. Здесь я задал вопрос о нем, но мне сказали, что лучше заняться С++. Скажите, что практичнее, легче, даёт больше возможностей? Насколько я знаю, JS не требует ничего, а С++ требует компилятор. Если не сложно, посоветуйте вместе с аргументами и ссылками. Буду очень признателен.

Отслеживать
80.9k 9 9 золотых знаков 78 78 серебряных знаков 134 134 бронзовых знака
задан 18 окт 2011 в 17:15
Егор Ерёмин Егор Ерёмин
485 4 4 золотых знака 10 10 серебряных знаков 24 24 бронзовых знака

УжОс 🙂 Не стоит нагружать себя С++ если ты хочешь тупо строить сайтики про поездки в египет %) Или для себя. С++ Компилируемый язык требуються компиляторы и разные примочки. Может я в этом плохо шарю но для тебя лучше на JS сидеть. Пока что. Когда дойдёт время и ты подумаешь что тебе мало JS не на словах (В рассуждение чего он может а чего нет) — Воооот тогдааа. Переходи на другие языки.

18 окт 2011 в 18:03

я не хочу тупо строить сайтики про поездку в Египет. Я хочу связать с этим свою жизнь, а также и карьеру. Но мне нужно начать с чего-то. Гораздо больше меня привлекает веб дизайн, поэтому изначально я настроен на JS.

18 окт 2011 в 18:43

Если хочешь стать профессиональным программистом, учи математику и теорию алгоритмов. А языки невебные все равно придется учить.

18 окт 2011 в 18:44

@vendetta8247 Если ты задал вопрос и тебе не понравилось как тебя на него ответели. То уж извени. Разбирайся тогда сам.

18 окт 2011 в 19:02
Лучше начни с PHP(Си подобный язык) проще будет переходить на ++ и он веб язык(более или менее)
19 окт 2011 в 4:20

8 ответов 8

Сортировка: Сброс на вариант по умолчанию

Аргументы? Сложно даже представить, с чего начать. Думаю, начинать вам надо с целей. Они имеют совершенно разные, почти непересекающиеся применения. Определитесь, чего вы хотите для начала.

C++ несомненно хорош для обучения программированию, так как даёт возможность понять, как работает компьютер и как работают программы. Пощупать алгоритмы и т.п. В этом смысле, JavaScript плохо подходит. Вероятнее всего, если вы будете с него начинать, то если у вас нет больших талантов и/или сильной целеустремлённости, то ничего хорошего из этого не выйдет.

Отслеживать
ответ дан 18 окт 2011 в 17:19
19.7k 1 1 золотой знак 32 32 серебряных знака 39 39 бронзовых знаков
> C++ несомненно хорош для обучения программированию Вы хотели сказать C?
18 окт 2011 в 17:21
18 окт 2011 в 17:22

Не хочу себя переоценивать, но мне кажется, что такое у меня есть (целеустремленность). Целей на самом деле у меня несколько. Меня привлекает создание различных тематических сайтов, интересно делать что-то, что облегчит веб сёрфинг. А ещё интересно очень было бы написать интересную какую-нибудь программку на андроид. В мечтах создание крутых софтин или даже игростроение (имею опыт работы с 3Д моделями и фш, правда небольшой).

18 окт 2011 в 17:22
@vendetta8247 УжОс 2x 😀

ВладимирВГ да ты гений 🙂
18 окт 2011 в 18:07

@Fatahan Всмысле? Не нравятся мои стремления? Тут уж я решил, что хочу этого. А какими целями буду добиваться — определяюсь сейчас.

18 окт 2011 в 18:30

Вообще, странное противопоставление. Это два разных языка, созданных для совершенно разных целей и имеющие совершенно разное предназначение. Если Вы только начинаете изучать программирование, то лучше, конечно, начать не с JS, поскольку это довольно узконаправленный язык. Лучше С++ или даже С, поскольку он проще и короче. Это языки общего назначения, JS в основном используется для веб-программирования. Применение его для других целей экзотика.

Для С/С++ нужен компилятор. Какой лучше выбрать здесь уже обсуждалось неоднократно. Но повторюсь. Для начинающий лучше, на мой взгляд, среда разработки Dev-C++. Простенькая, бесплатная, но довольно мощная. Использует компилятор gcc.

Отслеживать
ответ дан 18 окт 2011 в 18:10
23.9k 2 2 золотых знака 37 37 серебряных знаков 69 69 бронзовых знаков

А скажите, JS реально настолько сложный, что самому не освоить? Просто некоторые люди так говорили. Просто меня интересует именно веб

18 окт 2011 в 18:27

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

18 окт 2011 в 18:30

Вообще, из своего жизненного опыта скажу, самостоятельно я точно никогда не смогу освоить китайский язык. И вождение автомобиля. Все остальное можно освоить самостоятельно. Ну, или почти самостоятельно.

18 окт 2011 в 18:33

ну если не задумываться о кроссплатформенности и не выкладывать в паблик, а чисто для себя, то проблем наверное не будет? Спасибо за совет. Будем читать.

Сравнение C# и JavaScript. Основы

C# and JavaScript

Мой более-менее серьезный путь в программировании начался с написания программ на языке C#, иногда я пробовал писать на JavaScript, и то и дело впадал в ступор в таких ситуациях, когда неверно указывал имя переменной и узнавал об этом спустя много много лет час отладки, так как со мной рядом не было моего компилятора, который бы меня выручил в трудную минуту. Через некоторое время, помимо C# я начал писать много кода на JavaScript и в настоящее время могу делать это без особых трудностей, меня больше не смущает неявное приведение типов и динамическая типизация.

В данной статье я бы хотел систематизировать свои базовые знания об этих языках и рассмотреть их сходства и различия. Данная статья может служить руководством для C# разработчиков, которые хотят изучить JavaScript и наоборот. Также хочу заметить, что в данной статье описываются возможности клиентского JS, так как опыта разработки на Node.js у меня нет. Итак, если вы все ещё не потеряли интерес — приступим.

Namespace и js-модули

В каждой программе для избежания конфликтов в именах переменных, функций, классов или других объектов мы объединяем их в некоторые области. Таким образом, если две разные области будут содержать элементы с одинаковыми именами, конфликта не произойдет.

В C# для разбиения программы на части используются пространства имен. Для их объявления используется ключевое слово namespace . Например, если мы хотим создать набор компонентов пользовательского интерфейса, то логично поместить их все в одно пространство имен, например, Components . При этом принято чтобы пространство имен имело следующее именование [AssemblyName].[DirectoryName].[DirectoryName].[. ] . В каждом файле класс компонента пользовательского интерфейса необходимо поместить внутрь пространства имен:

Содержимое файла ComboBox.cs :

namespace AssemblyName.Components < public class ComboBox < // . >>

Для того, чтобы начать использовать компоненты необходимо импортировать их из пространства имён следующим образом using AssemblyName.Components . При данном способе подключения одной строкой мы импортируем все объекты в текущий файл.

В JS для этих же целей применяются ES-модули. При их использовании мы в какой-то степени эмулируем поведение пространств имен написанием дополнительного кода. Рассмотрим тот же пример с библиотекой компонентов. Допустим у нас есть папка Components , которая содержит компоненты пользовательского интерфейса ComboBox.js , Checkbox.js , Button.js и тд. Для того чтобы получить схожее поведение по сравнению с пространством имен в папке Components необходимо создать файл index.js , который будет содержать следующий код:

export < default as Dialog >from './ComboBox'; export < default as Button >from './Button'; export < default as Checkbox >from './Checkbox'; // . 

Для того, чтобы использовать данные компоненты необходимо импортировать их в текущий файл. Это можно сделать следующим образом: import * as Components from ‘./../Components’ , после ключевого слова from нам необходимо указать путь к папке, в которой находятся все описанные компоненты.

Способы объявления переменных

Ключевое слово var

Как известно C# является строго типизированным языком программирования, поэтому при объявлении переменной компилятору должен быть известен её тип, для этого обычно он указывается перед её именем.

double pi = 3.14; User user = new User(); int[] a = new[] < 0, 1, 2 >;

Но мы также можем сказать компилятору, что он должен вывести тип самостоятельно из выражения, стоящего после знака присваивания. Это стало возможно благодаря введению в версии C# 3.0 ключевого слова var .

// i - int var i = 5; // a - int[] var a = new[] < 0, 1, 2 >;

С помощью var мы можем создавать объекты анонимного типа:

// anon - Анонимный тип только для чтения var anon = new < Name = "Terry", Age = 34 >; var type = anon.GetType();//"<>f__AnonymousType0`2"

В JavaScript для объявления переменных также можно использовать ключевое слово var , однако, в отличии от C# областью видимости данных переменных будет вся функция или объект window , если переменная была объявлена вне функции.

var a = 5 // область видимости - window function go() < var a = 6 // область видимости - функция go // . >

Хоть у вас и есть возможность объявлять переменные с помощью var в JavaScript, но сейчас этого делать не рекомендуется, после выхода стандарта ES6 было добавлено ключевое слово let , которое также позволяет объявлять переменные, но его преимуществом заключается в том, что их областью видимости будет являться блок, в котором они объявлены, а не вся функция.

Константы

Как в C#, так и в JavaScript для объявления константного поля используется ключевое слово const . Правда стоит отметить, что понятие константы в данном случае является различным для данных языков.

В C# константой называется выражение, которое может быть полностью вычислено на этапе компиляции, т.е. константы могут быть числами, логическими значениями, строками или нулевыми ссылками..

const int c1 = 5; const int c2 = c1 + 100; const string c3 = "Константа"; const bool c4 = true; const User human = null; const User human = new User(firstName); //недопустимо, ошибка компиляции

В JavaScript значение константы также нельзя изменять, однако нет ограничений, накладываемых на значение как в языке C#, ей можно присваивать любые значения/объекты/массивы. Однако, если в константу присвоен объект, то от изменения защищена сама константа, но не свойства внутри неё:

const c1 = 5; const c2 = c1 + 100; const c3 = "Константа"; const c4 = true; const user = < name: "Петя" >; user.name = "Петя"; // допустимо user = 5; // нельзя, будет ошибка

Ключевое слово void

Во время написания данной статьи, я экспериментировал в консоли с функциями и по првычке начал описывать функцию как в C# void SomeFunction. , и для меня было большой неожиданностью, когда я узнал, что в JavaScript есть ключевое слово void . Как оказалось void в JavaScript является унарным оператором, который вычисляет значение операнда, затем отбрасывает его и возвращает undefined .

alert("Привет!"); // "Привет!" alert(void "Привет!"); // undefined

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

В C# void не является оператором, однако по сути имеет схожее значение. Здесь он обозначает отсутствие возвращаемого значения функции:

public void SampleMethod() < // . >

Однако, как можно заметить в примере выше, void стоит в том месте, где обычно указывается тип возвращаемого значения, и это не случайно, ведь в C# void также является типом.

var t = typeof(void); t.Name // System.Void

void в качестве типа может использоваться только в небезопасном контексте при работе с указателями.

 unsafe < void* identifier; //позволяется, но не рекомендуется >

Ключевое слово new

В JavaScript ключевое слово new является оператором, и используется привычным для многих C-подобных языков образом — для создания объекта.

function Animal() < //. >const animal = new Animal();

В C# new может использоваться для следующих целей:

  • для создания объектов;
  • для скрытия наследуемого члена базового класса;
  • чтобы ограничить типы, которые могут использоваться в качестве аргументов для параметра типа в универсальном классе.

Первый случай аналогичен применению new в JavaScript.

class Animal < //. >var animal = new Animal();

Основные типы данных

В каждом языке имеются типы данных — примитивы, на основе которых строятся другие типы данных, давайте рассмотрим типы данных предоставляемые нам в C# и JavaScript.

Примитивные типы С#:

  • Целочисленный со знаком: sbyte , short , int , long
  • Целочисленный без знака: byte , ushort , uint , ulong
  • Символы Unicode: char
  • Набор символов Unicode: char
  • Числа с плавающей запятой: float , double
  • Десятичный с повышенной точностью: decimal
  • Логическое значение: bool

Базовый классом является Object .

Примитивные типы данных:

  • Число number
  • Строка string
  • Логический тип boolean
  • Специальное значение null
  • Специальное значение undefined
  • symbol

Базовым типом является Object .

После изучения примитивов обоих языков можно придти к следующим выводам:

  • Вместо достаточно большого набора числовых типов в JavaScript имеется единственный тип number ;
  • В JavaScript отсутствует тип char , вместо него стоит использовать тип string ;
  • В обоих языках базовым типом является Object ;
  • Отличительной особенностью JS является то, что null и undefined выделены в отдельные типы, в то время как в C# null — это ключевое слово обозначающее отсутствие значения.
  • В JS присутствует тип symbol , который используется в основном внутри самого стандарта JavaScript, для того чтобы иметь возможность добавлять новый функционал без конфликта с существующей кодовой базой.

Как правило, сейчас все больше приложений, в которых необходимо выполнять обработку данных на клиенте, для чего требуется большая точность в вычислениях. В настоящее время в JavaScript отсутствует встроенная возможность работы с большими числами, однако в недалеком будущем планируется добавить новый тип BigInt . Для решения аналогичных задач в C# имеется класс System.Numerics.BigInteger .

Проверка типа объекта

Проверка типа является достаточной типичной операцией для большинства языков программирования. Основываясь на типе, мы можем выполнять различные действия. Например, рассмотрим пример из жизни: вы слышите звонок в дверь, если к вам пришел пьяный сосед (объект с типом Пьяный Сосед) чтобы занять денег, то вы вряд ли откроете ему дверь, но если за дверью ваш лучший друг (объект с типом лучший друг), то вы не задумываясь впустите его в квартиру. C# и JavaScript также предоставляют средства для проверки типа объектов.

Оператор typeof

Для получения информации о типе как в C#, так и в JavaScript имеется оператор typeof . Давайте рассмотрим принцип его работы в обоих языках:

В С# оператор typeof применяется к типу и возвращает объект класса Type , который содержит всю информацию о типе.

namespace Zoo < public class Animal <>> Type t = typeof(Animal); t.Name // 'Animal' t.FullName // 'Zoo.Animall' t.GetMethods // Информация о методах t.GetFields // Информация обо всех полях // . 

В JS typeof возвращает строку, указывающую тип операнда.

typeof 30 // 'number' typeof Symbol() // 'symbol' typeof undefined // 'undefined' // Объекты typeof new Animal() // object typeof null // 'object' typeof [1,2,3] // 'object' // Функции typeof function() <> // 'function'; typeof class C <> // 'function';

В примере выше можно заметить некоторые особенности работы данного оператора. Кажется логичным, если выражение typeof new Animal() возвращало бы строку ‘Animal’ , a typeof [1,2,3] — строку Array , однако как бы ни было парадоксально, результатом в обоих случаях является ‘object’ . Также в связи с тем, что классы в JS являются оберткой над функциями, то выражение typeof class C <> вернет ‘function’ вместо ‘class’ . Ещё одним интересным фактом является то, что выражение typeof null вернёт ‘object’ . В JavaScript данный оператор имеет большой недостаток: все не примитивные объекты для него на одно лицо, все они имеют один тип object .

Стоит заметить, что в JavaScript typeof можно применять к чему угодно: объектам, функциям, классам и т.д… В C# данный оператор применяется лишь к типам.

is и instanceof

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

В C# для данных целей имеется оператора is .

class Person < >//Наследуем Programmer от Person class Programmer : Person < >var person = new Person(); var programmer = new Programmer(); person is Person //true person is Programmer //false programmer is Person //true programmer is Programmer //true

В JavaScript для того, чтобы выяснить к какому типу принадлежит объект необходимо использовать оператор — instanceof .

function Person() <> function Programmer() <> //Наследуем Programmer от Person Programmer.prototype = Object.create(Person.prototype); var person = new Person(); var programmer = new Programmer(); console.log(person instanceof Person); // true console.log(person instanceof Programmer); // false console.log(programmer instanceof Person); // true console.log(programmer instanceof Programmer); // true

Логические значения и проверка на null

Практически повсеместно, для того чтобы не получить Null reference exception , перед использованием переменной мы проверяем её на null , а в случае с JavaScript, ещё и на undefined .

В C# мы постоянно видим подобный код:

if(user != null && String.IsNullOrEmpty(user.name))

В JavaScript данную конструкцию можно записать несколько короче. Связано это с тем, что в отличии от C#, в JavaScript множество значений кроме false при приведении типов также расцениваются как false :

  1. null
  2. undefined
  3. «» (пустая строка)
  4. 0
  5. NaN (not a number)

Таким образом, приведенный выше код на C# можно записать следующим образом:

if (user && !user.name)
user && !user.name && user.setName("Петя");

В связи с тем, что проверки на null происходят повсеместно, в C# 6.0 был добавлен Null Propagation Operator .? .

if (user != null && user.parent != null && user.parent.parent != null)

С его помощью данный участок кода можно переписать следующим образом:

user?.parent?.parent?.SetName("Петя");

В JavaScript обычно делают следующим образом:

user && user.parent && user.parent.parent && user.parent.parent.setName("Петя");

Установка значений по-умолчанию

Ещё одной частой операцией является установка значений по-умолчанию, с версии 2.0 в C# появился Null Coalescing Operator — ?? .

Следующие две строки кода на C# являются эквивалентными:

var name = user != null && user.name != null ? user.name : "Петя"; var name = user?.name ?? "Петя";

В JavaScript подобную операцию обычно делают следующим образом.

var name = user && user.name || "Петя";

Однако мы можем применять операторы && и || только в том случае, если 0 , false и пустая строка не являются допустимыми значениями.

В обозримом будущем операторы ?. , ?? должны появиться и в JavaScript (в настоящее время они прошли стадию Stage0), подробнее об этих операторах в JavaScript можно прочитать в статье.

Ключевое слово this

Как в C#, так и в JavaScript имеется ключевое слово this . Обычно в C# понимание предназначения this не вызывает никакого труда, однако в JavaScript это является одной из самых сложных концепций языка. Далее рассмотрим применение this на примерах.

В C# ключевое слово this указывает на текущий экземпляр класса.

class User < public string Name < get; set; >public void PrintEmployee() < Console.WriteLine(this.name); >> var employee = new Employee(); E1.PrintEmployee();

В данном примере в выражении Console.WriteLine(this.name) , this указывает на переменную employee .

Так как this — текущий экземпляр класса, то его нельзя использовать в методах не привязанных к определенному типу, например в статических методах.

В JavaScript значение this называется контекстом вызова и будет определено в момент вызова функции. Если одну и ту же функцию запускать в контексте разных объектов, она будет получать разный this :

var user = < firstName: "Петя" >; var admin = < firstName: "Админ" >; function func() < alert( this.firstName ); >user.f = func; admin.g = func; // this равен объекту перед точкой: user.f(); // Петя admin.g(); // Админ func();// undefined - в данном случае this - глобальный объект window

К тому же, в JavaScript присутствует возможность явного указания значения this с помощью функций: call , bind , apply . Например, вышеприведенный пример можно переписать следующим образом:

var user = < firstName: "Петя" >; var admin = < firstName: "Админ" >; function func() < alert( this.firstName ); >// this равен объекту перед точкой: func.call(user); // Петя func.call(admin); // Админ func.bind(user)();// Петя func.bind(admin)();// Админ

Деструктуризация

Часто бывает необходимо присвоить несколько полей объекта локальным переменным. Например, как часто вы наблюдаете подобный код?

void Method(User user) < var firstName = user.FirstName; var lastName = user.LastName; //. >

Для подобных целей можно использовать деструктуризацию. Данную возможность в разной степени поддерживают оба языка.

В C# 7.0 для поддержки деструктуризации появился новый вид функций, называемый деконструкторами. Для того чтобы объявить деконструктор нам необходимо определить метод с именем Deconstruct , все параметры которого должны быть объявлены с модификатором out :

class Person < public string FirstName < get; set; >public string LastName < get; set; >// Объявление деконструктора public void Deconstruct(out string firstName, out string lastName) < firstName = this.FirstName; lastName = this.LastName; >> . Person person = new Person < FirstName = "Петя", LastName = "Петров" >; (string firstName, string lastName) = person; (string firstName, _ ) = person;

Поддержка деструктуризации или (destructuring assignment) в JavaScript появилась в шестом стандарте EcmaScript. С её помощь. можно присвоить массив или объект сразу нескольким переменным, разбив его на части.

let [firstName, lastName] = ["Петя", "Петров"]; let [firstName, _ ] = ["Петя", "Петров"]; let < firstName, lastName >= < firstName: "Петя", lastName: "Петров" >; let < firstName >= < firstName: "Петя", lastName: "Петров" >;

Стоит отметить, что деструктуризация в JavaScript имеет больше возможностей, чем в C#:

  • Изменение порядка переменных;
  • Отсутствие необходимости явного объявления деконструкторов;
  • Поддержка деструктуризации массивов;
  • Установки значений по-умолчанию;
  • Присваивание свойств объекта в переменную с другим именем;
  • Поддержка вложенной деструктуризации.

Заключение

В данной статье мы обсудили лишь самые основные концепции языков C# и JavaScript. Но остались не затронуты ещё многие аспекты:

Каждая из этих тем является достаточно обширной и будет раскрыта в дальнейшем в отдельной статье.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *