Изучение языка программирования имеет только два аспекта: один - синтаксис, а другой - тип данных. Синтаксис C-подобных языков-это не что иное, как если, в то время как, для функций, арифметических операций и т. Д., А объектно-ориентированные языки добавляются в объект.
Синтаксис - это всего лишь набор правил, которые дизайнеры языка сделали заранее. Грамматика разных языков отличается, но все они имеют несколько общих моментов. Для тех, кто знаком с одним или двумя языками программирования, грамматика часто не является проблемой при изучении других языков программирования (конечно, если вы изучали C-подобные языки, то определенно потребуется некоторое время, чтобы вовлечь в LISP в первый раз). Основное внимание к обучению часто уделяется типам данных и связанных с ним операциям, и нет старой поговорки: «Структура данных + Algorithm = Program»! Во -вторых, синтаксис некоторых языков само по себе имеет проблемы с дизайном (JavaScript еще больше), поэтому нам не нужно копаться в эти точки. Конечно, если вы претендуете на то, чтобы быть гик, вы можете сыграть с ним.
Эта статья даст подробное введение в типы данных в JavaScript.
Слабый тип против сильного типа
Учитывая философию дизайна JavaScript, JavaScript разработан как слабый язык.
Говоря об этом, неизбежно говорить о разнице между слабыми типами и сильными типами.
Некоторые люди по ошибке думают, что разница между ними заключается в том, что «сильно напечатанный язык должен указывать его тип при объявлении переменной, в то время как слабо набранный человек не использует его». На самом деле, эта точка зрения неверна. Например, следующий фрагмент кода Java:
Кода -копия выглядит следующим образом:
String s = "hello";
int l = s.getbytes (). длина;
Как компилятор узнает, что .LUNGHT является юридическим выражением? Это потому, что компилятор знает, что тип данных S является строкой. Когда вызывается метод getbytes string, тип данных возвращаемого значения составляет байт [], поэтому .length является юридическим выражением.
Реальная разница между ними состоит в том, чтобы:
В сильно напечатанных языках тип каждого выражения может быть определена во время компиляции, и разрешены только операции, которые применимы к этому типу;
Языки слабых типов позволяют навязывать любую операцию на любой тип, но эта операция может сообщить об ошибке во время выполнения.
Тип данных
Согласно спецификации ECMASCRIPT 5.1, в JavaScript есть шесть типов данных, а именно: неопределенные, нулевые, логические, число, строка и объект. Первые пять принадлежат основным типам, а последнее принадлежит типам объектов.
Основные типы данных
Неопределенный тип имеет только одно значение, которое не определен, что означает «нулевое значение», которое применимо ко всем типам данных.
NULL -тип имеет только одно значение, которое является нулевым, что означает «нет объекта» и применяется только к типам объектов.
Логический тип имеет два значения, верно и неверно
Значения номера типа-это наборы 64-битных чисел с плавающей запятой, которые следуют стандарту IEEE 754, аналогично двойной Java. Там нет целочисленной структуры данных. Кроме того, есть три специальных ценностях: NAN, Infinity, -infinity
Значение строки типа - это коллекция конечных символов Unicode. Должен быть заключен с 'или'.
нулевой и неопределенный
Как нулевые, так и неопределенные представляют концепцию «не значения», если она строго отличается:
- NULL означает пустые
- неопределенные означает, что его не существует. Это значение представляет собой все переменные без инициализации, отсутствующие параметры в функции и нет явного возвращаемого значения.
На других языках только один нуль используется для представления нулевых значений. Почему в JavaScript есть неопределенное? Это вызвано историческими причинами:
JavaScript принимает синтаксис Java, разделяет типы на основные типы и типы объектов. В Java NULL используется для представления пустых объектов, а JavaScript наследует их как должное; На языке C NULL составляет 0 при преобразовании в число, а JavaScript также принимает тот же метод:
Кода -копия выглядит следующим образом:
> Число (null)
0
> 5 + null
5
В JavaScript 1.0 еще нет обработки исключений. Для некоторых исключений (без инициализированных переменных, отсутствующих параметров при вызовах функций и т. Д.) Они должны быть помечены как специальное значение. NULL - хороший выбор, но Брендан Эйх хочет избежать следующих двух вещей:
- Это специальное значение не должно иметь эталонного атрибута, потому что оно конкретное объект
- Это специальное значение не должно быть преобразовано в 0, потому что в программе нелегко обнаружить ошибки
По этим двум причинам Брендан Эйх выбрал неопределенного, который может быть вынужден к NAN.
Кода -копия выглядит следующим образом:
> Число (неопределенное)
Нэн
> 5 + неопределенная
Нэн
Результаты очень разные при работе с объектами JSON:
Кода -копия выглядит следующим образом:
> Json.parse (null)
нулевой
> Json.parse (неопределенная)
// FIRFOX SYNTAXERROR: JSON.Parse: Неожиданный символ в строке 1 Столбец 1 данных JSON
// Chrome SyntaxError: неожиданный токен U
> Json.stringify (null)
"нулевой"
> Json.stringify (неопределенная)
неопределенный
Тип объекта
В качестве языка сценариев сам javaScript имеет очень оптимизированные функции, и многие функции (чтение и написание файлов, сеть и т. Д.) Предоставляется средой хоста. Мост между средой хоста и языком JavaScript является объектами. Среда хоста предоставляет множество функций, предоставляя серию объектов, которые соответствуют синтаксису JavaScript.
В этой статье в JavaScript, ориентированном на объектно-ориентированное программирование (если вы не знаете, что такое прототип, я настоятельно рекомендую прочитать эту статью), я неоднократно подчеркивал, что объекты представляют собой серию пар ключевых значений в JavaScript, как Hashmap в Java. Тем не менее, свойства объектов в JavaScript могут иметь некоторые дескрипторы (дескрипторы свойств), которые недоступны в HashMap.
Дескриптор атрибута
Дескрипторы атрибутов разделены на две категории:
Дескриптор данных (дескриптор данных) содержит серию логических значений, чтобы указать, позволяет ли атрибут модификацию и удаление.
Дескриптор доклада, включая функции GET и SET.
Оба дескриптора являются объектами, и они оба имеют следующие два логических свойства:
Настраивается, чтобы указать, позволяет ли дескриптор модификация и удаление. По умолчанию ложь.
Перечисление используется, чтобы указать, чтобы получить доступ к свойству, когда оно пересекает объект (используя метод для ... в цикле или метод Object.keys). По умолчанию ложь.
В дополнение к двум распространенным атрибутам, дескриптор данных имеет следующие два атрибута:
- значение используется для указания значения этого свойства, по умолчанию не определена
- Запись используется, чтобы указать, позволяет ли значение свойства изменять значение свойства. По умолчанию ложное
Есть два свойства для дескрипторов доступа:
- GET используется для указания доступа (Getter, по сути функции) при доступе к свойству, и возвращаемое значение доклада является значением свойства. По умолчанию не определен
- SET используется для указания оценщика (Setter, по сути, функции) при доступе к этому свойству. Оценщик принимает параметр. По умолчанию не определен
Мы можем использовать Object.DefineProperty для установки дескриптора свойства объекта. Например:
Кода -копия выглядит следующим образом:
// Использование __proto__
Object.defineproperty (obj, 'key', {
__proto__: null, // нет наследственных свойств
значение: 'static' // не перечисляется
// не настраивается
// не записывается
// как по умолчанию
});
Из приведенного выше примера мы видим, что дескрипторы имеют характеристики наследования. Мы явно устанавливаем __proto__ объекта дескриптора NULL, что позволяет избежать наследства соответствующих атрибутов от Object.prototype. Конечно, мы также можем явно установить все свойства дескриптора:
Кода -копия выглядит следующим образом:
// быть явным
Object.defineproperty (obj, 'key', {
перечисляется: ложь,
настраивается: ложь,
Записывается: ложь,
Значение: «Статический»
});
Этот эффект такой же, как первый кусок кода.
Вот еще один пример дескриптора доступа:
Кода -копия выглядит следующим образом:
// Пример свойства объекта, добавленного с DefineProperty с дескриптором свойства доклада
var bvalue = 38;
Object.defineproperty (obj, 'key', {
get: function () {return bvalue; },
set: function (newValue) {bvalue = newValue; },
перечисляется: правда,
настраивается: true
});
Следует отметить, что дескрипторы доступа и дескрипторы данных не могут быть запутаны. Неправильно писать следующее:
Кода -копия выглядит следующим образом:
// Вы не можете попытаться смешать оба:
Object.DefineProperty (obj, «конфликт», {
Значение: 0x9f91102,
get: function () {return 0xdeadbeef; }
});
// бросает TypeError: дескрипторы свойств не должны указывать значение
// или быть подлежит написанию, когда был указан геттер или сеттер
тип
Если вы хотите узнать тип переменной во время выполнения, вы можете использовать оператор TypeOF. Возвратное значение TypeOF заключается в следующем:
Одна вещь, которую нужно отметить, - это тип null == "объект". Согласно стандарту Ecmascript 5.1, нулевой тип должен быть основным типом. Почему объект возвращается здесь? Причина в следующем:
В JavaScript 1.0 значение в JavaScript представлено структурой, такой как тег типа и фактическое значение. Флаг типа объекта равен 0, а NULL представляет нулевой указатель (0x00) на языке C, поэтому тип флага NULL составляет 0.
Вышеуказанное - все содержание этой статьи. Пожалуйста, обратитесь к нему, если вам это нужно.