js_引用/值传递,遍历(对象/其它),枚举性、组合模式
summary_2018/07
language_js
designPattern
1、日常工作
1.1、js:引用/值传递、对象遍历、枚举性
1.2、designPattern:组合模式
1.3、完成账号集群account-service版本迁移和mock测试
2、技术学习
2.1.1、 Primitives 内存存储
variables |
address(栈) |
string |
<#001> |
2.1.2、reference 内存存储
variables |
values(堆) |
address(栈) |
arr |
<#001> |
#001 |
2.1.3、引用/值传递
## 概述
Javascript has 5 data types that are passed by value: Boolean, null, undefined, String, and Number. We’ll call these primitive types.
Javascript has 3 data types that are passed by reference: Array, Function, and Object. These are all technically Objects, so we’ll refer to them collectively as Objects.
## 原始数据类型的方式采用值传递,我们的重点在于引用数据类型的传递方式??
let arr=[1,2,3]
function f (arr) {
// 传递的是地址,引用传递
arr[3]=4
// 实际上[1,2,3]是一个新的引用,我们改变了局部变量arr的指向,并不是修改了引用对应的值,全局变量arr并未被修改(实际上,我们可以修改对应值,但直接赋值的方式是修改了变量的指向)
arr=[1,2,3]
console.log(arr)
}
f(arr)
console.log(arr)
因此,reference类型采用的是引用传递。
## 比较方式
原始数据类型比较的是值的大小,reference类型比较的是地址。
// 若需要比较两个object的内容是否相同, 转换为字符串
const arr1str = JSON.stringify(arr1);
const arr2str = JSON.stringify(arr2);
console.log(arr1str === arr2str); // true
2.2、js:遍历(对象/其它)
## for...in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。
// 循环只遍历可枚举属性。
// 循环以任意序迭代一个对象的属性。(???最好不依赖于迭代表面的有序性,因此最好不要用于数组,可以使用for...of)
const list=[1,2,3,4,5]
for (let i in list)
console.log(i) // 0 1 2 3 4
## for...of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
const list=[1,2,3,4,5]
for (let i of list)
console.log(i) // 1 2 3 4 5
// for..of 和 for...in 的区别
for...in 语句以原始插入顺序迭代对象的可枚举属性。
for...of 语句遍历可迭代对象定义要迭代的数据。(可迭代对象定义的迭代值,比如数组,即数组中定义的值,不包含arr.a=3)
## for/while/do...while
## forEach() 方法对数组的每个元素执行一次提供的函数。(其它一些对象也具有该方法)
const array = ['a', 'b', 'c']
array.forEach(function (element) {
console.log(element) // a b c
})
- 可枚举属性是指那些内部 “可枚举” 标志设置为 true 的属性(标识值默认为即为 true)
- 内置原型的属性是不可枚举的,如Object, Array, Number等(???这句话应该没问题)
## Example:
Object.defineProperty(obj, 'key', {
enumerable: false,
configurable: false,
});
- 一些方法
- 将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。分为安全模式和透明模式。
- 一个文件系统的例子
## 概述
1、Component抽象构件角色
定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。
2、Leaf叶子构件
Leaf叶子构件叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。
3、Composite树枝构件
树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。组合模式的重点就在树枝构件。
## 安全模式和透明模式
安全模式在抽象组件中只定义一些默认的行为或属性,它是把树枝节点和树叶节点彻底分开;透明模式是把用来组合使用的方法放到抽象类中,不管叶子对象还是树枝对象都有相同的结构,通过判断确认是叶子节点还是树枝节点。
## 应用场景
1、表示对象的部分-整体层次结构。
2、忽略对象组合和单个对象的区别。客户能一致的对待组合结构中的所有对象。
## 优点
1、可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
2、增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
3、提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。
## 缺点
1、在增加新构件时很难对容器中的构件类型进行限制。不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,需要类型检查来实现。
2、对体系结构进行抽象设计,如果体系结构较为复杂,设计较为困难,且节点不一定完全一致。