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
但是,这些技巧将转换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()