判断数据类型

数据类型

js有六种数据类型,包含五种根本数据类型,和一种简单数据类型

根本数据类型(值类型):Number,String,Boolean,Null,undefined。

简单数据类型:Object

援用类型:Object,Array,Function,Date,RegExp

值类型和援用类型的区别

1、存储地位不一样
值类型占用空间固定,保留在栈中,保留与复制的是值自身,能够应用 typeOf()检测值的类型.
援用类型占用空间不固定,保留在堆中,保留与复制的是指向对象的一个指针,须要应用 instanceof() 检测数据类型,应用 new() 办法结构出的对象是援用型.

2、复制形式不一样
值类型的变量间接赋值就是深复制,如 var a = 10; var b = a;那么a的值就复制给b了,b批改值不会影响a,两份数据在内存中是齐全独立的。
援用类型的变量间接赋值实际上是传递援用,只是浅复制.是将变量中的存储的地址赋值一份独自存储,然而两个变量中批改其中一个对象,另外一个援用来拜访的时候,也会拜访到批改后的值。

3、值类型无奈增加属性和办法,援用类型能够增加属性和办法。

4、值类型的比拟是值的比拟,只有当它们的值相等的时候它们才相等。援用类型的比拟是援用地址的比拟
比拟的时候留神双等号在做比拟的时候做了类型转换,而全等号是值和类型相等是能力相等.

5、在函数中的应用

// 值类型var  num = 10;function print(num) {  num = 100;  console.log(num);  // 100}console.log(num);   // 10// 援用类型var obj = {    name: 'jone'}function printObj(obj) {    obj.name = 'lucy';    console.log(JSON.stringify(obj));  // {"name":"lucy"}}console.log(JSON.stringify(obj));  // {"name":"lucy"}

值类型变量在函数中被批改时只在函数作用域外部失效,当函数被销毁时此次批改立刻生效;而援用类型在函数中被批改时批改的是运行时数据区中的值,即便函数被销毁,变量的值仍旧被扭转。

判断数据类型办法

1、typeof

typeof null 返回类型谬误,返回object

援用类型,除了function返回function类型外,其余均返回object。

null 有属于本人的数据类型 Null , 援用类型中的 数组、日期、正则 也都有属于本人的具体类型,而 typeof 对于这些类型的解决,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是咱们想要的后果。

typeof Array, Object, new Class() 都会返回'object', 所以应用typeof不能精确的判断变量是否为objecttypeof [];  //objecttypeof {};  //objecttypeof new (function (){});  //objecttypeof 1;  //numbertypeof '1';  //stringtypeof null;  //objecttypeof true;  //boolean

2、constructor

constructor是原型prototype的一个属性,当函数被定义时候,js引擎会为函数增加原型prototype,并且这个prototype中constructor属性指向函数援用, 因而重写prototype会失落原来的constructor。

不过这种办法有问题:

1:null 和 undefined 无constructor,这种办法判断不了。

2:还有,如果自定义对象,开发者重写prototype之后,原有的constructor会失落,因而,为了标准开发,在重写对象原型时个别都须要从新给 constructor 赋值,以保障对象实例的类型不被篡改。

({}).constructor === Object;  //true(1).constructor === Number;  //true([]).constructor === Array;  //true('1').constructor === String;  //true(true).constructor === Boolean;  //truenew Function().constructor == Function //true

3.、instanceof

instanceof是指该对象是否为指定类的实例

instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里须要特地留神的是:instanceof 检测的是原型

由上图能够看出[]的原型指向Array.prototype,间接指向Object.prototype, 因而 [] instanceof Array 返回true, [] instanceof Object 也返回true。

instanceof 只能用来判断两个对象是否属于实例关系**, 而不能判断一个对象实例具体属于哪种类型。

({}) instanceof Object;  //true([]) instanceof Array;   //true(1) instanceof Number;  //true('1') instanceof String;  //true(true) instanceof Boolean;  //true

4、toString

toString() 是 Object 的原型办法,调用该办法,默认返回以后对象的 [[Class]] 。这是一个外部属性,其格局为 [object Xxx] ,其中 Xxx 就是对象的类型。

对于 Object 对象,间接调用 toString() 就能返回 [object Object] 。而对于其余对象,则须要通过 call / apply 来调用能力返回正确的类型信息

Object.prototype.toString.call('') ;   // [object String]Object.prototype.toString.call(1) ;    // [object Number]Object.prototype.toString.call(true) ; // [object Boolean]Object.prototype.toString.call(Symbol()); //[object Symbol]Object.prototype.toString.call(undefined) ; // [object Undefined]Object.prototype.toString.call(null) ; // [object Null]Object.prototype.toString.call(new Function()) ; // [object Function]Object.prototype.toString.call(new Date()) ; // [object Date]Object.prototype.toString.call([]) ; // [object Array]Object.prototype.toString.call(new RegExp()) ; // [object RegExp]Object.prototype.toString.call(new Error()) ; // [object Error]Object.prototype.toString.call(document) ; // [object HTMLDocument]Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的援用