Функция .toFixed не работает с js-объектом - PullRequest
0 голосов
/ 10 сентября 2018

Почему, когда я хочу присвоить форматированному номеру переменную, он показывает ошибку?

var jsObject = new Object();
jsObject.number = 0;
for (i = 1; i <= 10; i++) {
  jsObject.number += 0.1;
  console.log((jsObject.number).toFixed(1)); // works and shows right numbers
  jsObject.number = (jsObject.number).toFixed(1); // TypeError: jsObject.number.toFixed is not a function
}

Ответы [ 5 ]

0 голосов
/ 10 сентября 2018

Вам необходимо преобразовать string, возвращенное из toFixed(), в правильный тип данных.

toFixed() возвращает string, поэтому на второй итерации он пытается вызвать string.toFixed(), которого не существует, поскольку toFixed() не для strings.

var jsObject = new Object();
jsObject.number = 0;

for(i = 1; i <= 10; i++) {
    jsObject.number += 0.1;
    console.log( jsObject.number.toFixed(1) );
    jsObject.number = Number.parseFloat(jsObject.number.toFixed(1)); 
}
0 голосов
/ 10 сентября 2018

Как указано в комментарии, вы перезаписываете число строковым представлением (toFixed сделать это). Таким образом, вы должны повторно преобразовать вашу строку в числовой формат. Есть так много способов сделать это правильно или нет, я предпочитаю делить на 1 (или умножить)

var jsObject = new Object();
jsObject.number = 0;
for (i = 1; i <= 10; i++) {
  jsObject.number += 0.1;
  console.log((jsObject.number).toFixed(1)); // works and shows right numbers
  jsObject.number = (jsObject.number).toFixed(1) / 1; // TypeError: jsObject.number.toFixed is not a function
}
0 голосов
/ 10 сентября 2018

toFixed возвращает строку, а в строках отсутствует метод toFixed. Обновите ваш for цикл, как это, чтобы обойти эту проблему.

for (i = 1; i < 10; i++) {
    jsObject.number += 0.1;
    console.log((jsObject.number).toFixed(1));
    jsObject.number = parseFloat((jsObject.number).toFixed(1)); // <--
}
0 голосов
/ 10 сентября 2018

Этот метод возвращает строку.

https://www.geeksforgeeks.org/javascript-tofixed-function/

Возвращаемое значение: Возвращает число в строковом представлении.

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

Вы можете проанализировать число или принудительно преобразовать число (например, с помощью умножения):

for(i = 1; i <= 10; i++) {

    jsObject.number += 0.1;

    console.log( (jsObject.number).toFixed(1) ); // works and shows right numbers

    jsObject.number = 1 * (jsObject.number).toFixed(1); // TypeError: jsObject.number.toFixed is not a 
} 
0 голосов
/ 10 сентября 2018

Потому что .toFixed () возвращает строку, поэтому вы заменяете число строкой. Простая регистрация покажет вам, что происходит.

var jsObject = new Object();

jsObject.number = 0;

for(i = 1; i <= 10; i++) {

    jsObject.number += 0.1;
    console.log(i, "before", jsObject.number, typeof jsObject.number)
    jsObject.number = (jsObject.number).toFixed(1);            
    console.log(i, "after", jsObject.number, typeof jsObject.number)


}

Вывод будет:

1 before 0.1 number
1 after 0.1 string
2 before 0.10.1 string
"Uncaught TypeError: jsObject.number.toFixed is not a function",

JavaScript не содержит конечные нули. Поэтому, если они вам нужны для вывода, лучше сделать это там, где вы выводите число. Или единственный другой вариант - это проанализировать номер Float, прежде чем добавить к нему.

jsObject.number = Number(jsObject.number) + 0.1;
jsObject.number = parseFloat(jsObject.number) + 0.1;
...