«

基本类型和引用类型 变量的类型检测 ES5继承

yang 发布于 阅读:381 JS高阶阶段


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);

基本类型和引用类型 变量的类型检测 ES5继承

版权所有:微4e
文章标题:基本类型和引用类型 变量的类型检测 ES5继承
除非注明,文章均为 微4e 原创,请勿用于任何商业用途,禁止转载

推荐阅读:


扫描二维码,在手机上阅读
请先 登录 再评论