Проверьте, является ли значение объектом в JavaScript

Проверка их конструкторов

Проверка свойства их конструктора возвращает функцию с их именами.

console.log(({}).constructor) // returns a function with name "Object" console.log(([]).constructor) // returns a function with name "Array" console.log((null).constructor) //throws an error because null does not actually have a property 

Полный, но не исчерпывающий список правильных способов проверить, принадлежит ли значение типу Object.

 function isObject(o) { return o !== null {amp}amp;{amp}amp; typeof o === 'object' {amp}amp;{amp}amp; Array.isArray(o) === false; } 

Просто удивился, сколько откликов за неправильные ответы 😮 Только 1 ответ прошел мои тесты !!! Здесь я создал свою упрощенную версию:

 function isObject(o) { return o instanceof Object {amp}amp;{amp}amp; o.constructor === Object; } 

Как по мне, это понятно и просто, и просто работает! Вот мои тесты:

 console.log(isObject({})); // Will return: true console.log(isObject([])); // Will return: false console.log(isObject(null)); // Will return: false console.log(isObject(/.*/)); // Will return: false console.log(isObject(function () {})); // Will return: false 

ОДИН БОЛЬШЕ ВРЕМЕНИ: не все ответы проходят этот тест !!! 🙈

  • Конструктор Object

    Конструктор Object приводит переданный аргумент к объекту. Если это уже объект, возвращается тот же объект.

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

    Для следующей функции требуется ECMAScript 3, в котором введено === :

     function isObject(value) { /* Requires ECMAScript 3 or later */ return Object(value) === value; } 

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

  • Конструкторы

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

    Следующая функция требует ECMAScript 3, который позволял конструкторам возвращать не-объекты. До ECMAScript 3, который выдавал ошибку, но операторы try еще не существовали.

     function isObject(value) { /* Requires ECMAScript 3 or later */ return new function() { return value; }() === value; } 

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

  • this значение

    Старые спецификации ECMAScript требовали, чтобы this значение было объектом. ECMAScript 3 представил Function.prototype.call , который позволяет вызывать функцию с произвольным значением this , но принудительно вызывать объект.

    ECMAScript 5 ввел строгий режим, который убрал это поведение, но в небрежном режиме мы все еще можем (но, возможно, не должны) полагаться на него.

     function isObject(value) { /* Requires ECMAScript 3 or later in sloppy mode */ return function() { return this === value; }.call(value); } 
  • [[Опытный образец]]

    Все обычные объекты имеют внутренний слот с именем [[Prototype]], значение которого определяет, от какого другого объекта он наследуется. Значение может быть только объектом или null . Следовательно, вы можете попытаться создать объект, который наследуется от желаемого значения, и проверить, сработало ли оно.

    Для Object.create и Object.getPrototypeOf требуется ECMAScript 5.

     function isObject(value) { /* Requires ECMAScript 5 or later */ try { Object.create(value); return value !== null; } catch(err) { return false; } } 
     function isObject(value) { /* Requires ECMAScript 5 or later */ function Constructor() {} Constructor.prototype = value; return Object.getPrototypeOf(new Constructor()) === value; } 
  • Некоторые новые способы ECMAScript 6

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

     function isObject(value) { /* Requires ECMAScript 6 or later */ try { Object.setPrototypeOf({}, value); return value !== null; } catch(err) { return false; } } 

     function isObject(value) { /* Requires ECMAScript 6 or later */ try { new WeakSet([value]); return true; } catch(err) { return false; } } 

объяснение

  • В Javascript null , Object , Array , Date и function s являются объектами. Хотя null немного надуманный. Итак, лучше сначала проверить на null , чтобы обнаружить, что это не ноль.

  • Проверка на typeof o === 'object' гарантирует, что o является объектом. Без этой проверки Object.prototype.toString был бы бессмысленным, поскольку он возвращал бы объект навсегда, даже для undefined и null ! Например: toString(undefined) возвращает [object Undefined] !

    После проверки typeof o === 'object' toString.call (o) является отличным методом проверки того, является ли o объектом, производным объектом, таким как Array , Date или function .

  • В функции isDerivedObject он проверяет, является ли функция o . Потому что функционируют также как объект, поэтому он здесь. Если этого не произошло, функция вернется как false. Пример: isDerivedObject(function() {}) вернул бы false , однако теперь он возвращает true .

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

Готовы использовать функции для проверки

 function isObject(o) { return null != o {amp}amp;{amp}amp; typeof o === 'object' {amp}amp;{amp}amp; Object.prototype.toString.call(o) === '[object Object]'; } function isDerivedObject(o) { return !isObject(o) {amp}amp;{amp}amp; null != o {amp}amp;{amp}amp; (typeof o === 'object' || typeof o === 'function') {amp}amp;{amp}amp; /^[object /.test(Object.prototype.toString.call(o)); } // Loose equality operator (==) is intentionally used to check // for undefined too // Also note that, even null is an object, within isDerivedObject // function we skip that and always return false for null 

Типы возврата

typeof объекты JavaScript (включая ноль) возвращает «объект»

 console.log(typeof null, typeof [], typeof {}) 

Короткий и Финальный код

 function isObject(obj) { return obj != null {amp}amp;{amp}amp; obj.constructor.name === "Object" } console.log(isObject({})) // returns true console.log(isObject([])) // returns false console.log(isObject(null)) // returns false 

тесты

 function isObject(o) { return null != o {amp}amp;{amp}amp; typeof o === 'object' {amp}amp;{amp}amp; Object.prototype.toString.call(o) === '[object Object]'; } function isDerivedObject(o) { return !isObject(o) {amp}amp;{amp}amp; null != o {amp}amp;{amp}amp; (typeof o === 'object' || typeof o === 'function') {amp}amp;{amp}amp; /^[object /.test(Object.prototype.toString.call(o)); } // TESTS // is null an object? console.log( 'is null an object?', isObject(null) ); console.log( 'is null a derived object?', isDerivedObject(null) ); // is 1234 an object? console.log( 'is 1234 an object?', isObject(1234) ); console.log( 'is 1234 a derived object?', isDerivedObject(1234) ); // is new Number(1234) an object? console.log( 'is new Number(1234) an object?', isObject(new Number(1234)) ); console.log( 'is new Number(1234) a derived object?', isDerivedObject(1234) ); // is function object an object? console.log( 'is (new (function (){})) an object?', isObject((new (function (){}))) ); console.log( 'is (new (function (){})) a derived object?', isObject((new (function (){}))) ); // is {} an object? console.log( 'is {} an object?', isObject({}) ); console.log( 'is {} a derived object?', isDerivedObject({}) ); // is Array an object? console.log( 'is Array an object?', isObject([]) ) console.log( 'is Array a derived object?', isDerivedObject([]) ) // is Date an object? console.log( 'is Date an object?', isObject(new Date()) ); console.log( 'is Date a derived object?', isDerivedObject(new Date()) ); // is function an object? console.log( 'is function an object?', isObject(function(){}) ); console.log( 'is function a derived object?', isDerivedObject(function(){}) ); 

Представляем Function.name

Function.name возвращает только для чтения имя функции или «анонимный» для замыканий.

 console.log(({}).constructor.name) // returns "Object" console.log(([]).constructor.name) // returns "Array" console.log((null).constructor.name) //throws an error because null does not actually have a property 

Примечание. Начиная с 2018 года, имя.функции может не работать в IE. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Browser_compatibility

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector