Underscore: _.isEmpty Behavior on numbers

Созданный на 13 янв. 2012  ·  13Комментарии  ·  Источник: jashkenas/underscore

var cow = {a: 1, b: {}, c: []};
_.isEmpty(cow); // returns false

isEmpty отлично работает с объектами, содержащими числа как единственные непустые значения

_.isEmpty(cow.a); // returns true

Однако отдельные k, v из a: 1 считаются пустыми.

Я прочитал проблемы и заметил, что изначально _.isEmpty не предназначался для строк, поэтому это могло быть предназначено. Если это не предназначено, у меня есть ветка, для которой я могу сделать запрос на перенос.

question

Самый полезный комментарий

Ну да. Рад, что ты спросил :-)

Таким образом, я видел, как большинство людей используют _.isEmpty - это в значительной степени проверка, было ли значение (любое значение) присвоено определенной переменной. Я видел, как многие разработчики сталкивались с проблемами из-за этого.

Даже в официальной документации указано: «Возвращает истину, если объект не содержит значений» - и число должно считаться значением.

Если у меня есть какое-то большее значение для внесения этого изменения, которое я просто не вижу, тогда моим вторым лучшим предложением было бы обновить документацию, чтобы четко указать, что ее не следует использовать для чисел :-)

Все 13 Комментарий

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

_.each(cow, function(v, k) {
  if (_.isEmpty(v)) {
    // do something with k because of v being empty
  }
});

Таким образом, cow.a будет обрабатываться так же, как cow.b и cow.c. Я могу кодировать это, но подумал, что было бы намного аккуратнее, если бы мне не пришлось (и если бы это не нарушило дух или видение подчеркивания)

Да, _.isEmpty определено только для объектов и массивов. Вы не должны использовать его для строк или чисел.

Итак, какие альтернативы мы можем использовать для чисел?

@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);
Была ли эта страница полезной?
0 / 5 - 0 рейтинги