前言:javaScript数据类型分为基本数据类型和引用数据类型
基本数据类型:Number,String,Boolean,Null,Undefined,symbol(ES6)
引用数据类型主要是function,Array等
基本数据类型
- 值不可变
在对基本数据类型的操作后,基本数据类型的值仍然没有改变。这里涉及到了一个叫做包装类的问题,前面文章里有 - 存放在栈区
- 值的比较
var a =1;
var b= true;
console.log(a==b)//true
console.log(a===b)//false
这里是因为两个等号只是进行数据的比较,三个等号需要进行数据类型的比较
上面的东西都很基础,不详细说
引用数据类型
- 值可变
- 同时存储在栈区和堆区,地址存放在栈区,也就是指针,内容存放在堆区
- 比较是引用的比较
var My = {
age:1
}
var you = My;
console.log(you.age);//1共用一段堆内存,栈地址不同*/
you.age = 10;
console.log(My.age); //10
you进行复制时在栈区创建了一个新的地址,但是仍然指向a的堆区,共用同一段堆内存,这时如果改变其中一个对象都会互相影响。但是,取消某一变量对于原对象的引用不会影响到另一个变量
var a = {age:20};
var b = a;
a = 1;
b//{age:20}
原来a和b指向同一个引用,然后使a的值变为1,也就是取消了对原对象的引用,这时不会对b产生影响
重点:
检测数据类型
1.typeof
typeof返回一个表示数据类型的字符串,包括number,string,boolean,object,undefined,symbol,function等
var a = 10;
console.log(typeof(a));//number
这里对于null与array有一定的问题
typeof null //object
typeof [] //object
typeof {} //object
数组和对象返回的都是object,因此无法区分,这时就需要用到instanceof
4. instanceof
instanceof运算符返回一个布尔值,表示对象是否为某个构造函数的实例,instanceof运算符的左边是实例对象,右边是构造函数。它会检查右边构建函数的原型对象(prototype),是否在左边对象的原型链上.
var d = new Date();
d instanceof Date // true
d instanceof Object // true
因为instanceof检测的是整个原型链,因此可能会返回多个true
instanceof的原理是检查右边构造函数的prototype属性,是否在左边对象的原型链上。有一种特殊情况,就是左边对象的原型链上,只有null对象。这时,instanceof判断会失真
var a = function(){
return 123;
}
a.prototype = null;
console.log(a instanceof Object);
console.log(typeof(a));
但是,只要一个对象的原型不是null,一般的判断是没有问题的
但是instanceof无法判断原始值类型,
var s = 'hello';
s instanceof String // false
上面代码中,字符串不是String对象的实例(因为字符串不是对象),所以返回false。
此外,** 对于undefined和null,instanceOf运算符总是返回false **
还有constructor与Object.prototype.toString.call(),后续补充,另外,附上一张原型链图