5

我想在 JavaScript 中获取任何对象或值的字符串表示形式。我做了几个实验。

> var a = document.createTextNode('foo'); a
  "foo"
> var a = document.createTextNode('foo'); a.toString()
  "[object Text]"
> var a = 1; a.toString()
  "1"
> (1).toString()
  "1"
> 1.toString()
  SyntaxError: Unexpected token ILLEGAL

我有以下问题:

  1. 为什么会1.toString()失败?
  2. 下面的函数会返回每个可能的 JavaScript 对象、值或文字的字符串表示形式吗?功能:function str(a) {return a.toString()}
  3. function str我在前一点写的还有其他替代方法吗?
4

3 回答 3

6

1)。为什么会1.toString()失败?

JavaScript 解析器仅使用 1 个字符的前瞻,无法确定是1.0还是1.toString(). 你可以用1..toString()它来解决这个问题。

2)。下面的函数会返回每个可能的 JavaScript 对象、值或文字的字符串表示形式吗?功能:function str(a) {return a.toString()}

任何文字都将被转换为临时对象以便toString()调用它。如果对象有自己的toString()定义,它将被调用。否则,它将Object.prototype.toString()在几乎所有情况下使用(在原型链上)(另一种情况是具有null原型的对象)。

3)。str我在前一点中编写的函数还有其他替代方法吗?

是的。toString()您可以通过连接一个空字符串来隐式调用,例如1 + "". 您也可以使用String构造函数,例如String(value)(感谢 TJ Crowder)。这些其他的优点是,如果您尝试调用or toString(),将不会抛出异常。nullundefined

但是,这些技巧将转换nullundefined它们的字符串等价物(几乎不是您想要的)。一个肮脏的技巧是将值放入文字数组中,例如[value]然后调用toString()它。这实际上会调用join(","),但由于它只有一个成员,因此逗号永远不会成为字符串的一部分。

这样做的真正威力在于,它null只会undefined变成一个空字符串。如果这对您的程序没问题,那么它可能很有用。请记住评论这个解决方案,因为这段代码在做什么并不是很明显。或者,检查value == null哪个会检测nullundefined适当地处理它。

但是,如果您想要一个字符串来对值进行分类,您可以[[Class]]像这样获得类型......

var getInternalClass = function(value) {
    return Object.prototype.toString.call(value).slice(8, -1); 
};

这将调用Object'stoString()并将 's 设置ThisBinding为作为参数提供的值。这是暴露对象内部的唯一方法[[Class]]。这样做的优点(typeof例如,超过 )是原语和对象将始终返回相同的值(原语被转换为临时对象,在非严格模式下由上下文装箱)。call()

于 2013-09-22T09:48:13.040 回答
1

对于1.toString(),您需要执行以下操作:

1 .toString() //add space before dot (.) to avoid taking it as decimal

function str转换为字符串的最短方法(替代)是:

var str = str + '';
于 2013-09-22T09:48:26.337 回答
0

您的str(a)函数是正确的,但它会调用default implementationoftoString()继承自Object。所以是的,你的函数会给你string每个 JS 对象的表示,但不是你想要的。你需要覆盖它。

var o = new Object();
o.toString();           // returns [object Object]

请参阅此处以获取参考和覆盖:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

于 2013-09-22T09:56:31.860 回答