Приветственная звезда:GitHub.com/толстый ГЭ/жирный ГЭ…
Основные типы данных JS:Number,String,Boolean,Symbol,Null,Undefined, шесть типов данных. ссылочный типobject.
базовый тип данных
Number
Numeric, в соответствии со стандартом ECMAScript, в JavaScript существует только один числовой тип: значение в 64-битном двоичном формате двойной точности на основе стандарта IEEE 754 (от -(263-1) до 263-1).Он не дает конкретный тип целого числа.
В дополнение к возможности представлять числа с плавающей запятой, есть также некоторые значения со знаком:+Infinity,-Infinityа такжеNaN(Не число).
вести перепискуlodashФункции обнаружения в
-
isNumberэкзаменvalueЭто оригинальноNumberчисловой или объектный; -
isIntegerэкзаменvalueцелое число; -
isNaNобнаружитьvalueЭтоNaN; -
isFiniteобнаружитьvalueЯвляется ли это примитивным конечным значением.
isNumber
function isNumber(value) {
return typeof value == 'number' ||
(isObjectLike(value) && getTag(value) == '[object Number]')
}
typeofОператор может вернуть строку, представляющую тип неоцененного операнда. Для Number, String, Boolean, Undefined, String можно однозначно получить его тип.
Такlodashзачем добавлять(isObjectLike(value) && getTag(value) == '[object Number]')?
Причина в том, что JS также позволяет нам создавать значение в следующей форме
const value = new Number(1)
console.log(value) // log 1
console.log(typeof value) // log "object"
В это время только просто используйтеtypeofоператор не может судитьvalueЯвляется ли тип числовым. Итак, нам нужно объединить следующие две функции, чтобы судить,valueЭтоobjectзатем пройти черезtoString()чтобы получить тип каждого объекта.
function getTag(value) {
if (value == null) {
return value === undefined ? '[object Undefined]' : '[object Null]'
}
return Object.prototype.toString.call(value)
}
function isObjectLike(value) {
return typeof value == 'object' && value !== null
}
Object.prototype.toString.callКаждый объект имеетtoString()метод, вызываемый автоматически, когда объект представлен как буквальное значение или когда на объект ссылаются ожидаемым строковым способом.
isInteger
function isInteger(value) {
return
typeof value == 'number'
&& value == toInteger(value);
}
экзаменvalueЯвляется ли это целым числом, судите, является лиvalueЯвляется ли тип числовым и совпадает с Int. Процесс округления выглядит следующим образом
function toInteger(value) {
var result = toFinite(value),
remainder = result % 1;
return result === result ?
(remainder ? result - remainder : result) : 0;
}
isNaN
экзаменvalueтак или иначеNaN.
function isNaN(value) {
return isNumber(value) && value != +value;
}
с ЕС 2015isNaNРазница в том, что дляundefined,{}, исходный результатtrue,а такжеlodashдляfalse. Это потому, что еслиisNaNАргументы функции неNumberТипы,isNaNФункция сначала попытается преобразовать этот параметр в число, а затем проверит, соответствует ли преобразованный результатNaNвынести приговор.
// js native isNaN
var isNaN = function(value) {
var n = Number(value);
return n !== n;
};
Но будь то ES 2015 илиlodash, они в основном используютx != xсудитьNaN.
isFinite
экзаменvalueЯвляется ли это примитивным конечным значением.
function isFinite(value) {
return typeof value == 'number'
&& nativeIsFinite(value);
}
использовать роднойisFiniteкомбинироватьtypeofОпределяет, является ли число конечным.
String
Тип String используется для представления последовательности символов, состоящей из нуля или более 16-битных символов Unicode, то есть строки. Полезно для сохранения данных, которые могут быть представлены в текстовом виде.
Стоит отметить, что не толькоосновная строка, также обратите внимание, чтостроковый объект, строковые литералы (определяемые одинарными или двойными кавычками) и строки, которые напрямую вызывают методы String (без создания экземпляра строкового объекта с помощью new ) являются базовыми строками.
JavaScript автоматически преобразует базовую строку в строковый объект.Только после того, как базовая строка будет преобразована в строковый объект, можно будет использовать метод строкового объекта.
Аналогично номеру раньше, используя конструкторStringСозданная строка представляет собойobject
const s_prim = "foo";
const s_obj = new String(s_prim);
console.log(typeof s_prim); // Logs "string"
console.log(typeof s_obj); // Logs "object"
Таким образом, чтобы обнаружить строки, обратите внимание на строковые объекты в дополнение к основным строкам.
function isString(value) {
const type = typeof value
return
type == 'string' ||
(type == 'object'
&& value != null
&& !Array.isArray(value)
&& getTag(value) == '[object String]')
}
годный к употреблениюtypeofОбнаружение базовых строк, используя ранее введенную схему для строк шаблона.getTagполучитьvalueтип.
Boolean
Тип Boolean является наиболее часто используемым типом в ECMAScript и имеет только два литерала:trueа такжеfalse. Также необходимо различать базовые логические типы и логические объекты.
function isBoolean(value) {
return
value === true || value === false ||
(isObjectLike(value)
&& getTag(value) == '[object Boolean]')
}
Большая часть этого была рассмотрена ранее, и она появляется здесьisObjectLike, то что он делает.
function isObjectLike(value) {
return typeof value == 'object' && value !== null
}
Оказывается, это только для того, чтобы обнаружить, является ли это не-nullОбъект.
Symbol
ES6 представляет новый примитивный тип данныхSymbol, представляющий уникальное значение. Значение символа черезSymbolгенерация функций.
function isSymbol(value) {
const type = typeof value
return type == 'symbol' ||
(isObjectLike(value) &&
getTag(value) == '[object Symbol]')
}
найду(isObjectLike(value) && getTag(value) == '[object Symbol]'), также обнаруживает объекты Symbol, но если выnew Symbolвыйдет из системыTypeError.
ТакlodashПочему вы хотите его обнаружить, оказывается, создание явного объекта-обертки больше не поддерживается, начиная с ECMAScript 6, и теперь его можно смоделировать с помощью следующего кода, хотя это бесполезно.
const sym = Symbol("foo");
typeof sym; // "symbol"
const symObj = Object(sym);
typeof symObj; // "object"
Undefined
Тип Undefined имеет только одно значение, специальноеundefined. В использованииletилиvarКогда переменная объявлена, но не инициализирована, значение переменнойundefined.
function isUndefined(value) {
return value === undefined;
}
Null
Нулевой тип — это тип данных только с одним значением, это специальное значениеnull. а такжеundefinedРазница в том, что это литерал, аundefinedявляется свойством глобального объекта.
С логической точки зрения нулевое значение представляет нулевой указатель объекта,null— отсутствующий флаг, указывающий, что переменная не указывает ни на какой объект. Вот почему использование оператора typeof для проверки нулевого значения возвращает «object».
Его решение также очень просто, просто нужно
function isNull(value) {
return value === null
}
Конечно, вы также можете использовать
console.log(Object.prototype.toString.call(null))
// [object Null]
Вышеизложенное является суждением об основных типах данных.Подводя итог, в основном следует использоватьtypeOfтак же какObject.prototype.toStringи некоторые свойства со специальными значениями. Приступим к анализу ссылочных типовObject
тип ссылки
Значение (объект) ссылочного типа является экземпляром ссылочного типа. В ECMAScript ссылочный тип — это структура данных, используемая для совместной организации данных и функций. В частности, естьObject,Array,Date,Error,RegExp,Function, представленный ES2015Set,Map,WeakSet,WeakMap.
Object
Объект в ECMAScript на самом деле представляет собой набор данных и функций. У него очень важное применение, все объекты в JavaScript берутся изObject; все объекты изObject.prototypeНаследовать методы и свойства, хотя они могут быть переопределены. То есть в ECMAScript тип Object является основой для всех его экземпляров.
такLodashсудитьvalueЭтоObject, только используяtypeOfПросто сделай это.
function isObject(value) {
const type = typeof value
return value != null &&
(type == 'object' || type == 'function')
}
Function
Конструктор функцийСоздайте новый объект Function. В JavaScript каждая функция на самом деле являетсяFunction对象。
function isFunction(value) {
if (!isObject(value)) {
return false
}
const tag = getTag(value)
return tag == '[object Function]' ||
tag == '[object AsyncFunction]' ||
tag == '[object GeneratorFunction]' ||
tag == '[object Proxy]'
}
Существует проблема,typeOfТип объекта Function, который может быть обнаружен,Function, тогда зачем вамObject.prototype.toStringШерстяная ткань?
// in Safari 9 which returns 'object' for typed arrays and other constructors.
Array
Массив в ECMAScript представляет собой массив, каждый элемент которого может содержать данные любого типа.
Обычное обнаружение для негоArray.isArray,LodashТакже используйте этот API, если вам нужно решение Polyfill, вы можете использовать
// plan 1
Object.prototype.toString.call(value) === '[object Array]'
// plan 2
value.constructor === Array
доvalue instanceof ArrayНе будет ли проблем?
В средах, где существуют разные глобальные переменные, по семантике
instanceofПри проверке массиваvalue instanceof Arrayтолько тогда, когдаvalueпо оригиналу страницыArrayОн работает правильно только тогда, когда массив создается конструктором.Для получения подробной информации см.Web.Peach.Quota / Just Walden / Woohoo…
Date
Тип Date в ECMAScript основан на классе java.util.Date из более ранней версии Java.
const nodeIsDate = nodeTypes && nodeTypes.isDate
const isDate = nodeIsDate
? (value) => nodeIsDate(value)
: (value) => isObjectLike(value) && getTag(value) == '[object Date]'
LodashРазделите на две среды, чтобы решить эту проблему, если это Node, используйтеutil.types.isDate(value)Проверить, если он есть в браузере, то все равно черезObject.prototype.toStringсудить.
Set
ES2015 предоставляет новую структуру данных Set. Он похож на массив, но все значения членов уникальны и нет повторяющихся значений.
const isSet = nodeIsSet
? (value) => nodeIsSet(value)
: (value) => isObjectLike(value) && getTag(value) == '[object Set]'
то же самоеMap
const isMap = nodeIsMap
? (value) => nodeIsMap(value)
: (value) => isObjectLike(value) && getTag(value) == '[object Map]'
WeakSet
Структура WeakSet похожа на Set, это тоже набор уникальных значений. Однако он отличается от Set двумя способами.
function isWeakSet(value) {
return isObjectLike(value) && getTag(value) == '[object WeakSet]'
}
также использоватьObject.prototype.toString, а такжеWeakMap
function isWeakMap(value) {
return isObjectLike(value) && getTag(value) == '[object WeakMap]'
}
Error
Экземпляр Error создается при возникновении ошибки времени выполнения.
function isError(value) {
if (!isObjectLike(value)) {
return false
}
const tag = getTag(value)
return tag == '[object Error]' ||
tag == '[object DOMException]' ||
(typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value))
}
соответствует предыдущемуObject.prototype.toStringЕго по-прежнему можно использовать для определения того, является ли объект ошибкой. Кроме того, если объект соответствует следующим условиям, его также можно рассматривать как ошибку
- имеют
message,nameнедвижимость со стоимостьюstring; - является обычным объектом. То есть объект есть
Objectсоздание конструктора или[[Prototype]]дляnull.
Итак, как обнаружить общие объекты?
function isPlainObject(value) {
if (!isObjectLike(value) || getTag(value) != '[object Object]') {
return false
}
if (Object.getPrototypeOf(value) === null) {
return true
}
let proto = value
while (Object.getPrototypeOf(proto) !== null) {
proto = Object.getPrototypeOf(proto)
}
return Object.getPrototypeOf(value) === proto
}
в основном используютObject.getPrototypeOf()метод возвращает прототип указанного объекта (внутренний[[Prototype]]стоимость имущества) иvalueсебя[[Prototype]]выносить суждения.