Каков «лучший» способ преобразования числа в строку (с точки зрения скорости, чистоты, памяти и т. Д.)?
Некоторые примеры:
String(n)
n.toString()
""+n
n+""
источник
Каков «лучший» способ преобразования числа в строку (с точки зрения скорости, чистоты, памяти и т. Д.)?
Некоторые примеры:
String(n)
n.toString()
""+n
n+""
нравится:
var foo = 45;
var bar = '' + foo;
На самом деле, хотя я обычно делаю это так для простого удобства, более 1000 итераций, как представляется, для грубой скорости есть преимущество для.toString()
Смотрите тесты производительности здесь (не мной, но нашел, когда я пошел писать свой собственный): http://jsben.ch/#/ghQYR
Самый быстрый на основе теста JSPerf выше: str = num.toString();
Следует отметить, что разница в скорости не слишком значительна, если учесть, что она может выполнить преобразование любым способом 1 миллион раз за 0,1 секунды .
Обновление: скорость, кажется, сильно отличается от браузера. В Chrome, num + ''
кажется, быстрее всего на основе этого теста http://jsben.ch/#/ghQYR
Обновление 2: опять же, основываясь на моем тесте выше, следует отметить, что Firefox 20.0.1 работает .toString()
примерно в 100 раз медленнее, чем '' + num
образец.
'' + 123e-50
возврат"1.23e-48"
.null foo
что не выдает ошибку.По моему мнению,
n.toString()
приз за его ясность, и я не думаю, что это несет какие-либо дополнительные издержки.источник
null
,undefined
), которые не работают с этим ответом, вряд ли делает его «небезопасным».null
илиundefined
как это зависит от конкретного приложения, хотя я представляю(n || defaultNumber).toString()
, что большинство людей хотели бы в такой ситуации, я категорически не согласен, мы должны работать над всеми вопросами. Речь шла о преобразовании чисел в строки, хорошей архитектуре и других преобразованиях типов, где это необходимо, это отдельные уроки.Явные преобразования очень понятны для тех, кто плохо знаком с языком. Использование принуждения типов, как предлагали другие, приводит к неоднозначности, если разработчик не осведомлен о правилах принуждения. В конечном счете, время разработки обходится дороже, чем процессорного времени, поэтому я бы оптимизировал для первого за счет последнего. Тем не менее, в этом случае разница, вероятно, незначительна, но если нет, я уверен, что есть несколько достойных JavaScript-компрессоров, которые оптимизируют подобные вещи.
Итак, по вышеуказанным причинам я бы пошел с:
n.toString()
илиString(n)
.String(n)
Вероятно, это лучший выбор, потому что он не потерпит неудачу, еслиn
равен нулю или не определен.источник
null
, илиundefined
. Еслиn
этоnull
илиundefined
из-за ошибки в моей программе, то я бы предпочел, чтобы моя программа не работала в этом состоянии, чтобы дать мне больше шансов найти и исправить ошибку. Сбои программы - это подарки для программиста, чтобы помочь ей найти ошибки :-). Альтернативой является поставка программного обеспечения, которое не работает, как задумано, тщательно скрывая ошибки. Итак, я не фанат использованияString(n)
для маскировки ошибки.String(n)
подходит для использования в функциональном стиле, например, с комбайном подчеркивания_.compose(funcThatNeedsAStringParam, String)
.Источник
источник
Язык в щеке очевидно:
Или в ES6 вы можете просто использовать строки шаблона :
источник
'' + number
метод. Тем не менее, результаты этих тестов сильно различаются при их многократном выполнении, поэтому не уверен, следует ли принимать их слишком серьезно.Другие ответы уже охватывали другие варианты, но я предпочитаю этот:
Короткий, лаконичный, уже используемый во многих других местах (если вы используете современную платформу / версию ES), так что это безопасная ставка, любой программист поймет это.
Не то, чтобы это (обычно) имело большое значение, но оно также оказалось одним из самых быстрых по сравнению с другими методами .
источник
n.toString()
, не так ли?n
этоundefined
будет бросать синтаксическую ошибку, используя.toString()
String(n)
во всех случаях? Разница лишь в том, что это менее понятно.Самый простой способ преобразовать любую переменную в строку - добавить пустую строку в эту переменную.
источник
(5.41 + '')
использовать методы String, такие как.substring()
и другиеЕсли вам нужно отформатировать результат в определенном количестве десятичных знаков, например, для представления валюты, вам нужно что-то вроде
toFixed()
метода.digits
количество цифр, отображаемых после запятой.источник
Я использовал https://jsperf.com для создания тестового примера для следующих случаев:
https://jsperf.com/number-string-conversion-speed-comparison
По состоянию на 24 июля 2018 года результаты говорят о том, что
number + ''
он самый быстрый в Chrome, в Firefox, который связан с литералами шаблонных строк.И то
String(number)
, и другоеnumber.toString()
на 95% медленнее, чем самый быстрый вариант.источник
Мне нравятся первые два, так как их легче читать. Я имею тенденцию использовать,
String(n)
но это - только вопрос стиля чем что-либо еще.Это если у вас нет строки как
что самоочевидно
источник
Я думаю, что это зависит от ситуации, но в любом случае вы можете использовать
.toString()
метод, так как он очень понятен.источник
.toString () - это встроенная функция приведения типов, я не разбираюсь в этих деталях, но всякий раз, когда мы сравниваем встроенные методы приведения типов к явным методам, всегда предпочтительнее встроенные обходные пути.
источник
Если бы мне пришлось принять все во внимание, я предложу следующее
ИМХО, это самый быстрый способ преобразования в строку. Поправь меня, если я ошибаюсь.
источник
Единственное допустимое решение для почти всех возможных существующих и будущих случаев (входные данные - число, ноль, неопределенное значение, символ и все остальное)
String(x)
. Не используйте 3 способа для простой операции, основываясь на предположениях типа значения, таких как «здесь я определенно преобразую число в строку и здесь определенно логическое значение в строку».Объяснение:
String(x)
обрабатывает null, undefined, Symbols, [что угодно] и вызывает.toString()
объекты.'' + x
вызовы.valueOf()
по x (приведение к числу), броски по символам могут обеспечить результаты, зависящие от реализации.x.toString()
бросает в нули и неопределенный.Примечание:
String(x)
все равно не будет работать на объектах без прототипов, таких какObject.create(null)
.Если вам не нравятся строки типа «Hello, undefined» или вы хотите поддерживать объекты без прототипов, используйте следующую функцию преобразования типов:
источник
С помощью числовых литералов точка для доступа к свойству должна отличаться от десятичной точки. Это оставляет вам следующие опции, если вы хотите вызвать String () для числового литерала 123:
источник
Ниже приведены методы для преобразования целого числа в строку в JS
Методы расположены в порядке убывания производительности.
(Результаты теста производительности приведены @DarckBlezzer в своем ответе)
var num = 1
Способ 1:
num = `$ {num}`
Способ 2:
num = num + ''
Способ 3:
num = String (num)
Способ 4:
num = num.toString ()
Примечание: вы не можете напрямую вызвать tostring () с номера
Например: 2.toString () сгенерирует Uncaught SyntaxError : неверный или неожиданный токен
источник
Если вам интересно, какой из них наиболее эффективен, проверьте это, где я сравниваю все различные преобразования числа -> строки.
Похоже
2+''
или2+""
самые быстрые.https://jsperf.com/int-2-string
источник
Мы также можем использовать конструктор String . Согласно этому тесту, это самый быстрый способ конвертировать Number в String в Firefox 58, хотя он и медленнее, чем
" + num
в популярном браузере Google Chrome.источник
Метод
toFixed()
также решает цель.источник
Вы можете вызвать
Number
объект, а затем позвонитьtoString()
.Number.call(null, n).toString()
Вы можете использовать этот трюк для других нативных объектов javascript.
источник
Просто сталкивайтесь с этим недавно, методы 3 и 4 не подходят, потому что, как строки копируются, а затем соединяются. Для небольшой программы эта проблема незначительна, но для любого реального веб-приложения это действие, в котором мы имеем дело с манипуляциями с частотными строками, может повлиять на производительность и удобочитаемость.
Вот ссылка для чтения .
источник
Я собираюсь отредактировать это с большим количеством данных, когда у меня будет время, потому что сейчас все в порядке ...
Тест в nodejs v8.11.2: 2018/06/06
вывод
источник
Похоже, аналогичные результаты при использовании node.js. Я запустил этот скрипт:
и получил следующие результаты:
Подобные времена каждый раз, когда я запускал его.
источник