基本类型和引用类型 变量的类型检测 ES5继承
1. 基本类型和引用类型
1.1 变量的类型划分
基本类型(简单类型):
Number String Boolean Undefined Null
基本类型是一些简单直接的数据,存储在内存栈里面
比较时,比较的是值是否相等
基本类型赋值时,将值复制一份给另一个变量,两个变量各自保存自己的值,相互之间不影响
引用类型(复杂类型):
Object Array Function
引用类型是一些比较复杂的数据,存储在内存堆里面,变量中存储的是堆内存的地址
比较时,比较的是内存地址是否相等
引用类型赋值时,将内存地址复制一份给另一个变量,两个变量指向同一个地址,相互之间会影响
1.2 变量的拷贝
基本类型的数据,拷贝时进行值的拷贝
引用类型的数据,拷贝时进行内存地址的拷贝
1.3 参数的传递
基本类型的参数传递,传递的是值
let a = 10;
function show(n) {
n = 20;
console.log(n); //20
}
show(a);
console.log(a); //10
引用类型的参数传递,传递的是内存地址
let b = { name: '张三' }; //0x001
function foo(obj) { //obj=0x001
obj.name = '李四';
console.log(obj);
}
foo(b);
console.log(b); //李四
1.4 浅拷贝和深拷贝【重点】
为什么要进行深拷贝和浅拷贝?
想要得到与目标对象一模一样的新对象,就必须使用深拷贝或浅拷贝
1.4.1 浅拷贝
遍历对象的一层,将数据一个一个拷贝给新对象,关键点:只遍历一层
//遍历方式,批量拷贝数据到一个新对象
let obj2 = {};
for (let key in obj1) {
obj2[key] = obj1[key];
}
//合并方式,将对象合并形成一个新对象
let obj3 = Object.assign({}, obj1);
console.log(obj3);
1.4.2 深拷贝
将对象的所有子数据都遍历一次,一层一层拷贝,也可以使用JSON的转换实现
let obj3 = JSON.parse(JSON.stringify(obj1));
2. 变量类型检测
2.1 typeof
typeof 变量名;
注意:基本类型可以正常检测,引用类型就检测不出来
2.2 instanceof
对象 instanceof 类;
注意:用于检测对象是不是属于某个类
2.3 Array.isArray()
Array.isArray(arr)
注意:专用于判断是不是数组
2.4 Object.prototype.toString.call() 【重点】
问:为什么要强制调用Object原型上的toString()方法?
答:由于大部分的类型都有toString()方法,无法通过原型链找到Object的toString() 方法,所以需要强制使用
console.log( Object.prototype.toString.call(10) );
console.log( Object.prototype.toString.call('hello') );
console.log( Object.prototype.toString.call(true) );
console.log( Object.prototype.toString.call(undefined) );
console.log( Object.prototype.toString.call(null) );
3. 继承
3.1 什么是继承?
子类实例化出来的对象拥有父类的所有属性和方法,子类实例化出来的对象属于父类
3.2 原型链继承
//定义父类
function User(username, password) {
this.username = username;
this.password = password;
}
User.prototype.login = function () {
console.log(this.username + '登陆成功');
}
//定义子类
function Student(sno, ...arr) {
this.sno = sno;
//第1句:在子类构造函数中调用父类构造函数,让子类实例化出来的对象拥有父类的属性
User.apply(this, arr);
}
//第2句:让子类的原型成为父类的实例,让子类实例化出来的对象拥有父类的方法
Student.prototype = new User();
//第3句:找回丢失的构造函数
Student.prototype.constructor = Student;
3.3 寄生组合式继承
//第2句:让子类的原型成为父类原型的实例,让子类实例化出来的对象拥有父类的方法
Student.prototype = Object.create(User.prototype);
推荐阅读:
扫描二维码,在手机上阅读