获取任何 JavaScript 值或对象的字符串表示形式的安全方法
Safe way to get a string representation of any JavaScript value or object
我想在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()
会失败? - 下面的函数会向我返回每个可能的 JavaScript 对象、值或文字的字符串表示吗?功能:
function str(a) {return a.toString()}
- 除了我在上一点中写的
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.克劳德)。这些其他的优点是,如果您尝试在null
或undefined
上调用toString()
,则也不例外。
但是,这些技巧会将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
的toString()
,并将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
- React中的数据集表示
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 使用javascript存储变量的最安全方式
- 是否存在React Native“;WEB代码安全防护”;
- 内容安全策略:页面's设置阻止加载资源
- 如何通过安全的https连接在javascript中使用基于soap xml的Web服务
- 任何将(SSH)终端嵌入到一些HTML5表示系统中的想法(例如,show.js)
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- 如何将Date字段设置为等于另一个Date+Int值,该值表示月份值
- 导致内容安全策略(CSP)冲突错误的本地jquery.js文件
- regex表示逗号,后跟空格或仅逗号
- 如何在Google chrome安全首选项文件中创建扩展安全哈希代码
- 我将如何将其更改为循环和数组表示法
- ES6 模板文字是否比 eval 更安全
- 如何使用Undercore和Backbone在HTML中表示模型属性
- 将JSON对象的表示形式更改为显式键/值格式
- CORS保持在SecurityError上:操作不安全
- 旋转木马;启用内容安全策略时无法工作
- 使用 var t=!0 / var t=!1 表示真/假有多安全?他们是否总是返回真正的布尔值真/假
- 获取任何 JavaScript 值或对象的字符串表示形式的安全方法