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

Safe way to get a string representation of any JavaScript value or object

本文关键字:表示 安全 方法 字符串 获取 JavaScript 对象 任何      更新时间:2023-09-26

我想在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之外,还有其他选择吗?

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.克劳德)。这些其他的优点是,如果您尝试在nullundefined上调用toString(),则也不例外。

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

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

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

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

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

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

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

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

var str = str + '';

您的str(a)函数是正确的,但它将调用从Object继承的toString() default implementation。所以是的,你的函数会给你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