如何实现toString将数字转换为字符串?

5
我在面试中被要求实现 toString() 将数字转换为字符串。 toString() n => s 123 => "123" 除了以下方法之外:
  • 通过连接空字符串来将数字转换 123+""
  • 使用内置的 toString() 函数 (123).toString()
  • 创建一个新字符串 String(123)
还有其他什么方法可以在 JavaScript 中实现 toString()

1
可能通过反复将结果除以10并取模10来实现… - Sebastian Simon
https://dev59.com/sm025IYBdhLWcg3w1ZoL - Barmar
@Xufox 这个怎么工作的?我有点迷失了。如果不进行转换,你不需要获取一个 UTF 代码或其他什么吗? - Daniel Lizik
1
JSON.stringify(n) 可以工作。 - Sebastian Simon
1
感谢对这个问题的回答。解决这个问题有很多正确的方法,所以我会等到有足够多的投票支持任何一个答案,然后接受它作为“正确”的答案。 - Patrick
显示剩余2条评论
4个回答

1
您可以将其用作对象的属性名称。

function toString(value) {
  // Coerces value to a primitive string (or symbol)
  var obj = {};
  obj[value] = true;
  return Object.getOwnPropertyNames(obj)[0];
}
console.log(toString(123));  // 123      -> "123"
console.log(toString(1.23)); // 1.23     -> "1.23"
console.log(toString(NaN));  // NaN      -> "NaN"
console.log(Infinity);       // Infinity -> "Infinity"
console.log(toString(-0));   // -0       -> "0"
console.log(toString(1e99)); // 1e99     -> "1e+99"

您也可以使用DOM属性:
var obj = document.createElement('div');
obj.setAttribute('data-toString', value);
return obj.getAttribute('data-toString');

或者加入一个数组

return [value].join();

还有很多东西在内部使用ToString抽象操作。


0

这适用于整数。它将数字模10并重复除以10,然后将48添加到数字并使用String.fromCharCode获取数字的字符串值,最后将所有内容连接起来。

function toString(n){
  var minus = (n < 0
      ? "-"
      : ""),
    result = [];
  n = Math.abs(n);
  while(n > 0){
    result.unshift(n % 10);
    n = Math.floor(n / 10);
  }
  return minus + (result.map(function(d){
    return String.fromCharCode(d + 48);
  })
    .join("") || "0");
}

console.log(toString(123123));
console.log(toString(999));
console.log(toString(0));
console.log(toString(-1));


0
这里的技巧是将数字视为一系列数字。这不是数字的固有属性,因为我们使用的十进制表示法相当任意。但是,一旦一个数字被表示为一系列数字,就很容易将每个数字单独转换为字符串,并连接所有这样的字符串。
编辑:正如指出的那样,这仅考虑了整数(这对于面试问题可能是可以接受的)。
var intToDigits = function(n) {
    var highestPow = 1;
    while (highestPow < n) highestPow *= 10;
    var div = highestPow / 10;

    // div is now the largest multiple of 10 smaller than n

    var digits = [];

    do {
        var digit = Math.floor(n / div);
        n = n - (digit * div);
        div /= 10;
        digits.push(digit);
    } while (n > 0);

    return digits;
};

var toString = function(n) {
    var digitArr = intToDigits(n);
    return digitArr.map(function(n) {
        return "0123456789"[n];
    }).join('');
};

使用方法:

>> toString(678)
"678"

我尝试了toString(123.123),结果得到了一个天文数字 :/ - Daniel Lizik
2
更容易计算“highestPow”:Math.pow(10, Math.ceil(Math.log10(n))) - Sebastian Simon
这将不考虑小数。 - Gershom Maes
@Xufox,没错,绝对是的。 - Gershom Maes

-1

如果您正在使用ES6,您可以使用模板文字

var a = 5;
console.log(`${a}`);

这基本上相当于我在问题描述中提到的 123+"" 方法。但这不是面试官想要的实现方式。 - Patrick
抱歉,我以为他想让你从技术角度谈论ES版本和功能。 - Oussama BEN MAHMOUD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接