Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript的数据类型转换 #4

Open
yyzclyang opened this issue May 13, 2018 · 0 comments
Open

JavaScript的数据类型转换 #4

yyzclyang opened this issue May 13, 2018 · 0 comments

Comments

@yyzclyang
Copy link
Owner

yyzclyang commented May 13, 2018

前言

JavaScript里的声明变量时并没有类型这一说法,变量的类型可以随时改变

var x='a';
x  // a
x=2;
x //2

1 数值转换

1.1 Number()

使用Number()函数,可以将任意类型的值强制转换为数值

语法

Number()

括号里填写要进行转换的值,转换规则如下:

数值:转换了还是数值
字符:如果是数字组成的字符,可转换为数字,如果不是,返回NaN。另外,空字符串转换为0
布尔值:true为1,false0
null:转换为0
undefined:转换为NaN
对象:除了单个数字的数组转换为数值,其他一律转换为NaN

Number(324) // 324

Number('324') // 324
Number('324abc') // NaN
Number('') // 0

Number(true) // 1
Number(false) // 0

Number(null) // 0

Number(undefined) // NaN

Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5

这里提一下数值的转换,其实数值的转换背后分成了三步
第一步:调用valueOf(),如果返回原始类型的值,就直接调用number()
第二步:对第一步返回值调用toString(),如果返回原始类型的值,就调用number()
第三步:如果第二部返回的是对象,就报错

以对象为例

var obj = {name:'yyzcl'};
v = obj.valueOf(); // v : {name: 'yyzcl'}
s = v.toString(); // s : "[object Object]"
Number(s); // NaN

有一个需要注意的点,我们可以自定义valueOf()toString()函数来改变转换结果

1.2 parseInt()和passeFloat()

这俩方法也可以转换数值,但是

  • 只适用于字符串和数值
  • 字符串头部有前导空格,会自动忽略
  • 字符串在进行转换时,会将字符串依次转换,遇到不能转为数值的字符,就跳出转换,返回当前已转换的值
  • 字符串的头部可以为正负号接数字的形式
  • 字符串可以为10进制或者16进制的形式存在,会自动转为10进制或16进制,2进制和8进制不支持
  • 特别要注意会自动转为科学计数法的数字,会先转为科学计数法,然后当做字符串进行转换
parseInt(123) //123
parseInt('123') //123
parseInt('  、\t\n123') //123
parseInt('123hello') //123
parseInt('+123') //123
parseInt('0123') //123
parseInt('0x10') //16

parseInt(1000000000000000000000.5) // 等同于
parseInt('1e+21') // 1

parseInt(0.0000008) // 等同于
parseInt('8e-7') // 8

parseFloat()的使用与parseInt()类似,但是有一点,parseInt()还可以进行进制转换

parseInt()的进制转换
parseInt()可接受第二个数值参数(2到36之间),当参数为0nullundefined时默认为10,表示第一个参数字符串的进制
如果字符串的解析也是逐个字符解析的,遇到不符合进制的数值,就直接退出解析,返回已解析好的数值。如果是首字符不符合,就直接返回NaN

parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512

parseInt('10', 37) // NaN
parseInt('10', 1) // NaN

parseInt('10', 0) // 10
parseInt('10', null) // 10
parseInt('10', undefined) // 10

parseInt('1546', 2) // 1
parseInt('546', 2) // NaN

如果第一个参数其他进制的数值,会先转换为10进制,再进行第二参数进制的转换
对八进制0XXX的写法要尤其注意

parseInt(0x11, 36) // 43
parseInt(0x11, 2) // 1
// 等同于
parseInt('17', 36)
parseInt('17', 2)

parseInt(011, 2) // NaN
// 等同于
parseInt('9', 2)

1.3 一点点技巧

当由纯数字组成的字符串进行数值转换时,可以利用-*/运算符将字符串自动转为数值

- ( - '123') //123
+ '123' //123
'123' - 0 //123
'123' * 1 //123
'123' / 1 //123

2 字符串转换

2.1 String()

String()可以将任意类型的值转换为字符串

数值:转换为对应的字符串
字符串:还是字符串
布尔值:truefalse
null:null
undefined:undefined
对象:如果是数组,返回数组的字符串形式;其他返回"[object Object]"

String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"

String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"

String()转换背后其实也分为三步
第一步:先调用toString()。如果返回原始类型的值,则对该值使用String()函数
第二步:如果toString()方法返回的是对象,再调用valueOf()。如果valueOf()返回原始类型的值,则对该值使用String()函数
第三步:第二步返回的是对象,就报错

2.2 toString()

利用toString()函数进行字符串转换时,数值、字符串、布尔值、对象的转换和String()一样,但是null、undefined会报错

var n=123;
n.toString() // "123"
'123'.toString() // "123"
true.toString() // "true"
false.toString() // "false"
var obj={};
obj.toString() // "[object Object]"

null.toString() // 报错
undefined.toString() // 报错

2.3 一点点技巧

利用+运算符会自动转换为字符串

1 + '' // "1"
1 + '1' // "11"
'true' + '' // "true"
'flase' + '' // "flase"
'null' + '' // "null"
'undefined' + '' // "undefined"
var obj = {name: 'yyzcl'}
obj + '' // "[object Object]"

3 布尔值转换

3.1 Boolean()

利用Boolean()可以返回一个值的布尔值
-0/0/+0NaNnullundefined''/""的布尔值为false,其余值的布尔值全部都是true

Boolean(123) // true
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
Boolean('123') // true
Boolean(null) // false
Boolean(undefin) // false

3.2 !!

利用两次取反也可返回一个值的布尔值

!!(123) // true
!!(0) // false
!!(NaN) // false
!!('') // false
!!('123') // true
!!(null) // false 
!!(undefin) // false
@yyzclyang yyzclyang changed the title 2018.05.13 JavaScript的数据类型转换 JavaScript的数据类型转换 Aug 13, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant