判断数据类型
数据类型
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不能准确的判断变量是否为object
typeof []; //object
typeof {}; //object
typeof new (function (){}); //object
typeof 1; //number
typeof '1'; //string
typeof null; //object
typeof 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; //true
new 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 的引用
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。