对象数组

VUE深度监听一个对象数组

ぃ、小莉子 提交于 2020-02-27 14:36:25
项目开发中需要监听Vue 组件data中的一个数组的变化:studentList 使用 watch 直接监听数组 studentList的变化,没有效果,原因是: 由于 JavaScript 的限制,Vue 不能检测以下变动的数组: 当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue 当你修改数组的长度时,例如:vm.items.length = newLength 解决:使用 deep 属性设置深度监听 watch 的 API 里面,有一个属性: deep ,使用它就可以对数组等嵌套对象进行深度监听。 watch: { items: { handler (val, oldVal) { this.val = val this.oldVal = oldVal this.difference = _.differenceWith(val, oldVal, (i, k) => JSON.stringify(i) === JSON.stringify(k)) this.lastUpdateTime = new Date().toISOString() }, // 这里是关键,代表递归监听 items 的变化 deep: true }, } 深度监听是能够响应数组里面的元素每一次的变化,但旧的值并没有被记录。原因在 官网文档 也有指明。 注意

唯心主义蠢货的[vue学习] Vue数据的监听原理

让人想犯罪 __ 提交于 2020-02-27 10:43:30
Vue数据的监听 如何监听 vue2.0 Object.defineProperty() 只能对属性进行数据劫持,不能对整个对象进行劫持,同理无法对数组进行劫持,但是我们在使用 Vue 框架中都知道,Vue通过遍历属性或者数组的项进行观察,实现数据劫持,我们查看相关代码如下: /** * Observe a list of Array items. */ observeArray (items: Array<any>) { for (let i = 0, l = items.length; i < l; i++) { observe(items[i]) // observe 功能为监测数据的变化 } } /** * 对属性进行递归遍历 */ let childOb = !shallow && observe(val) // observe 功能为监测数据的变化 缺点: 无法监听数组根据index对于元素的赋值 // 因为数组是在实例化过程中遍历数组进行observe的 ,如果这样赋值就相当于把index的指向变成了一个新的位置,但是这个位置的对象是没有进行observe的 vm . todos [ 0 ] = { name : 'New name' , description : 'New description' } ; 需要深度遍历,浪费内存 // 对象深度遍历 vue3.0

Java高频面试题

谁说胖子不能爱 提交于 2020-02-27 10:20:35
前言 疫情确诊的人数每天都在增加,离去的人也在增多,这个世界上有很多事我们无能为力也无从选择,日升日落,白昼黑夜,我们能看见白昼中的光芒,我们也能看见黑暗里的流氓。暮色四合,龌龊八开。鲜花还是塑料花,香或臭,当潮水散去,现在即历史,而历史通常是由后人说的。 所以还是上次跟乡亲们说的,我们不要传播未经证实或者不该传播的消息,舆论的力量是我们无法估计的,有些也是我们无法承担的,所以乡亲们也要重视起来,点到即止。无法控制别人,但可以做好自己,帮不了别人,但可以不祸害别人。 我不是个喜欢蹭热度的人,上面那段话乡亲们看看就好,现阶段最重要的就是老老实实待在家里,不聚集,也尽量不出门,自己和家人都要做好安全防护,老百姓经历了太多风风雨雨,相信这次一定也会安然无恙的渡过此劫。那待在家里的这段时间,如果能远程办公的,就做好公司交代的事,无法办公的乡亲们也不要停止学习,因为疫情过去之后,一定会有巨大的变动或者机会来临,而到那时,你准备好了吗? 这几天一直在想,码之初能做点什么?最终决定在这个期间就推出一个面试系列,都是经过我精心整理的,希望能给乡亲们一点帮助。下面进入正题。 高频面试题 1、说说对象的四中引用? 1) 强引用 只要引用存在,垃圾回收器永远不会回收。 Object obj = new Object(); User user=new User(); 可直接通过obj取得对应的对象 如

对象数组中的indexOf方法?

岁酱吖の 提交于 2020-02-27 01:57:31
获取包含对象的数组的索引的最佳方法是什么? 想象一下这种情况: var hello = { hello: 'world', foo: 'bar' }; var qaz = { hello: 'stevie', foo: 'baz' } var myArray = []; myArray.push(hello,qaz); 现在,我想拥有 indexOf 对象,该对象的 hello 属性为 'stevie' ,在本示例中为 1 。 我是JavaScript的新手,我不知道是否有一个简单的方法,或者是否应该构建自己的函数来做到这一点。 #1楼 或原型: Array.prototype.indexOfObject = function arrayObjectIndexOf(property, value) { for (var i = 0, len = this.length; i < len; i++) { if (this[i][property] === value) return i; } return -1; } myArr.indexOfObject("name", "stevie"); #2楼 我认为您可以使用 map 函数在一行中解决它: pos = myArray.map(function(e) { return e.hello; }).indexOf('stevie')

Js apply 和 call 方法 详解

梦想的初衷 提交于 2020-02-27 01:32:41
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家分享.. 如有什么不对的或者说法不明确的地方希望读者多多提一些意见,以便共同提高.. 主要我是要解决一下几个问题: 1. apply和call的区别在哪里 2. 什么情况下用apply,什么情况下用call 3. apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定义,然后用示例来解释这两个方法的意思和如何去用. apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. Function.apply(obj,args)方法能接收两个参数 obj:这个对象将代替Function类里this对象 args:这个是数组,它将作为参数传给Function(args-->arguments) call:和apply的意思一样,只不过是参数列表不一样. Function.call(obj,[param1[,param2[,…[,paramN]]]]) obj:这个对象将代替Function类里this对象 params:这个是一个参数列表 1. apply示例: <script type="text/javascript"> /

C++笔记(3):一些C++的基础知识点

99封情书 提交于 2020-02-26 23:05:08
前言: 找工作需要,最近看了下一些C++的基本概念,为范磊的 《零起点学通C++》,以下是一些笔记。 内容:   delete p;只是删除指针p指向内存区,并不是删除指针p,所以p还是可以用的。删除空指针所指向内存是可以的。   堆中的变量和对象时匿名的,没有名称,只能通过指针来访问。   在堆中创建对象时,在分配内存的同时会调用类的构造函数,在删除堆中对象时,会调用类的析构函数。   为了避免内存泄露,在删除一个指针后应该将其其值赋为0。   常量指针是指针指向的内存区域地址不能改变,但是该内存地址里保存的值是可以改变的,比如int a; int * const p = &a;   指向常量的指针表示指针指向的对象是不能被修改的,但是该指针可以被修改,即该指针可以指向另一块目标内存地址。比如const int a = 0; const int *p = &a; 如果A是一个类,也可以为const A* p = new A;   而指向常量的常指针表示指针本身不能被修改,其指向的内存地址内容也不能被修改。比如const int a = 0; const int * const p = &a;   引用就是别名常量。   堆中的地址是用指针来操作的,用不到别名。   如果在main函数前面的其它函数的声明和定义是一起的,则表明这个函数是内联函数!因此当该函数较长时

手撕ArrayList底层,透彻分析源码

蓝咒 提交于 2020-02-26 22:31:47
ArrayList概述 Hello大家好,今天就来介绍一下ArrayList,说到ArrayList,很多人都知道它的底层是使用数组实现的,线程不安全的,说到它的特点,都会说查找快,增删慢,因为面试题大家都是这么背过来的。今天就来说说它的底层源码吧。 ArrayList更准确的说是动态数组去实现的,这里使用动态两字,是为了能够充分体现它的特点。 再者就是ArrayList不是线程安全的,所以效率比较高,但是否这个是绝对的呢?答案是否定的 。 ArrayList底层源码 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ private static final long serialVersionUID = 8683452581122892189L; private static final int DEFAULT_CAPACITY = 10; private static final Object[] EMPTY_ELEMENTDATA = {}; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

Hashmap 扩容

谁说我不能喝 提交于 2020-02-26 14:42:17
一、hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,hashmap也不例外。Hashmap实际上是一个数组和链表的结合体(在数据结构中,一般称之为“链表散列“),请看下图(横排表示数组,纵排表示数组元素【实际上是一个链表】)。 从图中我们可以看到一个hashmap就是一个数组结构,当新建一个hashmap的时候,就会初始化一个数组。我们来看看java代码: Java代码 /** * The table, resized as necessary. Length MUST Always be a power of two. * FIXME 这里需要注意这句话,至于原因后面会讲到 */ ransient Entry[] table; static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; final int hash; Entry<K,V> next; .......... } 上面的Entry就是数组中的元素,它持有一个指向下一个元素的引用,这就构成了链表。 当我们往hashmap中put元素的时候

02-Foundation-NSMutableString、NSNumber、NSValue、NSDate、NSArray

雨燕双飞 提交于 2020-02-26 13:26:34
目录: 一、NSMutableString可变字符串 二、NSNumber数字对象 三、NSValue 四、NSDate日期对象 五、NSArray数组对象 回到顶部 一、NSMutableString可变字符串 常用的操作就是crud增删改查 1 NSString只能做增查cr操作 2 NSMutableString 可以做改删ud操作 3 可以改变字符串内容的功能,是NSString的子类 4 可变字符串的操作 1 //1 字符串的初始化stringWithString 2 3 NSMutableString* str3 = [NSMutableString stringWithString:@"abc"]; 4 5 NSLog(@"str3:%@",str3); 6 7 //2 修改字符串的内容 8 9 //在指定位置添加新的字符串insertString 10 11 [str3 insertString:@"123" atIndex:1];//在1下标这个位置插入123 12 13 NSLog(@"str3:%@",str3);//a123bc 14 15 //替换指定位置的字符串 16 17 NSRange range = {1,3};//1代表修改位置 3代表修改长度 18 19 [str3 replaceCharactersInRange:range

100+经典Java面试题及答案解析

情到浓时终转凉″ 提交于 2020-02-26 09:59:53
面向对象编程(OOP) Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性。 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。下面的章节我们会逐个分析这些特性。 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下面对象赋予了不同的访问权限。 下面列出了使用封装的一些好处: 通过隐藏对象的属性来保护对象内部的状态。 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。 禁止对象之间的不良交互提高模块化。 参考这个文档获取更多关于封装的细节和示例。 多态 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。 继承 继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。 抽象 抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类