我希望获得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.toString()
会失败?function str(a) {return a.toString()}
function str
还有其他替代方案吗?答案 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
,那么这些其他优势也不会例外。
然而,这些技巧会将null
和undefined
转换为它们的字符串等价物(几乎不是你想要的)。一个肮脏的技巧是将值放在文字数组中,例如[value]
然后在其上调用toString()
。这实际上会调用join(",")
,但看到它只有一个成员,逗号永远不会成为字符串的一部分。
这样做的真正好处是null
和undefined
将成为一个空字符串。如果您的程序没问题,那么它可能很有用。请记住对此解决方案进行评论,因为此代码的作用并不是很明显。或者,选中value == null
,它会检测到null
和undefined
并对其进行适当处理。
但是,如果你想要一个字符串来对一个值进行分类,你可以得到类型的[[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