为什么Handlebars模板中调用trim方法返回[object Object]而非字符串
问题原因
这个现象是Handlebars的原型访问安全策略和内部SafeString封装逻辑共同导致的:
- 模板渲染返回的
result不是普通原始字符串,是Handlebars封装的SafeString对象,作用是标记内容已经过HTML安全处理,赋值给DOM时不需要二次转义。 - 你在渲染配置中仅开放了
trim原型方法的访问权限,其余所有原型方法(包括toString、valueOf)都遵循默认禁止访问的安全规则。 - 控制台打印对象时会默认调用
toString方法生成展示文本,但toString被安全策略拦截,所以只能输出所有对象通用的[object Object]标识。 - 你看到
typeof result返回string,是因为SafeString重写了valueOf方法,类型运算时会返回内部存储的原始字符串的类型;同时DOM的innerHTML赋值会调用Handlebars内部放行的转字符串逻辑,所以页面渲染是正常的。
解决方法
两种方案任选其一即可:
- 打印前主动把结果转为原始字符串:
console.log(String(result), typeof String(result));
- 在
allowedProtoMethods配置中额外放开toString方法的访问权限:
var result = template({ aString: " abc " }, { allowedProtoMethods: { trim: true, toString: true } });
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

