共计 3148 个字符,预计需要花费 8 分钟才能阅读完成。
判断数据类型
数据类型
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 的援用