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