获取任何JavaScript值或对象的字符串表示的安全方法

时间:2013-09-22 09:45:28

标签: javascript

我希望获得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还有其他替代方案吗?

3 个答案:

答案 0 :(得分: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)(感谢T.J.Crowder)。如果您尝试在toString()null上致电undefined,那么这些其他优势也不会例外。

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

这样做的真正好处是nullundefined将成为一个空字符串。如果您的程序没问题,那么它可能很有用。请记住对此解决方案进行评论,因为此代码的作用并不是很明显。或者,选中value == null,它会检测到nullundefined并对其进行适当处理。

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

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

这将调用Object的{​​{1}}并将toString()设置为作为参数提供的值。这是公开对象内部ThisBinding的唯一方法。这种优势(例如,超过[[Class]])是基元和对象将始终返回相同的值(基元被{{1}转换为临时对象,盒装非严格模式中的上下文)。

答案 1 :(得分:1)

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

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

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

var str = str + '';

答案 2 :(得分:0)

您的str(a)功能正确,但会调用从default implementation继承的toString() Object。所以,是的,你的函数将为你提供每个JS对象的string表示,但不是你想要它的方式。你需要覆盖它。

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

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