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
-
函数柯里化
简单点就是普通函数的改造; 把接受多个参数的函数变换成接受一个单一参数,并且返回接受余下的参数而且返回结果的新函数;
// 求和函数
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
// 此处由于代码逻辑简单,当代码逻辑足够复杂时,每个函数处理单独的业务,可维护性大大增加