var cow = {a: 1, b: {}, c: []};
_.isEmpty(cow); // returns false
isEmpty отлично работает с объектами, содержащими числа как единственные непустые значения
_.isEmpty(cow.a); // returns true
Однако отдельные k, v из a: 1 считаются пустыми.
Я прочитал проблемы и заметил, что изначально _.isEmpty не предназначался для строк, поэтому это могло быть предназначено. Если это не предназначено, у меня есть ветка, для которой я могу сделать запрос на перенос.
Случай использования, с которым я столкнулся, делал что-то вроде этого
_.each(cow, function(v, k) {
if (_.isEmpty(v)) {
// do something with k because of v being empty
}
});
Таким образом, cow.a будет обрабатываться так же, как cow.b и cow.c. Я могу кодировать это, но подумал, что было бы намного аккуратнее, если бы мне не пришлось (и если бы это не нарушило дух или видение подчеркивания)
Да, _.isEmpty
определено только для объектов и массивов. Вы не должны использовать его для строк или чисел.
Вы не должны использовать его для чисел. Строки в порядке:
https://github.com/documentcloud/underscore/commit/79f65b440ad5e14ff2c624a836a3eff33465be9f
https://github.com/documentcloud/underscore/blob/322a64135dc3c4a649f102e962054310c2b39c04/underscore.js#L808
Итак, какие альтернативы мы можем использовать для чисел?
@jashkenas или @michaelficarra : какая-либо конкретная причина, по которой _.isNumber
не вызывается в _.isEmpty
? (так же, как используются _.isArray
и _.isString
)
По какой причине?
Ну да. Рад, что ты спросил :-)
Таким образом, я видел, как большинство людей используют _.isEmpty
- это в значительной степени проверка, было ли значение (любое значение) присвоено определенной переменной. Я видел, как многие разработчики сталкивались с проблемами из-за этого.
Даже в официальной документации указано: «Возвращает истину, если объект не содержит значений» - и число должно считаться значением.
Если у меня есть какое-то большее значение для внесения этого изменения, которое я просто не вижу, тогда моим вторым лучшим предложением было бы обновить документацию, чтобы четко указать, что ее не следует использовать для чисел :-)
Зачем вообще передавать число в isEmpty
вместо того, чтобы просто проверять, является ли число нулевым?
Даже в официальной документации указано: «Возвращает истину, если объект не содержит значений»
Совершенно верно. В JavaScript число (к сожалению) не является объектом.
Я думаю, что это можно прояснить с помощью настроек _.isEmpty
doc. Разработчики ищут
Значение _.isEmpty(a)
имеет смысл означать «является ли a
пустым объектом?», Как если бы оператор if obj == {}
работал со значениями, а не со ссылками. Следовательно, такие значения, как числа, вернут false, а также null и undefined.
пример реализации _.isEmpty
может быть:
_.isEmpty = function(a) {
return _.isEqual(a, {}) || _.isEqual(a, []) || _.isEqual(a, '');
}
@jashkenas Вероятно потому, что в некоторых других языках «пусто» определяет, пуста ли переменная или нет :) http://www.php.net/manual/en/function.empty.php
+1 к @josser - в основном потому, что у меня есть опыт работы с PHP :-p
Но я думаю, что простого пояснения в документации тоже может быть достаточно. Я серьезно вижу, что люди сталкиваются с этим каждые две недели.
Я столкнулся с этим сегодня .. Я использовал его с _.omit
_.omit(someObject, _.isEmpty);
Самый полезный комментарий
Ну да. Рад, что ты спросил :-)
Таким образом, я видел, как большинство людей используют
_.isEmpty
- это в значительной степени проверка, было ли значение (любое значение) присвоено определенной переменной. Я видел, как многие разработчики сталкивались с проблемами из-за этого.Даже в официальной документации указано: «Возвращает истину, если объект не содержит значений» - и число должно считаться значением.
Если у меня есть какое-то большее значение для внесения этого изменения, которое я просто не вижу, тогда моим вторым лучшим предложением было бы обновить документацию, чтобы четко указать, что ее не следует использовать для чисел :-)