LINUX.ORG.RU

Кроме того, что не нужно, зачем проверка Array.isArray(this) если мы добавляем этот код только на Array?

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

зачем проверка Array.isArray(this) если мы добавляем этот код только на Array?

Следы копипасты, тоже предполагал, что можно убрать. this.length всегда существует при обращении к этому свойству?

не нужно

Ну а как еще такой сахар получить?

let arr = []; console.log(arr.isEmpty)

damix9 ★★★
() автор топика
Ответ на: комментарий от damix9

this.length всегда существует при обращении к этому свойству?

Да. Другое дело, что если у тебя есть переменная a неизвестного типа, то тебе все равно нужно будет проверять, что она Array или хотя бы не null.

let arr = []; console.log(arr.isEmpty)

let arr = []; console.log(!arr.length)

goingUp ★★★★★
()

Зря прототипы хакать полез. И в arr.length === 0 экономить на спичках идея так себе. Можно просто писать говнину вроде !arr.length если буквы платные.

Vit ★★★★★
()

Зачем, когда можно просто проверить length? А потом удивляются почему веб такой тормозной.

a1ba
()

массив это разве контейнер? свойство быть пустым - относится к контейнерам. куда кладут и вытаскивают элементы.

не надо путать стек или список с массивом.

размер массива и пустота - разные вещи…

хотя в вашем жабаскрипте возможно все

alysnix ★★★
()
Ответ на: комментарий от Nervous

у массива есть только тип элемента и размер в элементах. у него нет свойства - сколько в нем хранится элементов.

то есть свойство - «быть пустым» - притянуто с потолка. видимо это свойство - «иметь нулевую длину».

alysnix ★★★
()
Ответ на: комментарий от alysnix

у массива есть только тип элемента и размер в элементах

Это жопаскрипт, алё. Какой ещё тип элемента.

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Это жопаскрипт, алё. Какой ещё тип элемента.

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

свойство - «быть пустым» - притянуто с потолка. видимо это свойство - «иметь нулевую длину»

Я бы скорее спросил, нахрена, а главное, зачем нам ещё одно свойство, если уже есть практически идентичный length.

И за манки-патчинг тоже не похвалил бы. Надо — напиши функцию. Функция импортируется явно, не надо рыться в коде, чтобы понять, что у нас там за свойства/методы на массиве нескучные появились.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от alysnix

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

Понятно, что сишный массив и жопаскриптовый — не одно и то же, просто названия одинаковые. Так что предъявлять к ним одинаковые требования наивновато.

Nervous ★★★★★
()
Ответ на: комментарий от alysnix

размер в элементах. у него нет свойства - сколько в нем хранится элементов.

Первое и второе - одно и то же.

firkax ★★★★★
()
Ответ на: комментарий от alysnix

названия. не соответствующие семантике обьекта

В жопаскрипте массив — контейнер. Это скорее length семантике не соответствует, но что имеем, то имеем.

Более того, там есть ещё множество, и у него размер узнаётся по свойству size. Пути жопаскриптеров неисповедимы.

То ли дело кложа — количество элементов в любой коллекции возвращает функция count.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)

В дискуссию о полезности идею писать isEmpty вместо !length вдаваться не буду. В техническом плане - set там не должно быть, убери его. В твоей реализации возможна запись arr.isEmpty = 123; (которая будет ничего не делать), а надо чтобы она генерировала ошибку - для этого надо убрать set.

firkax ★★★★★
()
Ответ на: комментарий от alysnix

Ладно, наверно ты прав, это не одно и то же. Но на наличие свойства «пустой» это не влияет.

firkax ★★★★★
()
Ответ на: комментарий от Nervous

сколько элементов будет в том массиве если последний - «apple» удалить?

нет у меня жыскрипта, и онлайн интерпретатор искать неохота. 123 небось?

alysnix ★★★
()
Ответ на: комментарий от damix9

В JS много Array-like объектов. К примеру NodeSet, arguments.

Еще в целом это плохой стиль. Язык и стандартная библиотека такие, какие есть. Их надо использовать, а не дорабатывать. Я советую просто писать array.length === 0. Этот код понятен любому. А что там твоё пропатченное свойство делает — надо каждый раз перепроверять.

Если уж хочешь, напиши просто функцию isEmpty(array). А еще лучше найди готовую библиотеку с подобным функционалом. Раньше underscore был популярным. Но лучше всего простые вещи писать просто, а не городить абстракции на ровном месте.

vbr ★★★
()
Последнее исправление: vbr (всего исправлений: 3)
Ответ на: комментарий от Vit

Можно просто писать говнину вроде !arr.length если буквы платные.

Почему говнину? Деды со времен прыщей Томпсона всегда так писали.

urxvt ★★★★★
()
Ответ на: комментарий от damix9

Возможно. Но на фоне всего остального кода (где и зарыта основная сложность) это ничтожно малая песчинка.

urxvt ★★★★★
()

js-мимокрокодил, но разве так не проще?

let isEmpty = Array.length.bind(Array);

Ну типа того?

Anoxemian ★★★★★
()

Я за универсальные функции:

const isEmpty = o => o?.length === 0

// для проверки на null/undefined
const isEmpty = o => o?.length === 0 || o == null

В JS кроме обычных массивов есть еще типизированные, Set’s, html-коллекции и тп

rtxtxtrx
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от alysnix

и че? это, наверняка, в спецификации описано и проблем не создаст, зато удобно офускаторы писать

rtxtxtrx
()
Ответ на: комментарий от alysnix

123 небось?

Если сделать delete fruits[123], то так 124 и останется.

Если сделать fruits.pop(), то будет 123.

static_lab ★★★★★
()
Ответ на: комментарий от damix9

Нет, совершенно.

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

a1ba
()
Последнее исправление: a1ba (всего исправлений: 1)

Жесть. Ведь есть же уже готовый length - Неее! Нам это не надо, нечитабельно же, давай клепать свойства, а затем и фреймворки.

neversleep ★★
()
Ответ на: комментарий от damix9

Ну а как еще такой сахар получить?

let arr = []; console.log(arr.isEmpty)

Чем это принципиально лучше, чем

let arr = []; console.log(arr.length === 0)

?

Всё чётко и понятно. Я не могу себе представить человека, который не поймёт, что имеется в виду в таком варианте. Даже если он не знает JS, только другие языки.

И не плодить ничего не дающих абстракций поверх абстракций. Вот это нагромождение всего и вся (фреймворки поверх фреймворков на любой чих) и есть главная проблема современного веба, точнее его фронтэнд части.

Не, если это действительно очередной фреймворк, и он что-то действительно кучу полезного городит в эти самые массивы помимо этого isEmpty, то это можно понять — до кучи, вписывается в ряд каких-то других более сложных свойств и функций, и всё такое. Но написание какого-то такого вот мощного фреймворка — явно не твой уровень пока, раз возникают такие вопросы. Посему могу порекомендовать перестать пытаться сделать из говна конфетку (из JS что-то типа супер читабельное и поэтичное) — всё равно не выйдет — лучше заняться чем-то более прикладным, пускай даже на том же JS.

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)

isEmpty

Немножко духоты от меня: название включает глагол и подразумевает действие, т.е. функцию. Свойство лучше назвать просто empty.

no-such-file ★★★★★
()
Ответ на: комментарий от CrX

Я и занимаюсь прикландым. Просто в процессе написания приложения родилась библиотека функций, которых недостает в стандартной. Еще до меня она начала копиться. Это просто файл .js в проекте, хотя оно годное для копипасты. Ну там например initLowerCase реализована, distinct, sleep ...

damix9 ★★★
() автор топика

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

ArrayUtils.isEmpty(dangerousShi); 

то от NPE-проблем можно застраховаться

Syncro ★★★★★
()
Ответ на: комментарий от Syncro

лучше сделать статик класс Arrays или ArrayUtils

И чем класс с набором статических методов лучше обычного модуля с набором функций?

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

тем что меньше похож на помойку, можно не указывать в имени каждого метода 5и этажное определение, подлежит лучшему рефакторингу, использование классов также позволяет осмысленно хранить состояние

Syncro ★★★★★
()
Ответ на: комментарий от firkax

Но ведь если убрать set, присвоение тоже не будет менять значение свойства, но и не будет генерировать ошибку.

damix9 ★★★
() автор топика
Ответ на: комментарий от alysnix

ну и сколько элементов «хранится» в массиве?

Очевидные 124.

а вот если бы 123 было строкой, т.е.

fruits["123"] = "apple";

то ответ будет 0. И так в js во всем.

Obezyan
()
Ответ на: комментарий от damix9

но и не будет генерировать ошибку

Но ведь мы хотим, чтобы невалидная операция генерировала ошибку, правда?

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Лучше было бы назвать empty?, если бы язык такие идентификаторы поддерживал.

theNamelessOne ★★★★★
()
Ответ на: комментарий от Syncro

меньше похож на помойку

Модуль уже выступает как пространство имён для определённых в нём переменных и функций, зачем ещё и класс внутри модуля, который делает то же самое?

можно не указывать в имени каждого метода 5и этажное определение

Какое ещё пятиэтажное определение, просто неявный первый параметр метода (символ перед точкой) становится явным первым параметром функции.

подлежит лучшему рефакторингу

С рояля? %)

использование классов также позволяет осмысленно хранить состояние

Какое состояние, у тебя там класс, набитый статическими методами, которые не имеют доступа к экземплярам класса, поэтому получают их вторым аргументом.

Плюс ко всему из модуля можно импортировать только нужные символы, а класс импортируется целиком, со всеми методами, нужными и ненужными.

Так что это ещё большой вопрос, что больше похоже на помойку %)

Nervous ★★★★★
()
Ответ на: комментарий от damix9
function test1() { } Object.defineProperty(test1.prototype, 'ro', { get: function() { return 123 }}); test2 = new test1(); console.log(test2.ro); test2.ro = 4; console.log(test2.ro);

И правда. Ну кто так делает... В любом случае держать там пустой set() смысла нет. Если хочется получше то значит set() нужен и в нём должно быть throw. Если лень - просто без set().

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Syncro

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

Это поэтому не лучше, а наоборот хуже. Если isEmpty в объекте переопределён значит так надо.

firkax ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.