Аналог (-/+) бесконечности для символов в JavaScript

В javascript Infinity всегда больше любого другого числа, кроме самого себя, а -Infinity всегда меньше. Что является аналогом этого для символов, то есть каково значение строки c, для которой c.localCompare(anyString) всегда будет возвращать (+/-)1 соответственно (очевидно, кроме случая, когда c === anyString)?

На практике это будет использоваться для сортировки объектов на основе двух флагов и свойства groupName, которые будут вводиться пользователями в другую часть программного обеспечения в соответствии с ограничениями проверки ввода, поэтому это не будет пустой строкой. (Мне нужно проверить, может ли кто-нибудь «атаковать» скрипт, вставив множество 0xFFFF в приглашение имени.)

Если бы что-то вроде Infinity существовало, обратный вызов для sort() выглядел бы так:

(n1, n2) =>
  (n1.flag1 ? plusCharInfinity :
    n1.flag2 ? minusCharInfinity :
      n1.groupName).localeCompare(
        n2.flag1 ? plusCharInfinity :
          n2.flag2 ? minusCharInfinity :
            n2.groupName)

т.е. если flag1 === true то понизить в низ; если flag2 === true - продвижение в топ; в противном случае используйте данное значение groupName.

Прямого аналога нет. Что касается символов, вы должны учитывать тот факт, что существуют кодовые точки, для представления которых требуется пара символов UTF-16, и, по-видимому, ChatGPT этого не знает.

Pointy 30.03.2023 03:32

Также строки могут быть любой длины. Существует максимально возможная кодовая точка UTF-32, но строка из 100 из них больше, чем строка из 99. Я не думаю, что то, о чем вы просите, возможно.

Pointy 30.03.2023 03:35

Пустая строка обеспечивает один конец. Бесконечная строка (состоящая только из 0xFFFFs) обеспечивает другой конец, но не может быть построена.

Bergi 30.03.2023 03:35

ОП указывает except when c === anyString @pilchard

Toastrackenigma 30.03.2023 03:39

@Toastrackenigma, это справедливо, если их вариант использования не требует пустых строк. Моя точка зрения заключалась в том, что это может быть полезно в качестве нижней границы, но это не аналог -Infinity, а скорее ближе к Number.MIN_SAFE_INTEGER

pilchard 30.03.2023 03:42

Да, это тоже справедливое замечание @pilchard. Однако я не думаю, что такое аналогичное значение существует.

Toastrackenigma 30.03.2023 03:51

Зачем вызывать ненужную функцию (localeCompare), если вы уже знаете, каким должно быть возвращаемое значение, в случае, если установлены флаги.

James 30.03.2023 04:46

Спасибо за идею с нижней границей, @Bergi и @pilchard!

biinster 30.03.2023 05:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Однако, если вы просто хотите реализовать случаи детерминированной сортировки с помощью String.prototype.localeCompare() API ( который, кстати, определяется реализацией), вы можете реализовать его с помощью пользовательских объектов. Вот пример:

const smallest = {
  localeCompare(that) {
    return Object.is(this, that) ? 0 : -1;
  },
};

const largest = {
  localeCompare(that) {
    return Object.is(this, that) ? 0 : 1;
  },
};

console.info(smallest.localeCompare(smallest)); // 0
console.info(largest.localeCompare(largest)); // 0

console.info(smallest.localeCompare(largest)); // -1
console.info(smallest.localeCompare("")); // -1
console.info(smallest.localeCompare("zzzzzzzzzz")); // -1
// etc.

console.info(largest.localeCompare(smallest)); // 1
console.info(largest.localeCompare("")); // 1
console.info(largest.localeCompare("zzzzzzzzzz")); // 1
// etc.

Код в TS Playground

Это на самом деле не работает, потому что несовместимо с "".localeCompare(smallest).

Ry- 01.04.2023 01:09
^ @Ry- исходный вопрос касался только одностороннего использования, и этот ответ является ответом на него. Похоже, критерии вопроса были изменены.
jsejcksn 01.04.2023 02:22
Ответ принят как подходящий

Непосредственно аналогичных значений для строк нет, по крайней мере, таких, которые я мог бы легко найти в спецификации.

Нижняя граница

Пустая строка "" хорошо работает как нижняя граница, однако, как указывает @pilchard, это также значение, которое вы можете обычно иметь, поэтому оно не так безопасно, как, например. -Infinity, что всегда даже ниже, чем любое действительное действительное число, отличное от бесконечности.

stringToCompare.localeCompare("");

Верхняя граница

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

  • Вы можете попытаться переопределить геттер для свойства length конкретной строки, чтобы притвориться, что у вас действительно большая строка. Однако в большинстве движков прототип заморожен, и вы не можете его переопределить.

  • Спецификация JavaScript определяет максимальный размер строк как 253-1 элемента, что требует 16 384 ТБ памяти и, следовательно, невозможно построить.

    Однако большинство браузеров ограничивают это число гораздо меньшим числом (которое действительно может поместиться в оперативной памяти, которая у нас есть сегодня): 32-разрядный Chrome: ~ 512 МБ, 64-разрядный Chrome: ~ 1 ГБ, Firefox: ~ 2 ГБ и Safari: ~ 4 ГБ . Есть способы проверить эту длину и построить такую ​​строку, но это было бы пустой тратой памяти и не особенно производительно.

Но есть более простое решение. Если вы согласны с тем, что у вас нет фиксированного максимального значения, вы всегда можете создавать «более высокую» строку каждый раз, когда вам нужно выполнить сравнение.

JavaScript представляет символы как 16-битные числа, что делает максимально возможный символ \uffff. Если мы создадим строку, аналогичную исходной строке, но имеющую этот символ в начале, то эта новая строка всегда будет больше, чем исходная строка:

stringToCompare.localeCompare(`\uffff${stringToCompare}`);

Использовал вашу идею для более высокой оценки, ура @Toastrackenigma!

biinster 30.03.2023 04:41

Другие вопросы по теме