javascript - 在标准 JavaScript ES6 环境中,什么时候调用过 .toString() ?
问题描述
我只发现.toString()
调用的时间是字符串连接和字符串插值:
// Inside of Node:
> let arr = [1,3,5];
> arr.toString()
'1,3,5'
> "" + arr
'1,3,5'
> arr + ""
'1,3,5'
> `${arr}`
'1,3,5'
据说,console.log
打印出对象的字符串表示并应该使用toString()
,但我不确定它是否toString()
通常没有正确实现,console.log
其他的也是如此:
> console.log(arr);
[ 1, 3, 5 ]
> console.log("arr is %s", arr);
arr is [ 1, 3, 5 ]
那么在 JavaScript 本身内部,什么toString()
时候调用过呢?
我认为通过多态性,我们自己编写的任何内容都可以用来ourObj.toString()
将对象的字符串表示为字符串。但我想知道在 JavaScript 本身(它的所有函数、库、类)中,何时toString()
实际调用?
解决方案
在 EcmaScript 语言规范的几个部分中,都提到了toString
. 抽象操作OrdinaryToPrimitive中出现了一个重要用途:该函数将查找对象toString
或valueOf
方法,并执行它。优先级可能受提示参数的影响。
反过来,OrdinaryToPrimitive
被抽象操作调用ToPrimitive
ToPrimitive
由ToNumber
, ToString
, ToPropertyKey
, 关系比较, 相等比较, 表达式求值,Date
构造函数, 几种字符串化方法, 如toJSON
, ...等调用。
事实上,该语言充满了将要执行的内部操作ToPrimitive
。该规范有 200 多个对ToString
.
例子
这是一个带有toString
方法实现的对象,以证明它toString
是在内部调用的。
然后按照每个触发器的几个表达式toString
。
// Preparation
let obj = {
toString() {
this.i = (this.i||0) + 1; // counter
console.log("call #" + this.i);
return "0";
}
};
// Trigger toString via several constructs
({})[obj];
1 < obj;
1 == obj;
1 + obj;
1 - obj;
+obj;
Math.abs(obj);
parseInt(obj);
new Date(obj);
new RegExp(obj);
new Number(obj);
Symbol(obj);
"".localeCompare(obj);
[obj, null].sort();
[obj].join();
`${obj}`;
setTimeout(obj); // Not standard EcmaScript environment, but defined in the agent.
toString()
如果valueOf
定义了obj
一个返回原始值的方法,其中一些不会触发。
推荐阅读
- r - 向量的条件更新
- bash - 意外标记 ';' 附近的语法错误 在 Bash 中运行命令时
- python-3.x - 试图将我的 SQLLITE 逐行插入查询更改为 python 中的批量插入,我如何实现它
- javascript - 带有对象数组的可扩展动态嵌套列表
- firebase - 使用 Google 登录通过 Firebase 签名后如何访问课堂 API
- c# - 如何将 .net 控制台应用程序客户端连接到 azure 数据工厂
- java - 此版本的 Realm 不支持打开格式版本 0 的 Realm 文件
- javascript - 本地存储 - React Native
- javascript - 如何使用jQuery以与数组相同的顺序对html元素进行排序?
- python - ModuleNotFoundError - 即使存在 python 文件也无法导入 python 文件