[关闭]
@JunQiu 2018-09-18T10:19:04.000000Z 字数 2493 阅读 1152

js_引用/值传递,遍历(对象/其它),枚举性、组合模式

summary_2018/07 language_js designPattern


1、日常工作

1.1、js:引用/值传递、对象遍历、枚举性
1.2、designPattern:组合模式
1.3、完成账号集群account-service版本迁移和mock测试

2、技术学习

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