一.数据类型
1.原始数据类型:Null,Undefined,Boolean,String,Number
2.引用数据类型:Object,Array,Function
二.面试常考
1.Null和Undefined的区别
Undefined:未定义,表示一个变量不含值,非人为因素
Null:空对象,用来清空变量,人为因素
相同点:
if判断中都将会被转换成false
不同点:
- Number转换的值不同:Number(null)输出为0,Number(Undefined)输出为NaN
- Null表示一个值被定义了,但是为空
作为函数的参数,表示该参数不为对象
作为对象原型链的终点
定义一个值为null是合理的,但是定义一个值为undefined不合理
- Undefined表示缺少值,即应该有值但是还没有被定义
变量声明但是还未赋值
函数没有返回值,默认返回return
调用函数时,应该提供的参数没有提供
对象没有赋值属性,该属性值等于undefined
2.判断数据类型的方法
(1)typeof,返回相对应的数据类型
<script>
var a = null;
var b;
var c = 1;
var d = "abc";
var e = true;
var f = function(){ };
var g = ["1","2"];
var h = { a : 123 };
console.log(typeof(a));//object
console.log(typeof(b));//undefined
console.log(typeof(c));//number
console.log(typeof(d));//string
console.log(typeof(e));//boolean
console.log(typeof(f));//function
console.log(typeof(g));//object
console.log(typeof(h));//object
</script>
null,Array,object --- > object
(2)instanceof,返回true或者false
var f = function(){
};
var g = ["1","2"];
var h = {
a : 123
};
console.log(f instanceof Function);//true
console.log(g instanceof Object);//true
console.log(h instanceof Object);//true
instanceof操作符只能用来判断引用型的数据类型
(3)constructor,返回true或者false
console.log((1).constructor === Number);//true
console.log(("1").constructor === String);//true
console.log((true).constructor === Boolean);//true
//console.log((null).constructor === Null);//报错
//console.log((undefined).constructor === Undefined);//报错
console.log(([]).constructor === Array);//true
console.log((function(){}).constructor === Function);//true
console.log(({}).constructor === Object);//true
(4)Object.prototype.toString.call()
var a = Object.prototype.toString;
console.log(a.call("aaa"));// [object String]
console.log(a.call(1));//[object Number]
console.log(a.call(true));//[object Boolean]
console.log(a.call(null));//[object Null]
console.log(a.call(undefined));//[object Undefined]
console.log(a.call([]));//[object Array]
console.log(a.call({}));//[object Object]
console.log(a.call(function(){}));//[object Function]
3.强制类型转换
(1)字符串类型
- 三种值类型(字符串,数组,布尔值)都具有toString方法,能将自身转化为字符串
<script>
var a = 1;
var b = "123";
var c = true;
var d = [1,2,3];
console.log(a.toString());//1
console.log(b.toString());//123
console.log(c.toString());//true
console.log(d.toString());//[1,2,3]
</script>
- String()强制类型转换与toString的不同之处是可以将null和undefined也转换成字符串
- 隐式转换("+")
双目运算符,只要其中一个是string类型,表达式就是是string类型(拼接)
(2)数字类型
- Number()方法
会将尽可能传入的值转换成数字
console.log(Number(''));//0
console.log(Number('1'));//1
console.log(Number([]));//0
console.log(Number(["1"]));//1
console.log(Number(["1","2"]));//NaN
console.log(Number(function(){console.log(1)}));//NaN
console.log(Number({"a": 1}));//NaN
console.log(Number(null));//0
console.log(Number(undefined));//NaN
console.log(Number(true));//1
console.log(Number(false));//0
console.log(Number('100px'));//NaN
- parseInt()方法
将字符串转换成整数,parseInt(a,10)第二个参数表示十进制,不是字符串会返回NaN
console.log(parseInt("123"));//123
console.log(parseInt("100px"));//100
console.log(parseInt("1.23"));//1
console.log(parseInt(["123"]));//123
console.log(parseInt(123));//123
console.log(parseInt(["a"]));//NaN
console.log(parseInt(["a","b"]));//NaN
console.log(parseInt({"a":1}));//NaN
console.log(parseInt(function(){}));//NaN
- parseFloat()方法
与parseInt一样,但是会保留第一位小数
(3)布尔值类型
Boolean(value)会将值转化成布尔型
4.比较规则
- 对象和布尔值
先将对象转换成字符串,再转成数字,直接将布尔值转换成数字
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