String(value) 与 value.toString() 有什么区别

2024-02-05

Javascript 在类型和类型转换方面有很多“技巧”,所以我想知道这两种方法是否相同,或者是否存在某些特殊情况使它们不同?


它们并不完全相同,实际上,作为函数调用的 String 构造函数 http://bclary.com/2004/11/07/#a-15.5.1(你的第一个例子),将在最后调用toString传递的对象的方法,例如:

var o = { toString: function () { return "foo"; } };
String(o); // "foo"

另一方面,如果标识符指的是null or undefined,你不能使用toString方法,它会给你一个TypeError例外:

var value = null;
String(null);     // "null"
value.toString(); // TypeError

The String作为函数调用的构造函数大致相当于:

value + '';

类型转换规则来自Object-to-原始详细描述了规范,[[DefaultValue]] http://bclary.com/2004/11/07/#a-8.6.2.6内部操作。

简要总结一下,当从Object-to-String,采取以下步骤:

  1. If available, execute the toString method.
    • If the result is a 原始, 返回result,否则转至步骤 2。
  2. If available, execute the valueOf method.
    • If the result is a 原始, 返回result,否则转至步骤 3。
  3. Throw TypeError.

考虑到上述规则,我们可以举一个所涉及的语义的例子:

var o = {
  toString: function () { return "foo"; },
  valueOf:  function () { return "bar"; }
};

String(o); // "foo"

// Make the toString method unavailable:
o.toString = null;

String(o); // "bar"

// Also make the valueOf method unavailable:
o.valueOf = null;

try { 
  String(o); 
} catch (e) {
  alert(e); // TypeError
}

如果您想了解有关此机制的更多信息,我建议您查看ToPrimitive http://bclary.com/2004/11/07/#a-9.1ToString http://bclary.com/2004/11/07/#a-9.8内部运作。

我还推荐阅读这篇文章:

  • JavaScript 中的对象到基元转换 http://www.adequatelygood.com/2010/3/Object-to-Primitive-Conversions-in-JavaScript
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

String(value) 与 value.toString() 有什么区别 的相关文章

随机推荐

  • 强制触摸 UITableViewCell 内的 UICollectionView

    我有一个带有 Tableview 的 viewController 多个 TableViewCell 并且在每个 TableViewCell 中都有一个带有多个 UICollectionViewItems 的 UICollectionVie
  • 纯 JS 幻灯片菜单,能够“在菜单外部单击”关闭它

    我正在尝试重新表述我的问题 并将完成我所做的所有步骤 特别是我失败的地方 我对 JS 的了解并不深 但有通过实践学习的意愿以及社区的帮助 我偶然发现这个答案 https stackoverflow com a 38317768 559718
  • 使用 POST 请求重定向的好方法?

    我需要通过 POST 请求将用户重定向到外部站点 我想到的唯一选择是通过 JavaScript 提交表单 有任何想法吗 不太明白你的意思 所以我们举几个场景 用户应该将表单发布到您自己以外的服务器 很简单 只需将目标指定为表单操作即可
  • (Codesandbox,Vue)“属性或方法“children”未在实例上定义,但在渲染期间引用。”

    我目前正在构建一个状态管理器 它可以集成到多个前端框架中 包括 Vue 为了演示 Vue 中状态管理器的用法 我创建了一个简单的codesandbox 因为有一个实时代码示例总是很好 可以在自述文件中进行推广 但不知何故 我总是在代码和框中
  • Path 中加号的 Data 值是多少

    如何使用 Path 对象中的 data 属性绘制加号和减号 这是我的三角形路径对象 我需要将其更改为加号
  • JS 客户端 Exif 方向:旋转和镜像 JPEG 图像

    数码相机照片通常保存为带有 EXIF 方向 标签的 JPEG 为了正确显示 图像需要根据设置的方向进行旋转 镜像 但浏览器会忽略渲染图像的此信息 即使在大型商业 Web 应用程序中 对 EXIF 方向的支持也可能不稳定1 http www
  • Android:发送数据存储在MySQL中

    Solved 缺少 postData 的视图参数 已更改以反映这一点 我需要一些帮助 将 GPS 数据发送到服务器 该数据将使用 PHP 存储在 MySQL 数据库中 这是在我的 Java 文件中 ArrayList
  • JLabel setText 不更新文本

    我正在尝试使用以下方法更新 JLabelsetText 方法 但我无法重绘 JLabel 我必须使用repaint 方法来做到这一点 这是代码的一部分 我没有收到任何错误 但它没有更新 JLabel public void actionPe
  • 将 infoWindow 放置在远离标记的静态位置(Google 地图)

    我想要实现的 到目前为止找不到任何东西 是 infoWindow 没有附加到标记 我想将其放置在视口中的静态位置 并根据单击的标记交换内容 问 如何将谷歌地图标记信息窗口放置 而不仅仅是偏移 到固定位置 回答我自己的问题 如果有人需要这个
  • 如何禁用 #line 指令写入 T4 生成输出文件

    我在生成 T4 代码时遇到了一个小问题 我已将 T4 模板分解为单独的文件并将它们放置在不同的目录中 我已经这样做了 因此我的代码生成的部分内容可以在多个项目中重复使用 例如模型生成 存储库生成和服务生成都包含核心 EntityGenera
  • 双控制台输出?

    突然 当我在本地运行我的应用程序时 我得到了双控制台输出 有谁知道这可能是什么原因造成的 运行 Thin 和 Unicorn 时都存在该问题 gt Booting Thin gt Rails 4 0 0 application starti
  • 在 odoo 中安装 woocommerce 连接器

    我想连接 woocommerce 和 odoo 我在 Odoo 中安装 woocommmerce 连接器时遇到问题 我从那里得到了 woocommerce 连接器https github com OCA connector woocomme
  • 没有规则可以创建“opencv.exe”所需的目标“C:/opencv/build/lib/libopencv_world300d.dll.a”。停止

    所以我试图构建一个简单的 opencv 代码 但我不断收到此错误 而且我似乎在互联网上找不到任何解决方案 操作系统 Windows 8 1 编译器 GNU GCC 601 IDE CLion CMake 3 0 和 mingw64 这是我从
  • spring-mvc中将json解析为java对象

    我熟悉如何从我的返回 json Controller方法使用 ResponseBody注解 现在我正在尝试将一些 json 参数读入我的控制器 但到目前为止还没有运气 这是我的控制器的签名 RequestMapping value ajax
  • findOneAndUpdate 覆盖作为 doc 传递的 2 级以上深度对象中的属性

    假设我有这个架构 var UserSchema new Schema name firstName String lastName String 我创建这个用户 User create name firstName Bob lastName
  • 用户点击时使用ajax加载processing.js sketch

    我正在尝试通过单击 ajax 加载processing js 草图 但它不起作用 如果我立即加载草图 它会起作用 但不会在用户交互时加载 这是我的代码 clicker click function var canvasRef
  • 避免 Google Apps 脚本中出现 formatDate 错误

    我有一个函数可以存储在数组中并循环文档中的数据 在这个里面 有一些单元格的日期格式为 dd mm yyyy 但是当我通过电子邮件发送它时 看起来像2014 年 1 月 1 日星期三 00 00 00 GMT 0300 ART 我在这个函数内
  • IA-64 上出现段错误,但 IA-32 上没有

    我无法访问我的原始账户 https stackoverflow com users 211631 whacko cracko 如果可能的话 请版主合并帐户 这是我的问题 以下 C 程序在 IA 64 上出现段错误 但在 IA 32 上运行良
  • 使用 AngularJS 日期过滤器和 UTC 日期

    我有一个以毫秒为单位的 UTC 日期 我将其传递给 Angular 的日期过滤器以进行人工格式化 someDate date d MMMM yyyy 太棒了 除了someDate采用 UTC 时间 并且日期过滤器认为它是当地时间 我如何告诉
  • String(value) 与 value.toString() 有什么区别

    Javascript 在类型和类型转换方面有很多 技巧 所以我想知道这两种方法是否相同 或者是否存在某些特殊情况使它们不同 它们并不完全相同 实际上 作为函数调用的 String 构造函数 http bclary com 2004 11 0