媒介
说好听是说JS天真, 说不好听就是JS的坑太多, JS范例转换就是一个大坑, JS的范例包含了原始范例的[null, undefined, String ,Number, Boolean],以及对象范例的[function, object];
JavaScript 是一种弱范例(或称动态范例)言语,即变量的范例是不确定的。
x = 5; // 5
x = x + 'A'; // '5A'
上面代码中,变量x起先是一个数值,厥后是一个字符串,范例完全由当前的值决议,这就叫弱范例。
JS的数据范例
JavaScript中有五种原始数据范例:Undefined、Null、Boolean、Number以及String。
Undefined数据范例的值只要一个:undefined。
在JavaScript中,假如函数没有声明返回值,那末会返回undefined。
假如typeof背面跟一个未定义的参数,也是返回undefined。function undefinedA(){} undefinedA();//返回undefined typeof abc;//变量abc未声明,返回undefined
Null数据范例的值只要一个:null。
null与undefined的关联:undefined实际上是从null派生出来的。实在一切的js的object对象的父对象都是null。undefined == null;//返回true
typeof是一元运算符,后跟变量的称号,用于猎取变量的数据范例,其返回值有5个:undefined、boolean、number、string以及object。
转换划定规矩
转 boolean 划定规矩:
null, undefined, “”, 0, -0, NaN 转换成布尔值是 false, 剩下的全转化 true;转 number 划定规矩:
string ‘2.3.1’ => NaN;
非数字情势的,如str
,str2.3
,2.3.3.3
,a+3.2
都将会转换成非数字及NaN
Number('str');//NaN Number('2.3.3.3');//NaN Number('a+1.2');//NaN Number('2.3');//2.3
null, ”, false, [] => 0;
null,空字符串,FALSE,空数组,都将会转换成数字0(这个可能在隐式范例转换中看到的比较多)
Number(null);//0 Number('');//0 Number(false);//0 Number([]);//0
undefined => NaN;
undefined即未定义,转换为非数字
Number(undefined);//NaN
object => x Number(object.toString())
假如没法从valueOf()要领中猎取Primitive值,那末挪用object的toString()要领;假如toString()返回的是Primitive值,则将该Primitive值转换成number后返回。(Primitive这个临时没懂)
Number([2]);//2 Number([2,3]);//NaN Number({});//NaN
隐式范例转换 ==
有布尔值则转换为数值
1 == true;//true 0 == false;//true
字符串数值,则字符串转换为数值
'2' == 2;//true
依据上面两条,能够想到一个很风趣的转换,以下
!!'2' == true;//true,bool值全转为数字,字符串转数字,数字前加非划定规矩为,非0的都转1
只要一个是对象,则对象会挪用toString() valueOf()
"[object Object]" == {id:1};//true,这里的对象举行挪用了toString()要领 "[object Function]" == {id:1};//false
null == undefined
null == undefined;//true
NaN != NaN
NaN != NaN
对象==,比较内存地址
var a = {id:1}; var b = {id:1}; a == b;//false,对象比较的内存地址
转换函数
强迫转换:parseInt,parseFloat,Number,String,Boolean
下面的例子以下,以Number为例
Number(false);//0 Number(true);// 1 Number(undefined);// NaN Number(null);// 0 Number( "5.5 ");// 5.5 Number( "56 ");// 56 Number( "5.6.7 ");// NaN Number(new Object());// NaN Number(100);// 100
隐式范例转换:==,-,+,*,if,>=,<=,while,for in,alert
隐式范例转换在比较以及推断,另有做算术运算的时刻比较罕见
比较运算
'2' == 2;//true; '2' > 0;//true;
while,for in, alert运算
alert(new Boolean(false));//false,转成字符串
算术运算
'2'+1;//'21' 1+true;//2 '2'+true;//'2true' '2'-1;//1 '210'-'10';//100 '2'*'3';//6
参考
下表作为参考, 来自js威望指南:
原始范例和对象范例 转换成String 转换成Number 转换成Boolean 转换成Object undefined “undefined” NaN false throws TypeError null “null” 0 false throws TypeError true “true” 1 new Boolean(true) false “false” 0 new Boolean(false) “”(empty string) 0 false new String(“”);Object(“”) “1.2” (nonempty, numeric) 1.2 true new String(“1.2”);Object(“1.2”) “one” (nonempty, non-numeric) NaN true new String(“one”);Object(“one”) 0 “0” false new Number(0);Object(0) -0 “0” false new Number(-0);Object(-0) NaN “undefined” false new Number(NaN);Object(NaN) Infinity “Infinity” true new Number(Infinity);Object(Infinity) -Infinity “-Infinity” true new Number(-Infinity);Object(-Infinity) 1 (finite, non-zero) “1” true new Number(1);Object(1) {} (any object) NaN true [] (empty array) “” 0 true [9] (1 numeric elt) “9” 9 true [‘a’] (any other array) use join() method NaN true function(){} (any function) “undefined” NaN true