javascript有多少数据类型
首先在javascript中,变量不但有数据类型之别,还有引用类型和值类型之分,
| 数据类型 | 引用/值类型 |
|---|---|
| undefined | 值类型 |
| boolean | 值类型 |
| string | 值类型 |
| number | 值类型 |
| function | 引用类型 |
| object | 引用类型 |
1、undefined 定义undefined类型变量
var exp;
console.log(exp); //undefined
判断变量为undefined
console.log(typeof exp); //undefined
2、布尔值(boolean) 定义boolean型变量
var a = true;
console.log(a); //true
判断变量是boolean
用typeof可以吗?
var exp1 = false;
var exp2 = 0;
var exp3 = 'hello world!';
var exp4 = null;
var exp5 = undefined;
console.log(typeof exp1); //boolean
console.log(typeof exp2); //number
console.log(typeof exp3); //string
console.log(typeof exp4); //object
console.log(typeof exp5); //undefined
所以判断boolean可以用typeof。
那么可以用!来判断吗?通过上文null的判断,我们知道如果是同时判断false、0、null、undefined时 才可以用!来判断 否则不可以。
3、字符串(string) 定义string类型变量
var exp = 'hello world!';
判断变量是string
用typeof可以吗?
var exp1 = 'hello world!';
var exp2 = 0;
var exp3 = false;
var exp4 = null;
var exp5 = undefined;
console.log(typeof exp1); //string
console.log(typeof exp2); //number
console.log(typeof exp3); //boolean
console.log(typeof exp4); //object
console.log(typeof exp5); //undefined
所以判断string可以用typeof。
4、数值(number) 定义number类型变量
var exp = 123456;
判断变量是number
用typeof可以吗?
var exp1 = 123456;
var exp2 = 1/0;
console.log(typeof exp1); //number
console.log(typeof exp2); //number
通过上例发现 typeof NaN也是number,看来可以用typeof 来判断非NaN的数值,这种情况使用时要特别注意。
NaN,即非数值(Not a Number)是一个特殊的值,这个数值表示本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。
5、对象(Object) 定义object类型变量
方法一:
var obj1 = new Object();
方法二:
var obj2 = {};
方法三:
var A = function(){};
var obj3 = new A();
判断变量是object
通过上文null类型的判断可知 typeof 不能用于object变量的判断;那么我们可以总结出以下方法
var obj1 = {};
var obj2 = null;
var judge = function(p){
if(typeof p == 'object' && p!=null){
console.log('is object');
}else{
console.log('not object');
}
}
console.log(judge(obj1)); //is object
console.log(judge(obj2)); //not object
6、函数(function) 定义函数
function functionname(){
}
7、对象(object) 创建对象
var obj = new Object();
我们单独说一下null
定义null类型变量
var exp = null;
console.log(exp); //null
console.log(typeof exp); //object
注:从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值会返回“object”的原因实际上。undefined值是派生自null值的,因此ECMA-262规定对他们的相等测试要返回true:
console.log(null == undefined); //true
console.log(null === undefined); //false 但是类型不同 要注意
尽管undefined和null两者存在这样的关系,但它们的用途是完全不同的。 我们在任何情况下都没有必要为一个变量设值为undefined;但这对null却不适用。那么null这种类型该怎么用呢?因为null值表示的是一个空对象的指针,为了体现这一点,如果一个变量最终是要保存一个对象时,在它没有真正保存对象之前,就应该显式的设置为null。这样也有助于区分undefined和null。
判断变量为null
通过上文我们知道 不能够通过typeof来判断null值。
那么==或===可不可以呢?
var exp1 = null;
var exp2 = undefined;
console.log(exp1 == null); //true
console.log(exp2 == null); //true
console.log(exp1 === null); //true
console.log(exp2 === null); //false
通过上例我们知道,如果同时判断null和undefined可以用==,如果单独判断null就只能用===了
如果用!可不可以呢
var exp1 = null;
var exp2 = false;
var exp3 = undefined;
var exp4 = 0;
var exp5 = 'hello world!';
console.log(!exp1); //true
console.log(!exp2); //true
console.log(!exp3); //true
console.log(!exp4); //true
console.log(!exp5); //false
通过上例知道 如果同时判断null、false、undefined、0时,可以用!来判断,
否则的话不可以。
所以总结以上各种情况 有两种判断null的方法
方法一:
var exp = null;
if(!exp && typeof exp !='undefined' && exp!=0){
console.log('exp is null');
}
方法二:
var exp = null;
if(exp === null){
console.log('exp is null');
}
####小结 除了以上各种判断类型的方法,其实还有一种比较通用的方法 Object.prototype.toString.call(变量);
Object.prototype.toString.call(undefined); //[object Undefined]
Object.prototype.toString.call(true); //[object Boolean]
Object.prototype.toString.call('hello world!'); //[object String]
Object.prototype.toString.call(123); //[object Number]
Object.prototype.toString.call(function(){}); //[object Function]
Object.prototype.toString.call({}); //[object Object]
至于为什么这么用,在后面的讲解继承的章节再仔细说这一部分。