重学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 相关文章推荐
学习YUI.Ext第五日--做拖放Darg&Drop
Mar 10 Javascript
javascript 尚未实现错误解决办法
Nov 27 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
Feb 11 Javascript
ExtJS4中的requires使用方法示例介绍
Dec 03 Javascript
jQuery 重复加载错误以及修复方法
Dec 16 Javascript
javascript删除元素节点removeChild()用法实例
May 26 Javascript
jquery插件validation实现验证身份证号等
Jun 04 Javascript
JS函数的几种定义方式分析
Dec 17 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
Jan 26 Javascript
jQuery实现获取选中复选框的值实例详解
Jun 28 jQuery
JavaScript对象原型链原理详解
Feb 05 Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 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
提升PHP执行速度全攻略(上)
2006/10/09 PHP
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
2016/01/06 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
2017/04/17 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
js实现扫雷小程序的示例代码
2017/09/27 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
vue中node_modules中第三方模块的修改使用详解
2019/05/31 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
Python3基础之基本运算符概述
2014/08/13 Python
python遍历数组的方法小结
2015/04/30 Python
Django logging配置及使用详解
2019/07/23 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
司机的工作范围及职责
2013/11/13 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
人力资源主管的岗位职责
2014/03/15 职场文书
毕业生简历自我评价范文
2014/04/09 职场文书
教师一岗双责责任书
2014/04/16 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
催款函怎么写
2015/06/24 职场文书
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript