`

javascript 中强制执行 toString()

 
阅读更多

原文:Enforcing toString()

译文:javascript 中强制执行 toString()

译者:singleseeker

Javascript通常会根据方法或运算符的需要而自动把值转成所需的类型,这可能导致各种错误。 Brian McKenna (@puffnfreshsuggests 提供了下列测试代码:

Object.prototype.valueOf = function () {
    throw new Error('Use an explicit toString');
};

这些代码会产生什么效果? 你现在再也不能用加号运算符去把一个对像转成一个字符串了:

> var obj = {};

> 'Hello '+obj
Error: Use an explicit toString

> String(obj)
'[object Object]'
> obj.toString()
'[object Object]'

> 'Hello '+String(obj)
'Hello [object Object]'

这个又是怎么回事呢? 要把一个对象转成一个特定的基本类型 T,首先是它的值被转化成基本类型,然后才是转换成 T,前一个转换由两步完成

  1. 调用 valueOf() 方法,如果返回一个基本类型,那么就结束

  2. 不然,调用方法 toString()。如果返回一个基本类型,那么结束

  3. 再不然,抛出错误

如果最后的转换是个数值,会是上述调用 valueOf() 与 toString 的这个顺序。

如果最后的转换是字符串,那么 toString 会被先调用。 加号运算符可能会被值转成数值型或是字符串型,但它通常根据数字运算产生一个基本类型

不用在文章开始发的代码片段, Object.prototype.valueOf() 会返回这个对象本身,这个是从原生对象继续来的没有被重写的方法:

> var obj = {};
> obj.valueOf() === obj
true

加号运算符最终会调用 toString()。 上面的代码片段阻止了调用,在能调用那个方法前抛出了错误。

注意这个错误信息并不总是完全正确。

> Number(obj)
Error: Use an explicit toString

但是这一招扔然是有用的。

如果一个对象真想被转化成数字,那么它无论如何还是要调用自己的 valueOf 方法。

@singleseeker罗嗦:这篇文章翻译起来真心是想更种吐槽,知识点总结的倒是不错, 不过做为一个不是英语为母语的老外写的英文技术文章交给我一个母语不是英语的菜鸟翻译,着实够折磨人。 下面进行简单的总结。

  1. 通常 valuOf() 指示返回一个未转换的对象,也就是其本身

  2. 加号运算符除了 Date 对象外,几乎全是先调用 valueof() 方法

  3. 如果使得 valueof() 返回一个明确的基本数值类型,那么当一个对象与字符串相加时,toString() 将不会被调用

参考

  1. 强制转换对象(objects)为原始值(primitives)

  2. JavaScript中,{}+{}等于多少?

22
4
分享到:
评论

相关推荐

    javascript中强制执行toString()具体实现

    原文:Enforcing toString() 译文:javascript 中强制执行 toString() 译者:singleseeker Javascript通常会根据方法或运算符的需要而自动把值转成所需的类型,这可能导致各种错误。 Brian McKenna (@puffnfresh) ...

    JavaScript-Api文档

    6. **异步编程**:JavaScript是单线程执行的,但通过异步编程(如回调函数、Promise、async/await)可以处理非阻塞的I/O操作,提高程序的响应性和效率。 7. **原型与继承**:JavaScript的继承机制基于原型链,所有...

    Javascript 强制类型转换函数

    JavaScript 提供了三个内置的全局函数来进行这样的强制类型转换:`Boolean()`, `Number()`, 和 `String()`。 首先,`Boolean(value)` 函数用于将值转换为布尔类型。在 JavaScript 中,`Boolean()` 会根据传入的值...

    JavaScript高频面试题.docx

    5. 强制类型转换:number、String、tostring。 6. 隐式类型转换:+、-、*、/。 JavaScript 对象 7. window.onload 的作用:等文档(标签)和资源都加载完成后调用。 8. document.write() 和 innerHTML 的区别:...

    「大学Javascript网络课考试题答案」.docx

    toString()方法是JavaScript对象的一个通用方法,用于将对象转换为字符串形式,但它不是Date对象的专有方法。getMinutes()和getSeconds()用于获取分钟和秒数,而toGMTString()用于将Date对象转换为格林威治时间格式的...

    JavaScript 核心参考教程 内置对象

    JavaScript 不是纯面向对象的语言,而是基于对象的,这意味着它允许开发者利用内置对象来实现各种功能,但并不强制使用面向对象的编程范式。 在JavaScript中,内置对象是语言本身提供的基础结构,它们提供了许多...

    javascript基础讲解

    此外,还有几个强制类型转换函数:`toString()`将值转换为字符串,`parseInt()`将非数字字符串转为整数,`parseFloat()`则用于转换为浮点数。需要注意的是,不同类型的值在转换为数字或字符串时会有特定的规则,例如...

    JavaScript总结.docx

    JavaScript 是一门广泛应用于网页和应用开发的脚本语言,尤其在客户端编程中不可或缺。对于新手来说,理解并掌握JavaScript的基本概念和技术是至关重要的。本文档将深入探讨JavaScript的基础知识,包括数据类型、...

    JavaScript笔记

    事件驱动:JavaScript的执行都是由事件引发 解释执行:先读到的先执行,后读到的会替代先读的 可以使用任何文本编辑工具编写 JavaScript 代码,然后由浏览器解释执行。 JavaScript常用于实现如下功能: |--控制...

    javascript教程

    在JavaScript中,函数是程序的基本构建块之一,用于封装可重复使用的代码段。函数定义通常遵循以下两种格式: 1. **传统函数声明**:`function functionname(arg0, arg1, ..., argn) { statements }` - 这是最常见...

    前端面试资料,适合中高级前端面试者

    JavaScript中经常涉及不同类型之间的自动转换,这在语言设计中称为类型强制(type coercion)。 - **转布尔值**: - 在条件语句中,如`if`语句,几乎所有非空值(除了`undefined`、`null`、`false`、`NaN`、`''`、...

    Javascript 类型转换方法

    以下我们将详细介绍JavaScript中的类型转换方法。 1. **转换到布尔类型(Boolean Conversion)** - 在JavaScript中,布尔类型主要在条件判断语句(如`if`)和其他逻辑运算(如`&&`、`||`和`!`)中出现。当需要将...

    107个常用javascript语句

    48.在老的浏览器中不执行此JS:<!-- //--> 49.引用一个文件式的JS:<script type="text/javascript" src="aaa.js"> 50.指定在不支持脚本的浏览器显示的HTML:<noscript></noscript> 51.当超链和onCLICK事件都有时,则老...

    跟我学习javascript的隐式强制转换

    JavaScript中的隐式强制转换是编程过程中常常遇到的概念,它涉及到数据类型之间的转换,尤其是在进行运算或比较操作时。JavaScript有六种数据类型:null、undefined、boolean、string、number和object,其中object是...

    You Don't Know JS - Types & Grammar

    - **数字**: JavaScript中的数字类型包括整数和浮点数,但在内部,所有数字都用双精度64位格式存储。这可能会导致精度问题,在进行数学计算时需要注意。 #### 原生包装器对象 JavaScript为每种原始类型提供了原生...

    全面了解JavaScript的数据类型转换

    由于JavaScript是一种弱类型语言,其变量在声明时不指定数据类型,而在赋值时确定,这导致在JavaScript中存在类型转换的现象,既包括隐式的自动类型转换,也包括显式的强制类型转换。接下来,我们将全面分析...

Global site tag (gtag.js) - Google Analytics