Рассмотрим следующее:
var o1 = {}
var O = function () {
return this
}
var o2 = new O()
var o3 = function() {}
var o4 = [o1, o1]
var output = [
[_.isObject(o1), _.isObject(o2), _.isObject(o3), _.isObject(o4)],
[_.isPlainObject(o1), _.isPlainObject(o2), _.isPlainObject(o3), _.isPlainObject(o4)],
[typeof o1 === 'object', typeof o2 === 'object', typeof o3 === 'object', typeof o4 === 'object'],
[o1 instanceof Array, o2 instanceof Array, o3 instanceof Array, o4 instanceof Array]
]
/* outputs:
[
[true,true,true,true],
[true,false,false,false],
[true,true,false,true],
[false,false,false,true]
]
*/
Очевидно, мы видим, что существует разрыв между .isObject()
:
.isPlainObject()
:
И наш добрый друг typeof x === 'object'
.
У меня есть три вопроса:
- Было ли сознательное дизайнерское решение сделать
.isObject
и.isPlainObject
поведение иначе, чем проверка типа .js? - Если мой первый вопрос верен, каково было конструктивное решение и каковы преимущества его выполнения таким образом?
- Есть ли какой-либо родной lodash ( или underscore.js)
is*
функция, которая ведет себя точно так же, какtypeof x === 'object'
?
Очевидно, я могу просто продолжать использовать typeof
, но синтаксически немного странно использовать тот или иной в некоторых местах, например, использование .isObject
будет возвращать ложные срабатывания при проверке на typeof x === 'object' && typeof x !== 'function'
. Я действительно не вижу преимуществ .isObject
, возвращающих true для функций, когда .isFunction
уже существует.