前端面试总结1.2

js核心

1、对象

  • 概念:一切的事物都可以使用一个对象概括出来(浏览器DOM对象等)
    ①、对象是单个事物的抽象。
    ②、对象是一个容器,封装了属性(property)和方法(method)。
    ③、是过程式代码的一种高度封装,目的在于提高代码的开发效率和可维 护性。
  • 对象特征
    ①、封装(代码的高度封装,重复代码抽离出来形成对象,构建构造函数(工厂函数)形成特定的描述对象)
    ②、继承(只有封装,复用度不高,孩子没法使用,还得重新创建,所以出现继承,原型链继承、属性继承)
    ③、多态
  • 对象的常用API
  • 对象的深度克隆
  • 对象的遍历
  • JS对象有三种不同的属性:数据属性,访问器属性和内部属性
// 1、数据属性:即为普通的对象属性
var obj = {
    prop: 123
};
console.log(obj.prop); // 123
console.log(obj["prop"]); // 123
//2、访问器属性,每个对象值都可设置监听对象数据值变化
var obj = {
  props: 123,
  get prop () {
    return this.props;
  },
  set prop (value) {
    console.log('Setter: ' + value);
  }
}
> obj.prop
 123
> obj.prop = 456;
  Setter: 456
//3、内部属性
//一些属性只是用于规范,这些属于“内部”的内部,因为它们不能直接访问,但是它们确实影响对象的行为。
//内部属性有特殊的名称都写在两个方括号[[Prototype]],[[Extensible]]

//(1)、内部属性[[Prototype]]指向对象的原型。
// 它可以通过Object.getPrototypeOf()读取。它的值只能通过object.create()或__proto__来设置 。

//(3)、内部属性[[Extensible]]决定是否可以向对象添加属性。
// 可以通过Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。

2、数组

js 数组不是典型的数组,实际上还是对象,只不过key值是下标值来(1,2…),且每一个数组在创建后自带length属性,且该属性会自动更新。JS的数组是用key和value来模拟的

  • 数组常用的API
  • 数组的去重
  • 数值的深度克隆与浅克隆

3、函数式编程与对象编程

1、对象式编程

  • 有人指出对象的缺点

     复用性和模块化并没有使编程简单化。
     
     如 npm 把模块划分的太细了,安装一个包,可能还有好多其他的依赖包,只是我们表面上没有使用到
     过分强调模型,而忽略了计算和算法。(每个对象注重分工,优化的算法就可能被抛弃)
    
  • 面向对象的核心就是对象与对象之间交互。

     每个对象维护自己的状态和相对应的生命周期
     每个对象都是独立
     对象和对象直接通过消息传递来工作
    

2、函数编程

// 纯函数
const add = (one, two) => { return one + two }
// 非纯函数
let two = 1 // 此状态可以随时被改变,
const add = (one) => { return one + two }
  • 纯函数,不存在副作用,明确输出结果,

  • 更加强调程序执行的结果而非执行的过程。 函数式更关心执行结果,计算过程交给计算机。过程式则相反。

  • 不可变数据,数据即代码,代码即数据,引用也更加透明

  • 非纯函数,通过闭包等方式,函数式编程也能存在自己的状态,达到维护自己的生命周期,着重讲解下:

  • 闭包和高阶函数

     闭包理解 函数内部还有其他函数,内部函数使用了外部函数的作用域,可以使父函数数据状态得以保存;
     
     高阶函数理解 执行一个函数,返回一个新的函数;
    
// 利用封包实现一个只能调用一次的 map 高阶函数
const oneMap = (fn) => {
  let once = false
  return (arr) => { 
  	return once ? 
  		null : 
  		(arr.map(fn), once = true) 
  }
}
const fn = (item) => item + 1;
const arrMap = oneMap(fn);
// 第一次调用
arrMap([1, 2, 3]) // [2, 3, 4]
// 第二次调用状态变为true,不执行map
arrMap([4, 5, 6]) // null
  1. 函数柯里化

    简单点就是普通函数的改造;
    
    把接受多个参数的函数变换成接受一个单一参数,并且返回接受余下的参数而且返回结果的新函数;
    
// 求和函数
function sum(a, b, c) {
	return a + b + c
}

function curryingSum(a) {
    return function (b) {
    	return function (c)
        return a + b + c
    }
}

sum(1, 2)           // 3
curryingSum(1)(2)   // 3
// 此处由于代码逻辑简单,当代码逻辑足够复杂时,每个函数处理单独的业务,可维护性大大增加
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值