译者按: 语言的细枝末节了解一下就可以了,不需要太较真,不过如果一点也不知道的话,那就不太妙了。

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

对于JavaScript,有3种不同方法可以将变量转换为字符串。这篇博客将详细介绍这些方法,并比较他们的优劣。

3种方法

将变量转换为字符串的3种方法如下:

value.toString()

"" + value

String(value)

当value为null或者undefined时,第1种方法就不行了。而方法2和方法3基本上是一样的。

""+value: 将value与空字符串相加,即可将其转换为字符串。这种方法其实是一种稍微晦涩的技巧,可能会让别人难于理解开发者的意图。不过,这一点见仁见智,有些人偏爱这种方法。

String(value): 这种方法非常清晰:使用String()函数将value转换为字符串。不过,String()有两种不同用法,容易混淆,尤其对于Java开发者来说。当String()和运算符new一起作为构造函数使用时,它返回一个新创建的String对象;当不用new运算符调用String()时,它只把value转换成原始的字符串。这两者是非常不同的:

> String("Fundebug") === new String("Fundebug")

false

> typeof String("Fundebug")

'string'

> String("Fundebug") instanceof String

false

> typeof new String("Fundebug")

'object'

> new String("Fundebug") instanceof String

true

事实上,将String()作为构造函数使用并不常见,因此仅使用它来转换字符串就好了。

""+value与String(value)的细微差别

""+value与String(value)都可以将value转换为字符串,它们是如何做到的呢?事实上,它们虽然结果相同,但是方法稍有区别。

将primitive基本类型转换为字符串

两种方法都使用内部函数ToString()将primitive基本类型转换为字符串。ToString()函数在ECMAScript 5.1 (§9.8)中定义了,但是并不能直接使用,因此称作内部函数。下面的表格显示了ToString()函数如何将primitive基本类型转换为字符串:

参数

结果

undefined

"undefined"

null

"null"

Boolean

"true"或者 "false"

Number

将数字转换为字符串,例如: "1.765"

String

无需转换

将Object转换为字符串

转换为字符串之前,两种方法都会先将Object转换为primitive。不同的是,""+value使用内部函数ToPrimitive(Number)(除了date类型),而String(value)使用内部函数ToPrimitive(String)。

ToPrimitive(Number): 先调用obj.valueOf,若结果为primitive则返回;否则再调用obj.toString(),若结果为primitive则返回;否则返回TypeError。

ToPrimitive(String): 与ToPrimitive(Number)类似,只是先调用obj.toString(),后调用obj.valueOf()。

可以通过以下示例了解区别,obj如下:

var obj = {

valueOf: function()

{

console.log("valueOf");

return {};

},

toString: function()

{

console.log("toString");

return {};

}

};

调用结果:

> "" + obj

valueOf

toString

TypeError: Cannot convert object to primitive value

> String(obj)

toString

valueOf

TypeError: Cannot convert object to primitive value

它们的结果相同

""+value与String(value)虽然不同,但是我们很少能感觉到。因为,大多数object使用默认的valueOf(),它返回对象本身:

> var x = {}

> x.valueOf() === x

true

由于valueOf()返回值并非primitive,因此ToPrimitive(Number)会跳过valueOf(),而返回toString()的返回值。这样,与ToPrimitive(String)的返回值就一样了。

当object是Boolean、Number或者String实例时,valueOf()将返回primitive。这就意味着两者的计算过程是这样的:

ToPrimitive(Number):valueOf()返回primitive值,然后使用ToString()转换为字符串。

ToPrimitive(String): toString()通过ToString()函数将primitive值转换为字符串。

可知,虽然计算过程不同,但是它们的结果是一样的。

结论

那么你该选择哪种方法呢?如果你可以确保value值不是null和undefined,那么不妨使用value.toString() 。否则,你只能使用""+value 和String(value),它们基本上是一样的。

参考

java变量名转字符串_JS中将变量转为字符串相关推荐

  1. python高级函数、将函数作为变量、返回函数_从函数外部返回变量名,作为python函数内部的字符串...

    因此,我创建了一个函数,它将一个操作(在本例中,一个数组与一个正弦波进行逐点乘法,但这与我的问题无关).在 现在我已经创建了另一个函数,我想用它创建一个string的python代码,以便以后多次应用 ...

  2. python合法的变量名有哪些_Python判断变量名是否合法的方法示例

    问题: 变量名是否合法: 1.变量名可以由字母,数字或者下划线组成 2.变量名只能以字母或者下划线开头 s = 'hello@' 判断变量名的第一个元素是否为字母或者下划线 s[0] 如果第一个元素符 ...

  3. python变量名是否合法_Python判断变量名是否合法的方法示例

    如何判断一个python表达式是否合法? 换句话说合法的python表达式的通性是什么?活得糊涂的人,容易愉悦:活得清醒的人,容易烦恼. a=input() try:b=eval(a);print(& ...

  4. python的变量名命名规则_python的变量命名规范

    一.python变量名命名规则: 1.变量名通常由字母,数字,下划线组成; 2.数字不能作为变量名开头; 3.不能以python中的关键字命名; 4.变量名要有意义; 5.不要用汉字和拼音去命名; 6 ...

  5. python判断变量名是否合法_Python判断变量名是否合法的方法示例

    问题: 变量名是否合法: 1.变量名可以由字母,数字或者下划线组成 2.变量名只能以字母或者下划线开头 s = 'hello@' 判断变量名的第一个元素是否为字母或者下划线 s[0] 如果第一个元素符 ...

  6. 处理问题:变量名‘@UserName’已声明。变量名在插叙批次或存储过程内部必须唯一

    在做.net版机房收费系统时,遇到这样一个问题:登陆系统时,在B层的登陆函数UserLogin_BLL()中调用了D层的两个函数-判断用户是否存在IsUserExist_DA(),验证密码是否正确Ch ...

  7. oracle变量名,Oracle中的替换变量,变量名,变量名

    替换变量(仅用于SQL *Plus或者用于原理和SQL *Plus相同的开发工具): 临时存储值 利用它可以达到创建通用脚本的目的 利用它可以达到和用户交互,故在SQL *Plus中又称交互式命令 替 ...

  8. python变量名要求_Python中用中文变量名、函数名,会影响性能吗?

    首先,python这样的语言,只能做有限的"词法编址"(lexical address),不可能实现 @王加加 所说的"所有变量名函数名等名称,在转成字节码后,只是一个个 ...

  9. php动态创建变量名,PHP中动态创建变量名(可变变量)

    PHP中,我们可以动态地创建一个变量名.例如,你想要使用与数据库查询得到的字段名称一致的变量名. 使用PHP中"可变变量"的语法,即在一个其值为你想作为变量名称的变量前面加一个$: ...

最新文章

  1. python 运行部分代码_改改Python代码,运行速度还能提升6万倍
  2. PL/SQL基础篇4(游标)
  3. 这 8 篇文章告诉你:未来的软件研发是怎样的?
  4. 中兴zxr10路由器重启命令_中兴交换机常用命令
  5. UVA 494(Kindergarten Counting Game)
  6. step3 . day4 数据结构之线性表 栈和队
  7. bzoj2761 [JLOI2011]不重复数字
  8. 以软件开发生命周期来说明各种测试的使用情况
  9. 我妈给我介绍对象了,我大学还没毕业呢,先在婚介市场也这么卷了的吗?【Python爬虫实战:甜蜜蜜婚介数据采集】
  10. 计算机知识说明,请说明计算机的工作原理
  11. win7计算机闪屏,win7电脑闪屏是什么原因
  12. HTML源码大放送1
  13. 简洁的微信Markdown编辑器
  14. Java的小tips(1) ------关于“Java :找不到符号”类问题的解读
  15. 解决Outlook打不开邮件里的链接的方法
  16. all boot options are tried的问题解决
  17. [FreeRTOS系列教程]学习FreeRTOS前的准备工作-----初学者必看
  18. 海量上传文件服务器端,bat批量上传ftp文件到服务器
  19. matlab计算wsn覆盖率,WSN覆盖率求解
  20. 跨域读写Cookie

热门文章

  1. SAP ABAP实用技巧介绍系列之如何创建Maintenance view
  2. Spring contextLoaderListener源码学习
  3. 一个SAP顾问的回忆:我过去很胖!
  4. 手机app上的consent管理
  5. 找出SAP OData service出错根源的小技巧
  6. python最小化打开exe_如何用python使GoAgent窗口打开后自动最小化以及关闭之前的py.exe窗口...
  7. dataframe 如何选中某列的一行_如何用 Python 在笔记本上分析 100GB 数据?
  8. 单元测试 代码里面都绝对路径怎么处理_原创 | 编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP...
  9. java 委托_面试官:java双亲委派机制及作用
  10. ubuntu下mysql编码格式设置_Ubuntu 16.04.1下修改MySQL默认编码