Для типов JavaScript его можно просто суммировать как: по сравнению с сильно напечатанными языками, это слабый (свободный) язык типа; Существуют основные типы и эталонные типы, и они имеют разницу в том, что в памяти стека существует фиксированное пространство, а указатель на местоположение реализации хранится в памяти стека без фиксированного пространства, и указатель на местоположение реализации сохраняется в памяти стека.
Во многих книгах на рынке есть много места, о которых можно поговорить. В этой статье рассказывается о нескольких аспектах, которые могут потребовать от вас простого понимания JavaScript, особенно типов JavaScript. Если вы еще этого не понимаете, вы можете забрать книгу о JavaScript и прочитать ее снова.
1. Основные типы и ссылки
1. Основной тип: неопределенная/нулевая/логическая/номера/строка
2. Тип ссылки: Object/Array/Function/date/regexp/error/map/set…
Почему ссылочные типы не перечислены? Поскольку вы только так много знаете об этом, по крайней мере, в статье, о которой я говорил, достаточно. Другие могут использоваться редко, и даже такие, как карта и набор, не поддерживаются всеми браузерами.
2. Суждение типа JavaScript
В JavaScript есть два оператора, которые можно использовать для определения типов. Они типа и экземпляр, но круг очень маленький, и они не так хороши в этом, и они общеизвестно ненадежны. Несколько ситуаций также верны, но во многих случаях они ненадежны. Просто посмотрите на это, и вы узнаете:
Кода -копия выглядит следующим образом:
// Когда это надежно:
typeof 'sofish' // string
new String ('sofish') exanceof String // true
// Когда это ненадежно:
typeof [] // объект
TypeOf NULL // объект
'Sofish' экземпляр строки // false
Многие программисты для начинающих JavaScript могут поклясться. У большинства людей уже есть библиотеки, такие как jQuery, когда им нужно использовать JS. Они все инкапсулировали, чтобы вы могли легко обнаружить типы. Конечно, на самом деле, не трудно обнаружить, потому что предложение «в JavaScript, все является объектом», конечно, как упоминалось во многих документах, неопределенная на самом деле является просто глобальным атрибутом с NAN и Infinity. Вы, наверное, знаете. Но «объект» может помочь нам:
Кода -копия выглядит следующим образом:
/* Обнаружение типа объекта
* @param: obj {javascript объект}
* @param: type {string} js -тип Имя, начиная с заглавного покрытия
* @return: {boolean}
*/
Функция (OBJ, тип) {
return object.prototype.tostring.call (obj) .slice (8, -1) === Тип;
}
Таким образом, мы можем использовать функцию IS, чтобы помочь нам решить суждение типа, и эта простая функция имеет хорошую совместимость и может использоваться в вашем проекте. Ситуация похожа на:
Кода -копия выглядит следующим образом:
is ('sofish', 'string') // true
IS (null, 'null') // true
is (new set (), 'set') // true
3. Преобразование типа JavaScript
В JavaScript тип переменной (свойства) может быть изменен. Самое распространенное, что вы видите, - это преобразование между строкой и номером. Как превратить 1 + '2' в 12? Здесь необходимо понять оператор +, который является математическим оператором, а также строковым дефисом в JavaScript. Поэтому новички часто увидят интересное явление. При использовании знака + иногда расчет - это не то, что они хотят, но использование знака - всегда может получить «правильный» ответ.
Кода -копия выглядит следующим образом:
1 + '2' // '12'
1 + ( + '2') // 3
1 - '2' // -1
Это фактически вызвано двойной ролью +. В приведенном выше коде вы можете заметить, что второе выражение использует знак + знак перед строкой, заставляя его класс преобразовать в число. Что касается понимания конверсии типа JavaScript, в большинстве случаев этого достаточно, чтобы понять + играет двойную роль. Другие понятные классы, аналогичные можно изменить с помощью назначения/перегрузки и даже включать ошибку:
Кода -копия выглядит следующим образом:
var err = new error ();
console.log (Err Encasoned Of Erry); // истинный
err = 'sofish';
console.log (err); // 'sofish'
4. типы справочных данных JavaScript
Это сложный момент в этой статье. По сравнению с основными типами, ссылки могут добавлять в них свойства и методы; Ссылки представляют собой аналогичные значения, которые являются ссылкой, присваивая значение типа ссылки переменной, и они указывают на одно и то же значение, хранящееся в памяти кучи. Переменные (свойства) могут быть перегружены, но копирование будет очень интересной вещью, мы поговорим об этом подробно позже.
1. Добавьте свойства и методы
В следующем коде мы увидим, что при условии, что мы не будем сообщать об ошибке базовому аналогичному назначению, но при выборе: оно будет недействительным:
Кода -копия выглядит следующим образом:
var arr = [1,2,3];
arr.hello = 'world';
console.log (arr.hello); // 'мир'
var str = 'sofish';
str.hello = 'world';
console.log (str.hello); // неопределенный
2. Операция ссылки на значения типа
Поскольку тип ссылки хранится в памяти стека является ссылкой, когда мы указываем на одно и то же исходное значение, операция на значении будет влиять на все ссылки; Примером здесь является переназначение (не прямая операция по значению) воссоздает объект и не изменит исходное значение. например:
Кода -копия выглядит следующим образом:
var arr = [1,2,3], sofish = arr;
sofish.push («Привет, мир»);
console.log (arr); // [1, 2, 3, «Привет, мир»]
// не симпатичный тип
sofish = [не рыба ']; // Когда Sofish изменится аналогично, исходное значение не будет изменено
console.log (arr); // [1, 2, 3, 'Привет, мир']
3. Копирование значений эталонного типа
Операции по исходному значению повлияют на все ссылки, что не обязательно является тем, что мы хотим. Иногда нам нужно скопировать совершенно новый объект, не влияя на другие ссылки при работе. В целом, существует несколько конкретных операций, таких как дата / функция / regexp ..., в основном потому, что массив и объект имеют дополнительные элементы, атрибуты и т. Д. Так что нам нужно понять, как копировать массив и объекты объектов.
3.1 Копирование массивов
В объекте массива существует метод срезов для возврата перехваченного массива, а также в фильтре ES5 и т. Д. Также возвращает новый массив, поэтому мы можем использовать этот метод для копирования.
Кода -копия выглядит следующим образом:
var arr = [1, 2, 3];
var sofish = arr.slice ();
// Работа на новых массивах не повлияет на исходный массив
sofish.push («Привет, мир»);
console.log (arr); // [1, 2, 3]
3.2 Копирование объектов
В копировании массива мы используем метод среза. Фактически, для массива и объекта мы можем использовать для ... в цикле для прохождения и назначения значений для копирования.
Кода -копия выглядит следующим образом:
var obj = {name: 'sofish'}, sofish = {}, p;
для (p в obj) sofish [p] = obj [p];
// Работа по новым объектам не повлияет на исходное значение
sofish.say = function () {};
console.log (obj); // {name: 'sofish'}
3.3 Shadow/Deep Copy
Как приведенная выше операция, это то, что мы часто называем теневой копией. Однако как массив, так и объект могут иметь несколько слоев (размерность). Копия, как это, учитывает значение верхнего уровня. Массив и объект в возможных значениях по -прежнему указывают на исходный объект. например:
Кода -копия выглядит следующим образом:
var arr = [1, {bio: 'не рыба'}], sofish = [], p;
для (p in arr) {
sofish [p] = arr [p];
}
// Операции на объектах `cat`, содержащийся в« sofish », влияет на исходное значение
sofish [1] .bio = 'chackable';
console.log (arr); // [1, cat: {bio: 'chackable'}]
Так как это сделать? Давайте используем функцию copy () для решения этой проблемы:
Кода -копия выглядит следующим образом:
/* Скопировать объект
* @param: obj {javascript object} исходный объект
* @param: isdeep {boolean} - глубокая копия
* @return: {javascript object} вернуть новый объект
*/
Функция копирования (obj, iSdeep) {
var ret = obj.slice? []: {}, p, prop;
// Использование с функцией IS
if (! Isdeep && is (obj, 'array')) return obj.slice ();
для (p in obj) {
if (! obj.hashownproperty (p)) продолжится;
prop = obj [p];
ret [p] = (is (prop, 'object') || is (prop, 'массив'))?
копия (Prop, iSdeep): prop;
}
возврат возврата;
}
Таким образом, мы можем скопировать массив или объект через функцию Copy (OBJ, ISDEEP). Вы можете проверить это:
Кода -копия выглядит следующим образом:
var arr = [1, {bio: 'не рыба'}];
var sofish = copy (arr);
// Небольшая копия не влияет на исходное значение для работы первого уровня, но влияет на второй слой
sofish.push ('cat');
console.log (arr); // [1, {bio: 'не рыба'}]
sofish [1] .bio = 'hello world';
console.log (arr) // [1, {bio: 'Hello World'}]
// глубокая копия не повлияет на исходное значение
sofish = copy (arr, 1);
sofish [1] .bio = 'foo или bar';
console.log (arr); // [1, {bio: 'Hello World'}]
Вот и все. Вы должны в основном понимать более сложные точки о типах. Конечно, репликация - самый хлопотный момент. В дополнение к массиву и объекту, который часто требует работы, также существует репликация даты/функции/regexp.