一、类VS对象
面向对象的语言有一个标志就是它们都有类的概念,通过类可以创建任意多个具有相同属性和方法的对象。
尽管JS在技术上讲是面向对象的语言,但是它不具备传统的面向对象语言所支持的类和接口等基本结构,也就是说js中没有类的概念,但是js中有引用类型,引用类型描述的是一类对象所具有的属性和方法,也是一种数据结构,用于将数据和功能组织在一起;所以从它的逻辑上看,等价于其他程序设计语言中的“类”。
1.1 java中的类与对象
类:类是一个模板,它描述一类对象的行为和状态,是一个抽象的概念。
对象:对象是类的一个实例,是客观存在的事物。
java中类的特点:
- 类是对象的类型
- 类是具有相同属性和方法的一组对象的集合(一个类对应多个对象)
java中对象的属性:
对象的属性:对象具备的各种特征,每个对象的每个属性都具有特定的值。
对象的方法:就是对象执行的操作,也就是说对象能干什么?
一个类可以包含以下类型变量:
- 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
- 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
- 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。
通俗易懂的白话说:比如你打算吃火锅,
“富含蛋白质,富含铁元素的肉,能煮,能炒,能煲。。。”列举的这些条件就是一个类
满足这些条件的“肥牛卷”就是一个对象
1.2 js中的引用类型和对象
引用类型与类看起来相似,但他们并不是相同的概念,还是应该区分来看的。
引用类型:也可以被称之为对象定义,描述的是一类对象所具有的属性和方法。
js中有5个常用的引用类型:Object类型、Array类型、Date类型、RegExp类型、Function类型。
1.2.1 引用类型
在js中,引用类型常常基本数据类型一起区分学习。
本节引自:https://www.cnblogs.com/focusxxxxy/p/6390536.html
1.2.1.1 定义:
基本数据类型:undefined,boolean,number,string,null
基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值。
1.2.1.2 特点:
基本数据类型的特点:
-
基本类型的值是不可变的
var name = 'jozo'; name.toUpperCase(); // 输出 'JOZO' console.log(name); // 输出 'jozo' //解释:会发现原始的name并未发生改变,而是调用了toUpperCase()方法后返回的是一个新的字符串。 var person = 'jozo'; person.age = 22; person.method = function(){//...}; console.log(person.age); // undefined console.log(person.method); // undefined //解释:通过上面代码可知,我们不能给基本类型添加属性和方法,再次说明基本类型时不可变得;
-
基本类型之间的比较是值的比较
//只有在它们的值相等的时候它们才相等。 var a = 1; var b = true; console.log(a == b);//true //解释:用==比较两个不同类型的变量时会进行一些类型转换。像上面的比较先会把true转换为数字1再和数字1进行比较,结果就是true了。 这是当比较的两个值的类型不同的时候==运算符会进行类型转换,但是当两个值的类型相同的时候,即使是==也相当于是===。 var a = 'jozo'; var b = 'jozo'; console.log(a === b);//true
-
基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
var name = 'jozo'; var city = 'guangzhou'; var age = 22;
那么它的存储结构如下图,栈区包括了变量的标识符和变量的值:
引用类型的特点:
-
引用类型的值是可变的
//可为为引用类型添加属性和方法,也可以删除其属性和方法,如: var person = {};//创建个控对象 --引用类型 person.name = 'jozo'; person.age = 22; person.sayName = function(){console.log(person.name);} person.sayName();// 'jozo' delete person.name; //删除person对象的name属性 person.sayName(); // undefined
-
引用类型的值是同时保存在栈内存和堆内存中的对象
//javascript和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,那我们操作啥呢? 实际上,是操作对象的引用, 所以引用类型的值是按引用访问的。 准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针, 也可以说是该对象在堆内存的地址。 var person1 = {name:'jozo'}; var person2 = {name:'xiaom'}; var person3 = {name:'xiaoq'};
这三个对象的在内存中保存的情况如下图:
1558850090500.png -
引用类型的比较是引用的比较
//基本数据类型的比较 var person1 = '{}'; var person2 = '{}'; console.log(person1 == person2); // true //引用类型的比较 var person1 = {}; var person2 = {}; console.log(person1 == person2); // false //解释:引用类型时按引用访问的,换句话说就是比较两个对象的堆内存中的地址是否相同,那很明显,person1和person2在堆内存中地址是不同的
1.2.1.3 赋值
基本类型赋值:
在从一个变量向另一个变量赋值基本类型时,会在该变量上创建一个新值,然后再把该值复制到为新变量分配的位置上:
1558852006940.pngvar a = 10; var b = a; a ++ ; console.log(a); // 11 console.log(b); // 10 //解释:此时,a中保存的值为 10 ,当使用 a 来初始化 b 时,b 中保存的值也为10,但b中的10与a中的是完全独立的,该值只是a中的值的一个副本,基本类型在赋值操作后,这两个变量可以参加任何操作而相互不受影响。
引用类型赋值:
当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面讲引用类型的时候提到,保存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,两个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响:
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
1558852326516.png
因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
1.2.2 对象
对象:某个特定引用类型的实例。可以使用instanceof 运算符来查看该对象是哪一个类型的实例。
新对象可以在引用类型的基础上使用new操作符后跟一个构造函数来创建。构造函数本身是一个函数,只不过是出于创建新对象的目的而定义的。
常用对象包括Object 对象、Boolean 对象、Number 对象、String 对象。
举个例子,创建Object实例有两种方式,一是使用new操作符后跟Object构造函数
var person = new Object();
二是使用对象字面量表示法。更推荐这个!
var person = {
name : "Amy"
age :29
}
网友评论