重学JS之显示强制类型转换详解


Posted in Javascript onJune 30, 2019

ToString

ToString负责处理非字符串到字符串的强制类型转换,常用的字符串化方法String()、toString()。

基本类型值的字符串化规则:

  • null转换为'null'
  • undefined转换为'undefined'
  • true转化为'true'
  • 数字的字符串化遵循通用规则,极大值或者极小值采用科学计数法表示

普通对象在字符串化时,实际执行Object.prototype.toString(),返回该对象的类型[object type],例如:

var test = {a : 'test'}
console.log(test.toString()) // '[object Object]'
console.log(String(test)) // '[object Object]'

但是当对象有自己的toString方法时,字符串化时就会调用该方法并返回该方法的返回值,例如:

var obj = {
 a: 'test',
 toString: function () {
 return 1
 }
}
console.log(obj.toString()) // 1
console.log(String(obj)) // 1

数组在做字符串化时,将数组所有元素字符串化再用","连接,例如:

var arr = [1, 2]
console.log(arr.toString()) // '1,2'
console.log(String(arr)) // '1,2'

JSON.stringify()

JSON.stringify()在将JSON对象序列化为字符串时,也涉及到了字符串化的相关规则。

对大多数简单值来说,JSON字符串化和toString()的效果基本相同,例如:

console.log(JSON.stringify("test")) // ""test""
console.log(JSON.stringify(1)) // "1"
console.log(JSON.stringify(null)) // "null"

但是JSON.stringify()在对象中遇到function() {}、undefined、Symbol时会自动将其忽略,在数组中则会返回null,例如:

var obj1 = {
 a: undefined,
 b: function () {},
 c: Symbol()
}
console.log(JSON.stringify(obj1)) // "{}"
console.log(JSON.stringify([undefined, function () {}, 1])) // "[null, mull, 1]"

当对象执行JSON.stringify()方法时,如果对象中存在toJSON方法,用它的返回值来进行序列化,例如:

var obj2 = { 
 a: undefined,
 b: function () {},
 c: Symbol(),
 toJSON: function () {
 return {a: 'replace'}
 }
}
console.log(JSON.stringify(obj2)) // "{"a":"replace"}"

ToNumber

ToNumber负责将非数字转化为数字,Number()、parseInt()和parseFloat()都可以将非数字转化为数字

Number()

Number()函数的转换规则:

  • 如果是Boolean类型,true和false分别转换为0和1
  • 如果是数字值,只是简单的传入和返回
  • 如果是null值,返回0
  • 如果是undefined,返回NaN
  • 如果是字符串,遵循下列规则:
    • 如果字符串中只包含数字,则将其转变为十进制数
    • 如果字符串中包含有效的浮点格式 ,则将其转换为对应的浮点数值
    • 如果字符串中包含有效的十六进制格式,则将其转换为相同大小的十进制数
    • 如果字符串是空,则将其转换为0
    • 如果字符串中包含除上述格式之外的字符串,则将其转换为NaN
  • 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换值。如果转换的结果是NaN,则调用对象的toString()方法,然后再依次照前面的规则转换返回的字符串值

例如:

console.log(Number(true)) // 1
console.log(Number(1)) // 1
console.log(Number(null)) // 0
console.log(Number(undefined)) // NaN
console.log(Number('11')) // 11
console.log(Number('1.1')) // 1.1
console.log(Number('0xf')) // 15
console.log(Number('')) // 0
var a = {
 valueOf: function () {
  return '10'
 }
}
var b = {
 toString: function () {
  return '10'
 }
}
var c = [1, 0]
c.toString = function () {
 return c.join("")
}
console.log(Number(a)) // 10
console.log(Number(b)) // 10
console.log(Number(c)) // 10

parseInt()

parseInt()转换规则:

  • parseInt()函数在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符
  • 如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN
  • 如果第一个字符是数字字符,parseInt()就会继续解析,直到解析完所有后续字符或者遇到一个非数字字符
  • 如果字符串中的第一个字符是数字字符,parseInt()也能识别各种进制数

例子:

console.log(parseInt('a')) // NaN
console.log(parseInt('11')) // 11
console.log(parseInt('11aa')) // 11
console.log(parseInt('0xf')) // 15

parseFloat()

parseFloat()转换规则:

  • 与parseInt()函数类似,parseFloat()也是从第一个字符开始解析每一个字符,而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止
  • 解析时会忽略前导的0
  • 只会解析十进制数

例子:

console.log(parseFloat('12.3a')) // 12.3
console.log(parseFloat('0xf')) // 0
console.log(parseFloat('01.1')) // 1.1

ToBoolean

布尔强制类型转换的假值列表:

  • undefined
  • null
  • false
  • +0、-0和NaN
  • ""

除了上述列表以外的值在转换的时候都应该是真值,强制布尔类型转换常用Boolean()或者!!,第一个!将值强制转为布尔类型,但同时还将真假值反转,第二个!将结果返回原值,例子:

console.log(Boolean("0")) // true
console.log(Boolean([])) // true
console.log(Boolean(undefined)) // false
console.log(!!"0") // true
console.log(!![]) // true
console.log(!!undefined) // false

总结

这篇文章对JS中的常见显示强制类型转换做了一个小结,希望能对大家理解有所帮助。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
为什么要在引入的css或者js文件后面加参数的详细讲解
May 03 Javascript
js 中将多个逗号替换为一个逗号的代码
Jun 07 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
Nov 06 Javascript
jquery判断当前浏览器的实现代码
Nov 07 Javascript
Vue axios 中提交表单数据(含上传文件)
Jul 06 Javascript
微信小程序之分享页面如何返回首页的示例
Mar 28 Javascript
Vue进度条progressbar组件功能
Apr 17 Javascript
微信小程序登录态和检验注册过没的app.js写法
May 22 Javascript
新手入门带你学习JavaScript引擎运行原理
Jun 24 Javascript
基于Vue和Element-Ui搭建项目的方法
Sep 06 Javascript
JavaScript变量基本使用方法实例分析
Nov 15 Javascript
JS实现可视化音频效果的实例代码
Jan 16 Javascript
JavaScript判断浏览器运行环境的详细方法
Jun 30 #Javascript
微信小程序如何自定义table组件
Jun 29 #Javascript
微信小程序如何调用图片接口API并居中显示
Jun 29 #Javascript
微信小程序如何调用json数据接口并解析
Jun 29 #Javascript
pm2启动ssr失败的解决方法
Jun 29 #Javascript
localstorage实现带过期时间的缓存功能
Jun 28 #Javascript
vue分页器组件编写方法详解
Jun 28 #Javascript
You might like
长波知识介绍
2021/03/01 无线电
网友原创的PHP模板类代码
2008/09/07 PHP
php 生成WML页面方法详解
2009/08/09 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
thinkphp 多表 事务详解
2013/06/17 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
php查询内存信息操作示例
2019/05/09 PHP
laravel5.6中的外键约束示例
2019/10/23 PHP
基于jquery的$.ajax async使用
2011/10/19 Javascript
JavaScript 获取任一float型小数点后两位的小数
2014/06/30 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
AngularJS中关于ng-class指令的几种实现方式详解
2016/09/17 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
2018/05/16 jQuery
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
Python基于DES算法加密解密实例
2015/06/03 Python
Python读取sqlite数据库文件的方法分析
2017/08/07 Python
Python实现句子翻译功能
2017/11/14 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
python opencv肤色检测的实现示例
2020/12/21 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
游戏商店:Eneba
2020/04/25 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
酒店门卫岗位职责
2013/12/29 职场文书
母婴店促销方案
2014/03/05 职场文书
党员政治学习材料
2014/05/14 职场文书
谢师宴邀请函
2015/02/02 职场文书
2015国庆节感想
2015/08/04 职场文书