js数据类型有哪些?
- 基本数据类型:Number、String、Undefined、Null、Boolean、Symbol ( es6 )
- 引用数据类型:Object(Array、Function、Date、Json)
基本数据类型和引用数据类型的区别?
首先来看这样一段代码
var a = {
data: {
name: 1
}
};
var b = {};
b.data = a.data;
b.data.name = 5;
console.log(a.data.name);
a.data = {name: 9};
console.log(b.data.name);
你能说出输出的是什么吗?
#基本数据类型
- 基本数据类型的值是不可变的
- 基本类型的比较是值的比较,只要它们的值相等就认为他们是相等的
var a = 1;
var b = 1;
console.log(a === b);
- 基本数据类型不可以添加属性和方法
var p = "change";
p.age = 29;
p.method = function(){
console.log(name)
};
console.log(p.age);//undefined
console.log(p.method)//undefined
- 基本数据类型是存放在栈区的:存放在栈内存中的简单数据段,数据大小确定,内存空间大小可以分配,是直接按值存放的,所以可以直接访问;
假如有以下几个基本类型的变量:var name = “jozo”;var city = “guangzhou”;var age = 22;那么它的存储结构如下图:
栈区包括了变量的标识符和变量的值
- 基本数据类型的赋值是简单赋值(传值)
基本数据类型的赋值(=)是在内存中新开辟一段栈内存,然后再把再将值赋
值到新的栈中。例如
var a = 10;
var b = a;
a ++ ;
console.log(a); // 11
console.log(b); // 10
#引用数据类型
- 引用类型的值是可以改变的
var a = [1,2,3];
a[1] = 5;
console.log(a); //[1,5,3]
- 引用类型可以添加属性和方法
var person = {};
person.name = "change";
person.say = function(){
alert("hello");
}
console.log(person.name);//change
console.log(person.say)//function(){alert("hello");
}
- 引用类型的比较是引用的比较,是看其的引用是否指向同一个对象(地址是否相同)
var a = [1,2,3];
var b = [1,2,3];
console.log(a === b); // false
虽然a和b看起来一样,但是他们保存在栈区中的指向堆内存的地址却是不同的,所以两个对象不相等
- 引用类型是同时保存在栈区和堆区中的:变量实际上是一个存放在栈内存的指针,这个指针指向堆内存中的地址。每个空间大小不一样,要根据情况进行特定的分配。
例如有以下几个对象:var person1 = {name:“change1”};var person2 = {name:“change2”}; var person3 = {name:“change3”}; 这三个对象在内存中保存的情况如下图
5. 引用类型的赋值是对象引用(传址)
也就是说引用类型的赋值是对象保存在栈中的地址的赋值,这样的话两个变量就指向同一个对象,因此两者之间操作互相有影响。
var a = {}; // a保存了一个空对象的实例
var b = a; // a和b都指向了这个空对象
a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'
b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22
console.log(a == b);// true
var a = [1,2,3];
var b = a;
b = [11, 12, 13];//b指向了另一个内存地址,与a断开关联
a[0] = 2;
console.log(b[0]) //11,b的值不随a的值改变而改变
看完这些之后你是否能说出上边那段代码的输出?
var a = {
data: {
name: 1
}
};
var b = {};
b.data = a.data;
b.data.name = 5;
console.log(a.data.name); //5
a.data = {name: 9};
console.log(b.data.name); //5