JavaScript中将一个值转换为字符串的方法分析[译]


Posted in Javascript onSeptember 21, 2012

译者注:前两天在看ES5的时候顺便出了一道题,今天看到这篇文章,刚好解释的很清楚,就翻译了一下.
在JavaScript中,主要有三种方法能让任意值转换为字符串.本文讲解了每种方法以及各自的优缺点.

1.转换字符串的三种方法
这三种将value转换为字符串的方法是:

1.value.toString()
2."" + value
3.String(value)

第一种方法存在的问题是,它不能把null和undefined转换为字符串.还有第二种和第三种方法,这两种方法的效果基本一样.

•""+value: 使用加法运算符配合一个空字符串可以把任意值转换为字符串,我觉得这种方法代码的可读性很差,但相对String(value)来,还是有一些人更喜欢用这种转换方式.
•String(value): 这种方法可读性更好,唯一的问题是,这种函数调用可能会迷惑一些人,尤其是那些熟悉Java的的程序员,因为String同时也是一个构造函数.要注意的是它作为普通函数和作为构造函数时的表现完全不同:

> String("abc") === new String("abc") 
false > typeof String("abc") 
'string' 
> String("abc") instanceof String 
false 
> typeof new String("abc") 
'object' 
> new String("abc") instanceof String 
true

String作为普通函数时会产生一个字符串(一个原始值).作为构造函数时会产生一个String对象的实例.后者在JavaScript中很少用到,所以基本上你可以忽略掉String作为构造函数的用法,但一定要记得它是个转换函数.

2.""+value 和 String(value)的细微差别
到现在你已经知道了+ 和 String()都可以将它们的“参数”转换为字符串.但他们的转换方式还是着有细微的差别,不过几乎所有的情况下,转换结果都是一样的.

2.1 将原始值转换为字符串
这两种方法都是使用引擎内部的ToString()操作将原始值转换为字符串的.“内部操作”的意思是:这个操作函数是在ECMAScript 5.1 (§9.8)中定义的,但ES语言本身并不能访问到它.下面这个表格解释了ToString()是如何转换原始值的.

参数 结果
undefined "undefined"
null "null"
布尔值 "true"或者"false"
数字 数字作为字符串,比如"1.765"
字符串 无需转换

2.2 将对象值转换为字符串

这两种方法都先将对象值转换为原始值,然后再将原始值转换为字符串.但是在这个转换中, + 使用的是内部的ToPrimitive(Number)操作(除非被转换的是date对象),而String()用的是ToPrimitive(String).

•ToPrimitive(Number): 将一个对象值转换为原始值,首先调用obj.valueOf().如果返回值是一个原始值,则返回这个原始值.如果不是,则再调用obj.toString().如果返回值是个原始值,返回这个原始值.否则,抛出TypeError异常.
•ToPrimitive(String): 和上面的方法类似,只是优先调用obj.toString()方法而不是obj.valueOf().
通过转换下面的这个对象,你可以看到它们之间的差别:

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

2.3 结果通常都相同
上面讲的区别,在实际情况中几乎不太可能遇到.因为:大部分对象都使用了默认的继承而来的valueOf()方法,返回值总是这个对象本身.
> var x = {} 
> x.valueOf() === x 
true

因此, ToPrimitive(Number)通常会跳过valueOf方法返回toString()方法的返回值,这就表现的和ToPrimitive(String)完全一样.但是,如果这个对象是Boolean,Number或者String的对象实例,那么它的valueOf()会返回一个原始值(被这个对象包装前的原始值).那么这两种操作就会按照如下步骤执行:

•ToPrimitive(Number)返回了对象的valueOf()方法的返回值(被包装前的原始值)再经过ToString()操作后的结果.
•ToPrimitive(String)返回了对象的toString()方法的返回值(在该对象被包装前的原始值上进行ToString()操作的返回值).
就这样,他们还是返回了相同的结果,只是转换的途径不同.

3.结论

你应该选择哪种方式来将其他类型的值转换为字符串呢?如果你能确保这个值永远不会是null或者undefined,则可以用value.toString()来转换.否则,""+value和String(value)选哪个都可以,看个人喜好,我认为String(value) 更明确一点.

4.相关文章

  1. JavaScript values: not everything is an object [原始值和对象值的区别]
  2. What is {} + {} in JavaScript? [解释了+运算符的工作原理]
  3. String concatenation in JavaScript [怎样才能更好的连接多个字符串]
Javascript 相关文章推荐
使用prototype.js进行异步操作
Feb 07 Javascript
用Javascript同时提交多个Web表单的方法
Dec 26 Javascript
利用js实现选项卡的特别效果的实例
Mar 03 Javascript
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
JS+CSS实现电子商务网站导航模板效果代码
Sep 10 Javascript
jquery实现图片放大镜功能
Nov 23 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
May 24 Javascript
JS简单实现禁止访问某个页面的方法
Sep 13 Javascript
js实现5秒倒计时重新发送短信功能
Feb 05 Javascript
微信小程序使用Promise简化回调
Feb 06 Javascript
原生JS实现轮播图效果
Oct 12 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
Apr 15 Javascript
使用apply方法处理数组的三个技巧[译]
Sep 20 #Javascript
js DOM 元素ID就是全局变量
Sep 20 #Javascript
JavaScript NaN和Infinity特殊值 [译]
Sep 20 #Javascript
JavaScript 更严格的相等 [译]
Sep 20 #Javascript
JavaScript 反科里化 this [译]
Sep 20 #Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 #Javascript
JavaScript 用Node.js写Shell脚本[译]
Sep 20 #Javascript
You might like
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
javascript 函数调用的对象和方法
2010/07/01 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
js Math 对象的方法
2013/09/01 Javascript
JS判断表单输入是否为空(示例代码)
2013/12/23 Javascript
javascript中callee与caller的区别分析
2015/04/20 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
基于javascript实现页面加载loading效果
2020/09/15 Javascript
json的使用小结
2016/06/08 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
解决torch.autograd.backward中的参数问题
2020/01/07 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
利用CSS3实现炫酷的飞机起飞动画
2016/09/17 HTML / CSS
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
法国体育用品商店:GO Sport
2019/10/23 全球购物
工厂门卫岗位职责
2013/11/25 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
2015年学校团委工作总结
2015/05/26 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
人民币符号
2022/02/17 杂记