1、数据类型转换:
JS是一门动态类型的语言,变量数据类型没有限制,能够随时赋值,可是运算时是对数据类型有要求的,若是运算类型不符,js会自动强制转换类型后再进行计算。
'2'-1函数
'2'是string类型1是number类型,两个数据类型不一样,可是进行了减法运算,运算前js会自动尝试将string类型转为number类型后再进行运算。spa
2、任意值转字符串:
js提供了如下API进行转换,String(?),?.toString()code
var a0 = 0; var a1 =true; var a2 = undefined; var a3 = null; var a4 = {}; String(a0) "0" String(a1) "true" String(a2) "undefined" String(a3) "null" String(a4) "[object Object]" a0.toString() "0" a1.toString() "true" a2.toString() VM308:1 Uncaught TypeError: Cannot read property 'toString' of undefined at <anonymous>:1:4 (anonymous) @ VM308:1 a3.toString() VM315:1 Uncaught TypeError: Cannot read property 'toString' of null at <anonymous>:1:4 (anonymous) @ VM315:1 a4.toString() "[object Object]"
经过上述代码能够发现,null,和undefined能够用String可是不能用toString,由于他们没有toString()方法。对象
var a0 = 0 + ''; var a1 = true + ''; var a2 = undefined + ''; var a3 = null + ''; var a4 = {} + ''; undefined a0 "0" a1 "true" a2 "undefined" a3 "null" a4 "[object Object]"
也能够经过加一个空字符串来转成字符串类型,该方法核心在于加号,加号若是发现左右两边任意有字符串,就会尝试将另一边也转成字符串。blog
3、任意值转布尔值:
js提供了如下Boolean()方法进行转换,还能够经过!!取反两次进行转换图片
var a0 = 0; var a1 = true; var a2 = undefined; var a3 = null; var a4 = {}; undefined Boolean(a0) false Boolean(a1) true Boolean(a2) false Boolean(a3) false Boolean(a4) true !!a0 false !!a1 true !!a2 false !!a3 false !!a4 true
全部的数据类型中,有5种特殊值是false。number类型的0和NaN是false,空字符串‘’也是false,全部的对象都是true即便是空对象也是。
5个falsy值ip
var a = 0 var a1 = NaN Boolean(a) false Boolean(a1) false var a2 = '' Boolean(a2) false var a3 = null Boolean(a3) false var a4 = undefined Boolean(a4) false
4、任意值转数值:
js提供了如下API进行转换,
一、Number():
Number()方法会对字符串进行转换,如能够转换成number类型则转为对应的数值,若是不能则返回NaN。内存
// 空字符串转为0 Number('') // 0 // 布尔值:true 转成 1,false 转成 0 Number(true) // 1 Number(false) // 0 // undefined:转成 NaN Number(undefined) // NaN // null:转成0 Number(null) // 0 // 字符串:若是不能够被解析为数值,返回 NaN Number('324abc') // NaN
二、parseInt(string, radix),parseFloat(),parseFloat通常用来转浮点数
string要被解析的值。若是参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操做)。字符串开头的空白符将会被忽略。radix一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。好比参数"10"表示使用咱们一般使用的十进制数值系统。始终指定此参数能够消除阅读该代码时的困惑而且保证转换结果可预测。当未指定基数时,不一样的实现会产生不一样的结果,一般将值默认为10。字符串
Number()函数将字符串转为数值,要比parseInt()和parseFloat()函数严格不少。Number()只要有一个字符没法转成数值,整个字符串就会被转为NaN,而parseInt()和parseFloat()会尝试将字符串前面的数字转成数字。若是要转的字符串第一位就没法转换则返回NaN数学
var a = '123abc' Number(a)//字符串a,Number直接返回NaN NaN parseInt(a,10)//字符串a,parseInt则将字符串前面的123转成数字 123 parseFloat(a) 123 var a = 'abc123' parseInt(a,10) NaN parseFloat(a) NaN 除了使用parseInt(string, radix),parseFloat(),通常多使用【-0】和【+0】方法进行转换 '1'-0 1 '1.21'-0 1.21 '-1'-0 -1 '-1.21'-0 -1.21
5、普通类型和包装对象:
一、所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原始对象。这三个原始对象能够把原始类型的值变成(包装成)对象。
var a = new Number(123); var b = new String('abc'); var c = new Boolean(true); var a1 = 123; var b1 = 'abc'; var c1 = true;
当带有new操做符时,是看成对象而且JS提供了一些方法,不带new声明是,值直接是存在栈内存,带new操做符时当对象是存在堆内存。经过下面代码能够看到,经过new声明提供了不少方法。
var a = 'a' var b = new String('b') console.log(a) a console.log(b) String {"b"}....
6、普通类型(原始对象)和包装对象的转换:
某些场合,原始类型的值会自动看成包装对象调用,即调用包装对象的属性和方法。这时,JavaScript 引擎会自动将原始类型的值转为包装对象实例,并在使用后马上销毁实
var a = 'abc' //声明一个普通字符串类型(原始对象),其自己并无length属性 a.length //调用a.length时JS引擎会自动将var a = 'abc'转成var a = new String(a) 3 a.name = 'zhang' "zhang" //a转为包装对象后加了一个name属性 a.name //可是a.name却返回undefined,这是由于原始类型的值转为包装对象使用后马上销毁 undefined
7、关于内存的一些知识点:
在js普通(简单)数据类型,存到栈内存,复杂类型存到堆内存,string二者均可以存。
栈内存和堆内存数据组织形式不一样。
示例解析:
第一:a是一个对象,栈内存地址假设是addr1,值保存在堆内存。
第二:声明变量b等于变量a,则变量b也是一个对象,由于b=a,因此栈内存b的地址也
是addr1,而且堆内存不会重复保存b的值。
第三:从新给变量b赋值且值是对象类型,此时会在堆内存保存b的值。
结果:a.name返回的是a,由于b第二次赋值时在堆内存已经保存了它的值,a和b在堆内存有各自的值互不影响。
示例解析:
第一:a是一个对象,栈内存地址假设是addr1,值保存在堆内存。
第二:声明变量b等于变量a,则变量b也是一个对象,由于b=a,因此栈内存b的地址也是addr1,堆内存不重复保存b的值。
第三:变量a和b两个栈内存地址是相同的,都指向堆内存的地址addr1,此时修改a.name或者b.name都会将堆内存数据覆盖。
结果:a.name返回的是b,由于b.name已经修改了堆内存内保存的数据