【面试】春招面试总结

一、本地存储 (1次)

  1. Cookies:

    1. 容量4k

    2. 会为请求自动存储cookies数据,方便但浪费流量

    3. 每个站点仅能存储20个

    4. API较原始,需要自动封装

  2. localStorage

    1. 容量5M

    2. 永久存储,除非手动删除

    3. 兼容IE8+,操作方便

  3. sessionStorage

    1. 功能与localStorage相似,但关闭页面后自动清除

    2. 属于会话级别的,不能在同源窗口进行共享

  4. Web SQL

    1. 使用SQL语句进行操作

    2. 已废弃

  5. IndexedDB

    1. 容量>=250M,甚至没有上限

    2. 一种NoSQL数据库,用键值对进行存储,可以进行快速读取操作

二、js数据类型 (2次)

首先,js数据类型分为两大类型:基本类型和引用类型

基本类型包括:Undefined,Null,Boolean,Number,String,symbol,bigint

引用类型包括:

                1、原生对象:Array,Object,Date,function

                2、内置对象:(JS提供的不依赖执行宿主的对象)Math、Global

                3、宿主对象:(JS提供的任何依赖宿主的对象)window 

基本类型和引用类型的区别:

1、基本类型使用栈进行存储,引用类型使用堆进行存储

2、基本数据类型占据空间小且固定,引用数据类型占据空间大不固定 

如何判断数据类型:

typeof:

对于对象、数组、日期的判断均会返回object

  1. typeof(null) => “object”
  2. typeof(数组/正则/日期/对象) => “object”

instanceof: 

console.log(2 instanceof Number);                    // false
console.log(true instanceof Boolean);                // false 
console.log('str' instanceof String);                // false  
console.log([] instanceof Array);                    // true
console.log(function(){} instanceof Function);       // true
console.log({} instanceof Object);                   // true    

利用instancecof可以判断当前实例是否属于该类,但不能用于处理基本数据类型

只要出现在实例的原型链上的类,检测结果都是TRUE(页面中可以手动更改原型链的指向,这样导致检测结果不一定准确)

constructor:

console.log((2).constructor === Number); // true
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true

相对于instanceof来说,constructor可以判断基本数据类型 

检测结果不一定准确,( 和instanceof一样,均可以在其原型链上修改原型指向 )

Object.prototype.toString( ): (最优检测方法)

  1. 其它类的原型上的toString基本上都是转换为字符串的,只有Object原型上的是检测数据类型的返回结果 “[object 所属的类]”
  2. Object.prototype.toString执行,其中的this是谁,就是检测谁的数据类型
  3. Object.prototype.toString.call(xxx)
  4. ({}).toString.call(xxx)

如何判断数组:

方法一:使用Object.prototype.tostring()

function isArray(arg) {
	return Object.prototype.toString.call(arg) === '[object Array]'
}

let arr = [1,2,3]
isArray(arr)  // true

方法二:使用ES6新增语法Array.isArray(arr)

let arr = [1,2,3]
Array.isArray(arr) // true

三、继承

原型链继承:

        通过改造原型链的方式,利用原型链的语法实现继承

1、优点:

  • 实现简单,只需要设置子类的prototype为父类的实例即可;
  • 可以通过子类中的实例直接访问父类原型链中的属性和函数

2、缺点:

  • 子类的所有实例将共享父类,若属性为引用值,子类的实例改变的时候会修改这个属性值,就会影响其他实例的值;
  • 在创建子类实例的时候,无法向父类的构造函数中传递参数;
  • 注意给子类的原型对象上添加属性或者方法时,一定要写在 children.prototype=new Father 后

构造函数继承

        在子类中用apply()、call()的方法,调用父类构造函数实现继承。

1、优点:

  • 在子类的构造中通过call来改变了父类中的this指向,导致父类构造函数中定义的属性或方法都赋值给了子类,生成的每一个子类实例都具有这些属性和方法,且互不影响;
  • 创建子类的时候,可以向父类的构造函数中传递参数。

2、缺点:

  • 只能继承父类中实例的属性和方法,而不能继承父类原型上的属性和方法;
  • 父类的构造函数中添加一个实例方法,其对应的子类也拥有该实例方法,每新创建一个子类,就小有一个父类实例方法,会导致占用内存比较大。

拷贝继承

        先创建父类的实例,通过for...in循环来遍历父类实例中的所有属性和方法,并依次赋值给子类,同时原型上的属性和函数也赋给子类的实例上。

1、优点:

  • 可以实现向父类中的构造方法中传递参数;
  • 能够实现让子类继承父类中的实例属性,实例方法以及原型对象上的属性和方法。

2、缺点:

        父类的所有属性和方法,子类都需要复制拷贝一边,比较消耗内存

组合继承:

        组合继承的核心思想是将构造函数继承和原型链继承两种方式组合起来,共享的属性、方法用原型链继承实现,独享的属性、方法用借用构造函数实现

1、优点:

  • 可以向父类构造函数中传递参数
  • 通过Father.call(this,xxx);这个行代码,可以将父类中的实例属性和方法添加到子类中,另外通过Children.prototype = new Father(); 可以将父类的原型对象上的属性和函数绑定到子类的原型对象上。

2、缺点:

        父类实例属性会绑定两次,一次在子类中call()调用实现绑定,另一次是在改写子类prototype时实现绑定操作,但是通过call()函数完成父类中实例属性和方法的绑定的优先级要高于通过改写子类prototype的方式,即call的调用会覆盖掉prototype的绑定内容。

寄生式组合继承:

        寄生式组合继承和组合继承的区别是:寄生式定义了一个新的空对象,并利用子类的原型指向父类副本的实例从而实现原型共享,解决了组合继承多次绑定的问题。

class实现extends继承:

// 继承关键字 => extends
class Person {
  constructor (name, age) {
    this.name = name
    this.age = age
  }
  jump () {
    console.log('会跳')
  }
}

class Teacher extends Person {
  constructor (name, age, lesson) {
    super(name, age) // extends 中, 必须调用 super(), 会触发执行父类的构造函数
    this.lesson = lesson
    console.log('构造函数执行了')
  }
  sayHello () {
    console.log('会打招呼')
  }
}

let teacher1 = new Teacher('zs', 18, '体育')
console.log(teacher1)

四、(常考)什么是原型链(2-3):

        在javascript中,绝大多数的构造函数,除了一些内建函数以外,都有一个叫做prototype的属性指向他的原型,每当创建一个新的子类实例的时候,这个子类都可以共享这个原型中的属性,例如我们经常使用的hasownproperty和tostring都是在object这个原型对象上的属性。

        每一个对象都有一个__proto__属性指向其构造函数的原型,这个对象就可以利用这个__proto__属性将自己和原型对象连接起来,而同时这个原型对象也有自己的__proto__属性,因此形成了一个链状结构,这就是原型链。当我们去访问一个对象的属性的时候,如果访问不到就会沿着原型链一层一层的寻找下去,最终到达Object.prototype。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言面试八股文是指在春季招聘中常见的C语言相关的面试题目和知识点。下面是一份常见的C语言面试八股文,供您参考: 1. C语言的基本数据类型有哪些? C语言的基本数据类型包括整型、浮点型、字符型和指针型。 2. 请介绍一下C语言中的变量和常量。 变量是用来存储数据的内存位置,可以通过变量名来访问和修改其值。常量是指在程序执行过程中不会改变的值。 3. 什么是数组?请介绍一下C语言中的数组。 数组是一种存储相同类型数据的集合,通过索引来访问数组中的元素。在C语言中,数组的大小在定义时就需要确定,并且数组的下标从0开始。 4. 请介绍一下C语言中的指针。 指针是一个变量,其值为另一个变量的地址。通过指针可以直接访问和修改内存中的数据。使用指针可以提高程序的效率和灵活性。 5. 请介绍一下C语言中的函数。 函数是一段完成特定任务的代码块,可以通过函数名来调用执行。函数可以接收参数并返回一个值,也可以不接收参数或不返回值。 6. 请介绍一下C语言中的流程控制语句。 C语言中的流程控制语句包括条件语句(if-else语句、switch语句)、循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。 7. 请介绍一下C语言中的结构体。 结构体是一种自定义的数据类型,可以包含多个不同类型的成员变量。通过结构体可以将多个相关的数据组织在一起。 8. 请介绍一下C语言中的文件操作。 C语言中的文件操作主要包括打开文件、读写文件和关闭文件。可以使用标准库函数来进行文件操作,如fopen、fread、fwrite、fclose等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值