一、数据类型
1.基本数据类型:null,undefined,string,number,boolean
2.引用数据类型:object,array,function,data等
二、基本数据类型和引用数据类型的区别
1. 声明变量时不同的内存匹配
基本数据类型:存储在栈中的简单数据。它们的值直接存储在变量访问的位置。
引用数据类型:存储在堆中的对象。存储在变量处的值是一个指针,指向存储对象的内存地址。
2. 不同访问机制
基本数据类型:值可以直接访问到
引用数据类型:在js里不允许直接访问保存在堆内存中的对象,所以要按引用访问(要访问一个对象,首先得到对象在堆内存中的地址,按地址取得对象的值)
3. 复制变量时的不同
基本数据类型:在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的,他们只是拥有相同的value而已。
引用数据类型:在将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,就是说这两个变量都指向了堆内存中的同一个对象,他们中任何一个作出的改变都会反映在另一个身上。
4. 参数传递的不同
基本数据类型:只是把变量里的值传递给参数,之后参数和此变量互不影响
引用数据类型:对象变量里面的值是对象在堆内存中的内存地址!因此它传递的值也是这个内存地址。这也是函数内部对这个参数的修改体现在外部额原因(因为它们指向同一对象)。
三、判断数据类型(4种方法)
1.一般通过 typeof返回对应的数据类型
<script>
var a=null;
var b;
var c="hahah"
var d=2;
var e=true;
var f=function(){
};
var g=[1,2];
var h={
h1:111
};
console.log(typeof(a)); //object
console.log(typeof(b)); //undefined
console.log(typeof(c)); //string
console.log(typeof(d)); //number
console.log(typeof(e)); //boolean
console.log(typeof(f)); //function
console.log(typeof(g)); //object
console.log(typeof(h)); //object
</script>
typeof还可用来判断一个变量是否存在,if(typeof a!=“undefined”)。
局限:对于array、null和对象,typeof一律返回object。
对此可以通过JS的 instanceof来区分对象的子类型。
2.instanceof判断一个变量 是否是一个对象的实例。返回true或false
原理就是测试构造函数的 prototype 是否出现在被检测对象的原型链上
var a=[];
console.log(a instanceof Array) //返回true
但instanceof仍无法判断一个值属于数组还是对象
3.constructor返回对象相对应的构造函数
null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断
4.Object.prototype.toString()
判定 JavaScript 中数据类型的终极解决方法
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply
来调用才能返回正确的类型信息。
过程:先是获取对象的类名;再输出形式如 [object,class] 的字符串,class 指代的是其检测出的数据类型
<script>
var a=null;
var b;
var c="hahah"
var d=2;
var e=true;
var f=function(){
};
var g=[1,2];
var h={
h1:111
};
var op=Object.prototype.toString;
console.log(op.call(a)); //[object Null]
console.log(op.call(b)); // [object Undefined]
console.log(op.call(c)); //[object String]
console.log(op.call(d)); //[object Number]
console.log(op.call(e)); //[object Boolean]
console.log(op.call(f)); // [object Function]
console.log(op.call(g)); //[object Array]
console.log(op.call(h)); //[object Object]
</script>
四、类型转换
1.转换函数
parseInt()把值转换成整数
parseFloat()把值转换成浮点数
只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。
在判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串。
- parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字;如果不是,该方法将返回NaN,不再继续执行其他操作。但如果该字符是有效数字,该方法将查看位置1处的字符,进行同样的 测试。这一过程将持续到发现非有效数字的字符为止,此时parseInt()将把该字符之前的字符串转换成数字。
parseInt("1234blue"); //returns 1234 因为当它检测到字符串b时,就会停止检测过程
parseInt("0xA"); //returns 10 字符串中包含的数字字面量会被正确转换为数字
parseInt("22.5"); //returns 22
parseInt("blue"); //returns NaN
parseInt()方法还有基模式,可以把二/八/十/十六/其他进制的字符串转换成整数,基有方法的第二个参数指定:
parseInt("10", 2); //returns 2
- parseFloat()方法与parseInt()方法的处理方式相似。不过,对于这个方法来说,第一个出现的小数点是有效字符。如果有两个小数点,第二个小数点将被看作无效的, parseFloat()方法会把这个小数点之前的字符串转换成数字。使用parseFloat()字符串必须以十进制表示浮点数。
parseFloat("1234blue"); //returns 1234.0
parseFloat("0xA"); //returns NaN
parseFloat("22.5"); //returns 22.5
parseFloat("22.34.5"); //returns 22.34
parseFloat("0908"); //returns 908
parseFloat("blue"); //returns NaN
2.强制类型转换
- Boolean(value)——把给定的值转换成Boolean型;
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、0 、NaN、 undefined或null,它将返回false。
Boolean(undefined); //false
Boolean(null); //false - null
Boolean(NaN); //false
Boolean([]); //true
Boolean(""); //false – empty string
Boolean("hi"); //true – non-empty string
Boolean(100); //true – non-zero number
Boolean(0); //false - zero
Boolean(new Object()); //true – object
- Number(value)——把给定的值转换成数字(可以是整数或浮点数);
Number(undefined) //NaN
Number(null) //0
Number(NaN) //NaN
Number([]) //0
Number('') //0
Number(true) //1
Number(false) //0
Number( "5.5 ") //5.5
Number( "56 ") //56
Number( "5.6.7 ") //NaN
Number(new Object()) //NaN
Number(100) //100
Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。
- String(value)——把给定的值转换成字符串。
String()强制类型转换与toString的不同之处是可以将null和undefined也转换成字符串
String(undefined) // 'undefined'
String(null) // 'null'
String(NaN) // 'NaN'
String([]) // ' '
String("") // ' '
String(true) // 'true'
String(1) // '1'
String(-1) // '-1'
String(0) // '0'
String(-0) // '0'
String(Infinity) // 'Infinity'
String(-Infinity) // '-Infinity'
String({}) // '[object Object]'
String([1,[2,3]]) // '1,2,3'
3.隐式类型转换
一元+ -运算符将其操作数转换为Number类型。
+ '3' // 3
- '-3' // 3
4.总结
类型转换可使用:
-
转换函数parseInt()和parseFloat(),前者把值转为整数,后者把
值转为浮点数; -
使用强制类型转换
Boolean(value)——把给定的值转换成Boolean型
Number(value)——把给定的值转换成数字
String(value)——把给定的值转换成字符串 -
隐式类型转换
一元运算符(”+“、”-“)将操作数转为Number类型
五、null和undefined区别
1.null表示一个对象不存在,即没有对象, 它是JavaScript的关键字,可以认为是对象类型,它是一个空对象指针。
- 作为函数的参数,表示该参数不为对象;
- 作为对象原型链的终点;
- 定义一个值为null合理,定义一个值为undefined不合理
2.undefined表示基本类型或对象的值未被定义,即一个变量不含值。undefined 却是javascript才有的,为了区分空指针对象和未初始化的变量
- 变量被声明了还没有赋值,就为undefined;
- 调用函数时应该提供的参数还没有提供,该参数就等于undefined;
- 对象没有赋值的属性,该属性的值就等于undefined;
- 函数没有返回值,默认返回undefined。
3.undefined是访问一个未初始化的变量时返回的值,而null是访问一个尚未存在的对象时所返回的值。
4. null 和 undefined 的值相等,但类型不等:
typeof undefined // undefined
typeof null // object
null === undefined // false
null == undefined // true
- Number转换的值不同,number(null)输出为0,number(undefined)输出NaN
- 相同点:if判断中会被转为false
六、比较规则
- 对象和布尔值
先将对象转换成字符串,再转成数字,直接将布尔值转换成数字
console.log([] == true);//false
先将[]转成字符串'',在转成数字是0,true转成数字是1
- 对象和字符串比较
对象和字符串比较先将对象转成字符串,再比较
console.log([1,2,3] == "1,2,3");//true
- 对象和数字比较
先将对象转成字符串,再转成数字
console.log([1] == 1)//true
- 字符串和数字比较
先将字符串转成数字,再比较
console.log("1" == 1)//true
- 字符串和布尔值比较
将字符串和布尔值都转成数字
console.log("1" == true);//true
- 布尔值和数字
将布尔值转成数字
console.log(true == 1)//true
七、其他
undefined
null
0
-0
NaN
" "
以上这些值在布尔值转换中,会转换成false,但并非说他们和false是一样的:
undefined == true //false
undefined == false //false
undefined == null //true
undefined === null //false
null == false //false
null == true //false
"" == false //true
"" == true //false
0 == false //true
0 == true //false
-0 == false //true
-0 == true //false
NaN == false //false
NaN == true //false
NaN == NaN //false NaN与任何值都不相等,包括它自身