博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类型转换 盲区
阅读量:4544 次
发布时间:2019-06-08

本文共 3885 字,大约阅读时间需要 12 分钟。

转 Boolean 

在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。

对象转基本类型

对象在转换基本类型时,首先会调用 valueOf 然后调用 toString。并且这两个方法是可以重写的。也可以重写 Symbol.toPrimitive ,且该方法在转基本类型时调用优先级最高。  

let a = {  valueOf() {    return 0;  },  toString() {    return '1';  },  [Symbol.toPrimitive]() {    return 2;  }}1 + a // 3'1' + a // '12'
Number({}) // NaN({}).valueOf() // {}({}).toString() // '[object Object]' NaNNumber([]) // 0[].valueOf() // [][].toString() // ''[1].valueOf() // [1][1].toString() // '1'[1,2].valueOf() // [1,2][1,2].valueOf() // '1,2'Number(function(){}) // NaN(function () {}).valueOf() // f(){}(function () {}).toString() // 'function () {}'

 

数字转换

parseInt 在转换数字时会向下取整,损失精度。Number 和 parseFloat 转换结果不变。

在转换数字时,如果数字是以 0 开头,那么将数字转换为 8进制,如果数字是以 0x 开头的,那么将数字转换为 16 进制。

Number(3.1415926) // 3.1415926parseInt(3.1415926) // 3parseFloat(3.1415926) // 3.1415926
Number(010) // 8parseInt(010) // 8parseFloat(010) // 8Number(0x10) // 16parseInt(0x10) // 16parseFloat(0x10) // 16

数字转换字符串

Number 转换字符串时,会把字符串当做一个整体,如果字符串是空的,那么返回 0 ;如果字符串非空,且字符串中有一个字符不是数字,那么转换结果就是 NaN。

parseInt 与 parseFloat 在转换字符串时,会一个字符一个字符的转换,如果字符串开头存在数字,那么返回数字,如果字符串开头不是数字,返回 NaN,点开头的,parseInt 会返回 NaN,而parseFloat 会前添0。

在用parseInt 进行转换时,如果字符串是以 ox 开头的数字,那么将字符串转换为 16 进制。

字符串数字,转换时,会自动前后处理小数的0。正负数能正常转换。

Number('') // 0parseInt('') // NaNparseFloat('') // NaNNumber('Hello 123') // NaNparseInt('Hello 123') // NaNparseFloat('Hello 123') // NaNNumber('123 Hello') // NaNparseInt('123 Hello') // 123parseFloat('123 Hello') // 123
Number('.123') // 0.123Number('123.900') // 123.9Number('00.123') // 0.123Number('+123') // 123Number('-123') // -123parseInt('.123') // NaNparseInt('123.900') // 123parseInt('00.123') // 0parseInt('+123') // 123parseInt('-123') // -123parseFloat('.123') // 0.123parseFloat('123.900') // 123.9parseFloat('00.123') // 0.123parseFloat('+123') // 123parseFloat('-123') // -123
parseInt('0x0010Hellow')  // 16parseFloat('0x0010Hellow') // 0parseInt('010Hellow') // 10parseFloat('010Hellow') // 10

数字转Boolean

Number 在转换布尔值时,如果布尔值为 true 返回 1, 否则返回 0;

parseInt 与 parseFloat 转换布尔值总是返回 NaN。

Number(true) // 1         parseInt(true) // NaN    parseFloat(true) // NaN        Number(false) // 0parseInt(false) // NaN    parseFloat(false) // NaN

数字转null

Number 转 null 值为 0,而 parseInt 与 parseFloat 转 null 的值为 NaN。

Number(null) // 0         parseInt(null) // NaN    parseFloat(null) // NaN

数字转undefined

Number、parseInt、parseFloat 转 undefined 的值为 NaN。

Number(undefined) // NaNparseInt(undefined) // NaNparseFloat(undefined) // NaN

 

总结:

1. parseInt 与 parseFloat 只能转换数字或者以数字开头的字符串,其他全部为 NaN。parseFloat能转换以 点 开头后面跟数字的字符串。

2. Number 转换数字或数字字符串时,如果字符串中含有除数字之外的其他字符,返回NaN。转换null、‘’、false、[] 时返回 0 ,true、[1] 返回 1,其他返回 NaN。

隐式转换

一元运算符 + 与 - 可以将其他类型的值转换为数字,- 转换结果为负数。转换规则与 Number 相同。

+ 3.14 // 3.14- 3.14 // -3.14+ '' // 0- '' // -0+ 'hello' // NaN- 'hello' // NaN+ true // 1- true // -1+ false // 0- false // -0+ null // 0- null // -0+ undefined // NaN- undefined // NaN+ {} // NaN- {} // NaN+ [] // 0- [] // -0+ [1] // 1- [1] // -1+ [1,2] // NaN- [1, 2] // NaN+ (function(){}) // NaN- (function(){}) // NaN

一元运算符 !取反

! null // true! '' // true! undefined // true! 0 // true! -0 // true! NaN // true// 其他都为false

+ 运算符 中含对象

{} + [] // {}; +[] = +0 = 0({}) + [] // '[object Object]' + '' = '[object Object]'

相等运算符,原始类型与复合类型比较时,会将复合类型转换成对应的原始类型

[1] == 1 // Number([1]) == 1  true[1] == '1' // String([1]) == Number('1')  true[1] == true // Boolean([1]) == true true

 题目

0 == null // false0 > null // false0 >= null // true ?

第一行,0 == null、undefined、{} 、ture 、function () {} 都为 false,0 == ‘’、[]、false 为true

第二行,没有字符串,转换为数字,0 > Number(null),0 > 0 ,false

第三行,没有字符串,转换为数字,0 >= Number(null),0 >= 0 ,true

 

~~运算符,连续使用两个否运算符,进行向下取整,这是所有取整方法中最快的一种。

~~3.1415 // 3~~3.64 // 3

^ 异或运算符,常用于不借助第三方变量,交换两个变量的值。

var a = 9var b = 5a = a ^ bb = a ^ ba = a ^ bconsole.log(a, b) // 5 9

 

转载于:https://www.cnblogs.com/EnSnail/p/9708692.html

你可能感兴趣的文章
webpack+react环境搭建,不必要再使用create-react-app来创建,随意配置更方便
查看>>
一些常用的方法,通过继承加入react组件中,this来调用
查看>>
编写一个登录接口测试脚本过程中遇到的坑
查看>>
JVM类加载机制
查看>>
重温Android和Fragment生命周期
查看>>
设计六大原则总结
查看>>
TurtleBot3-ROS包下载速度慢如何解决
查看>>
快速获取DB服务器当前 MEM CPU的资源消耗
查看>>
vc6
查看>>
[机器学习实战] AdaBoost集成算法及非均衡分类问题
查看>>
Flask 【第八篇】flask-session组件
查看>>
7. spark使用中的优化
查看>>
git status 不可全信
查看>>
cocos2d addChild 方法会自动将 child 的引用计数加1
查看>>
poj 2676 如何填满九宫格
查看>>
sublime text3中设置Emmet输入标签自动闭合
查看>>
git log --author详解,这个是个模糊匹配
查看>>
mysql 创建merge表方便查询
查看>>
测试你的浏览器是否支持WebGL(Does My Browser Support WebGL)
查看>>
PAT Basic 1036
查看>>