首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否还在疑惑Vue.js中组件data为什么是函数类型不是对象类型

分析Vue.js组件中data为何是函数类型而非对象类型 引言 正文 一、Vue.js中data使用 二、data为对象类型 三、data为函数 结束语 引言 要理解本篇文章,必须具备JavaScript...我们先来了解一下什么是组件化思想,我们一般会在一个页面创建Vue实例,并以该页面作为主文件,然后将其他页面作为该文件子文件(组件),如图 ?...这是因为这两个实例对象在创建时,是先获得了一个函数,将该函数返回值作为了自己属性data值,并且这两个实例对象中data值在栈中对应堆中地址也不一样,所以他们不会互相影响。...因为我们刚开始定义了构造函数Vue时,给他内部data设置了一个值,该值为对象类型,对象类型在js中称为引用数据类型,在栈中是存储着一个指向内存中该对象堆中地址。...此时情况用图这样表示: ? 结束语 所以讲了那么多,还是一个概念,引用数据类型表现形式,如果还是小伙伴不懂,一定要翻到引言部分,点击链接去看一下这个概念,否则很难理解本篇文章。

3.4K30

7000 字说清楚 HashMap,面试点都在里面了

前面介绍关键概念时候提到了 Node类型,里面有个属性叫做 next,它就是为了这种链表设计,如下图所示。... node3.next = null,则说明这是链表尾巴。...当新元素准备插入到链表时候,采用是尾插法,不是头插法了,JDK 1.7 版本采用是头插法,但是头插法个问题,就是在两个线程执行 resize() 扩容时候,很可能造成环形链表,导致 get...使用红黑树是出于性能方面的考虑,红黑树查找速度要优于链表。那为什么不是一开始就直接生成红黑树,而是链表长度大于 8 之后才升级成树呢?...单节点类型: 直接将当前桶元素替换为被删除 node.next ,其实就是 null。 链表类型: 如果是链表类型,就将被删除 node 前一个节点 next 属性设置为 node.next

78520
您找到你想要的搜索结果了吗?
是的
没有找到

C#理解泛型(译)

C# 是一个类型安全语言,类型安全允许编译器(可信赖地)捕获潜在错误,不是在程序运行时才发现(不可信赖地,往往发生在你将产品出售了以后!)。...这个类还包括一个方法,Append,这个方法接受一个Node类型参数,我们将把传递进来Node添加到列表中最后位置。这过程是这样:首先检测当前Nodenext字段,看它是不是null。...如果当前Nodenext字段不是null,说明当前node不是链表最后一个node。...通过使用T作为未知类型next字段(下一个结点引用)必须被声明为T类型Node(意思是说接受一个T类型泛型化Node)。...LinkedList 类现在接受一个 T类型Node不是一个简单Node作为头结点。

43930

耗时3天写完HashMap万字解析,争取一篇文章讲透它,面试官看了都直点头!

这里其实有一个很细小知识点,在很多Java面试时被提及,就是 为什么采用位运算不是直接进行取余操作(符号:%)。...首先,我们先来解释一下为什么需要进行这一步操作,在上面我们提到哈希值其实是一个int类型,4字节,范围从-2147483648 到 2147483648,这里足足有40亿个映射空间,经过右移和异或操作后...这显然是不现实,而又因为HashMap初始数组长度位16,所以要进行一定操作,让最终结果值在0~15之间。 那么好!现在又有个问题:为什么要用与运算,不是%呢?...,如果当前数组长度小于 64,那么会选择先进行数组扩容,不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。...loTail.next = e; // 如果低位链表已经结点,将该元素加入低位链表尾部 loTail = e; // 更新低位链表尾结点

9000

Redis源码解析——双向链表

但是作为一个可以承载各种类型数据链表,还需要链表使用者提供一些处理节点中数据能力。因为这些数据可能是用户自定义,所以像复制、删除、对比等操作都需要用户来告诉框架。...unsigned long len; } list;         至于链表结构中为什么要存链表长度字段len,我觉得从必要性上来说是没有必要。...len字段一个优点是不用每次计算链表长度时都要做一次遍历操作,缺点便是导出需要维护这个变量。 创建和释放链表         链表创建过程比较简单。...,创建链表时没有设定链表类型——没有设置复制、释放、对比等方法指针。...头部和尾部新增都很简单,只是需要考虑一下新增之前链表不是

55520

数据结构【第二篇】线性表之链表实现与讲解

——单链表链表基本结构 这种链表为什么被称作单链表呢?...,也可以作为监视哨,或用于存放线性表长度等附加信息 指针域中存放首元结点地址 首元结点:存储第一个元素节点 为什么要附设一个头结点 我们来解释一下: 链表如果为空情况下,如果单链表没有头结点,那么头指针就会指向...,增加了分支,代码不够简洁 总结:头结点存在使得空链表与非空链表处理一致,也方便对链表首元结点前结点插入或删除操作 单链表类型定义 线性表抽象数据类型定义 我们在给出单链表定义之前我们还是需要先引入我们线性表抽象数据类型定义...} }; //单链表头指针 Node *head; //单链表尾指针 Node *tail; //单链表的当前长度 int curLength...尾插法创建单链表 看完了头插法,但是感觉这样顺序与我们一贯思维总是一点别扭,尾插法则是一种,逻辑顺序与我们一致创建方法 还是看一下图 ?

50800

Linux内核10-list_head和hlist_head理解

1 概述 在Linux内核中,对于数据管理,提供了2种类型双向链表:一种是使用list_head结构体构成环形双向链表;另一种是使用hlist_head和hlist_node2个结构体构成具有表头链型双向链表...而在(b)图中,next类似,指向下一个hlist_node结构地址,pprev指向前一个hlist_nodenext指针。这是为什么呢?我们将在第3章中讨论。...内核为什么设计这么2个双向链表呢?使用它们什么好处?它们使用场景分别是什么呢?...了这个指针,我们就可以访问其任何成员了。 2.8 遍历链表 list_for_each遍历一个链表。...pprev指向前一个节点next指针. 现在疑问来了:为什么pprev不是prev也就是一个指针,用于简单指向list前一个指针呢?

2.5K20

Java数据结构和算法(七)——链表

前面博客我们在讲解数组中,知道数组作为数据存储结构一定缺陷。...链表也是一种使用广泛通用数据结构,它也可以用来作为实现栈、队列等数据结构基础,基本上除非需要频繁通过下标来随机访问各个数据,否则很多使用数组地方都可以用链表来代替。   ...插入一个节点,对于单向链表,我们只提供在链表头插入,只需要将当前插入节点设置为头节点,next指向原头节点即可。删除一个节点,我们将该节点上一个节点next指向该节点下一个节点。 ?   ...数据类型允许操作是它本身不可分离部分,理解类型包括理解什么样操作可以应用在该类型上。   那么当年设计计算机语言的人,为什么会考虑到数据类型?   ...每个节点对象通常包含数据部分data,以及对上一个节点引用prev和下一个节点引用next,只有下一个节点引用称为单向链表,两个都有的称为双向链表

1.4K81

HashMap JDK 1.8 深入学习笔录

table数组长度永远为2幂次方 总所周知,HashMap数组长度永远为2幂次方(指的是table数组大小),那你想过为什么吗?...如果不对它减1直接操作,将得到答案10000,即16。显然不是结果。减1后二进制为111,再进行操作则会得到原来数值1000,即8。通过一系列位运算大大提高效率。...因为当table数组容量比较小时,键值对节点 hash 碰撞率可能会比较高,进而导致链表长度较长。这个时候应该优先扩容,不是立马树化。...,若是则返回该节点 若不是则判断节点类型,如果是红黑树的话,则调用红黑树方法去查找元素 如果是链表类型,则遍历链表调用equals方法去查找元素 HashMap查找是非常快,要查找一个元素首先得知道...这就解释了为什么遍历和插入顺序不一致,不懂同学请看下图: equasl和hashcode 我在面试中就被问到过HashMapkey什么限制吗?

6410

面试再问 HashMap,求你把这篇文章发给他!

table数组长度永远为2幂次方 总所周知,HashMap数组长度永远为2幂次方(指的是table数组大小),那你想过为什么吗?...如果不对它减1直接操作,将得到答案10000,即16。显然不是结果。减1后二进制为111,再进行操作则会得到原来数值1000,即8。通过一系列位运算大大提高效率。...因为当table数组容量比较小时,键值对节点 hash 碰撞率可能会比较高,进而导致链表长度较长。这个时候应该优先扩容,不是立马树化。...,若是则返回该节点 若不是则判断节点类型,如果是红黑树的话,则调用红黑树方法去查找元素 如果是链表类型,则遍历链表调用equals方法去查找元素 HashMap查找是非常快,要查找一个元素首先得知道...这就解释了为什么遍历和插入顺序不一致,不懂同学请看下图: ? equasl和hashcode 我在面试中就被问到过HashMapkey什么限制吗?

26310

【数据结构】实现字典API:有序数组和无序链表

有序数组 无序链表 (二叉树实现方案将在下一篇文章介绍) 【注意】 为了让代码尽可能简单, 我将字典Key和Value值也设置为int类型不是对象, 所以在下面代码中, 处理“操作失败”情况时候...,是返回 -1 不是返回 null 。...所以代码默认不能选择 -1作为 Key或者Value (在实际场景中,我们会将int类型Key替换为实现Compare接口对象,同时将“失败”时返回值从-1设为null,这时是没有这个问题)...“静态查找表” 若在查找过程中同时还进行了3,4操作, 这样查找表被称为“动态查找表” 有序数组实现字典 有序数组实现字典思路 字典,最关键两个类型值: Key和Value。...节点对象三个实例变量:  key,value和next,  key和value分别用来存储字典键和值, next用于建立节点和节点间引用联系。

1.2K50

面试再问HashMap,求你把这篇文章发给他!

table 数组长度永远为 2 幂次方 总所周知,HashMap 数组长度永远为 2 幂次方(指的是 table 数组大小),那你想过为什么吗?...如果不对它减1直接操作,将得到答案 10000,即 16。显然不是结果。减 1 后二进制为 111,再进行操作则会得到原来数值 1000,即 8。通过一系列位运算大大提高效率。...接着需要判断如果不是第一次初始化,那么扩容之后,要重新计算键值对位置,并把它们移动到合适位置上去,如果节点是红黑树类型的话则需要进行红黑树拆分。...因为当 table 数组容量比较小时,键值对节点 hash 碰撞率可能会比较高,进而导致链表长度较长。这个时候应该优先扩容,不是立马树化。...,int 32 位,右移 16 位就能让低 16 位和高 16 位进行异或,也是为了增加 hash 值随机性。

41520

算法题就像搭乐高:手把手带你拆解 LRU 算法

首先,我们把双链表节点类写出来,为了简化,key 和 val 都认为是 int 类型: class Node { public int key, val; public Node next...Node 类型构建一个双链表,实现几个 LRU 算法必须 API: class DoubleList { // 头尾虚节点 private Node head, tail;...删除一个节点不光要得到该节点本身指针,也需要操作其前驱节点指针,双向链表才能支持直接查找前驱,保证操作时间复杂度 O(1)。...了双向链表实现,我们只需要在 LRU 算法中把它和哈希表结合起来即可,先搭出代码框架: class LRUCache { // key -> Node(key, val) private...(deletedKey); } 这里就能回答之前问答题「为什么要在链表中同时存储 key 和 val,不是只存储 val」,注意 removeLeastRecently 函数中,我们需要用 deletedNode

49720

数据结构和算法之链表 | 链表介绍(难度级别:简单)

与数组一样,链表是一种线性数据结构。与数组不同,链表元素不存储在连续位置;元素使用指针链接。 为什么使用链表? 数组可用于存储类似类型线性数据,但数组以下限制。...在 Java 或 C# 中,LinkedList 可以表示为一个类,一个 Node 可以表示为一个单独类。LinkedList 类包含一个 Node类型引用。...第一个简单链表 1.C //一个链表节点 struct Node { int data; struct Node* next; }; 2.C++ class Node { public: int...默认为 null) Node head; class Node { int data; Node next; // 创建新节点构造函数 Node(int d) { data = d...我们指向这三个块指针作为头部, 第二个和第三个 head second third | | | | | | +---+-----+ +----+--

52121

解密list底层奥秘

一、list底层框架 list底层是一个带头双向循环链表. (1) 节点类 因为list中节点可能存储各种类型值,所以这里使用了一个模板参数T....//存储数据 }; (2) 迭代器类 很多小伙伴会疑问,为什么一个迭代器类却使用了三个模板参数,是不是有些多余呢?...Ref operator*() { return _node->_val;//获取该结点数据 } (2) -> 上面链表数据是简单类型int Ptr operator->().../ 在pos位置前插入值为val节点 iterator insert(iterator pos, const T& val) { //pos.node 不是pos->node..._size); } 结语 看完这篇文章,相信大家对list了更加深层理解,对于list迭代器,它并不像前面的string和vector那种原生指针,而是封装成了类,使得链表迭代器也可以执行++

15620

集合系列 Map(十二):HashMap

Node 类型数组。...这个 Node 节点可能是链表节点,也可能是红黑树节点。说到 Node 节点,我们必要详细说说 Node 节点类关系图。...如果此时,oldThr > 0,表示设置了初始值 // 那么将初始值 oldThr 作为容量大小。...这时候我们两种选择,一种是扩容,让哈希碰撞率低一些。另一种是树化,提高查询效率。 如果我们采用扩容,那么我们需要做就是做一次链表数据复制。如果我们采用树化,那么我们需要将链表转化成红黑树。...这个时候我们许多树化红黑树,在扩容之时,我们需要将许多红黑树拆分成链表,这是一个挺大成本。如果我们在容量小时候就进行扩容,那么需要树化链表就越少,我们扩容成本也就越低。

44241

LRU缓存

首先,我们把双链表节点类写出来,为了简化,key 和 val 都认为是 int 类型: class Node {     public int key, val;     public Node next...// 删除链表 x 节点(x 一定存在)     // 由于是双链表且给是目标 Node 节点,时间 O(1)     public void remove(Node x) {         x.prev.next...int size() { return size; } } 到这里就能回答刚才「为什么必须要用双向链表问题了,因为我们需要删除操作。...了双向链表实现,我们只需要在 LRU 算法中把它和哈希表结合起来即可,先搭出代码框架: class LRUCache {     // key -> Node(key, val)     private...(deletedKey); } 这里就能回答之前问答题「为什么要在链表中同时存储 key 和 val,不是只存储 val」,注意 removeLeastRecently 函数中,我们需要用 deletedNode

13920

【C++】STL——list深度剖析 及 模拟实现

那我们接下来思考一个问题:算法库里面不是已经sort了吗,为什么链表自己还要提供一个sort? 最主要原因是算法库里排序list就用不了。 我们发现报了一堆错怎么,回事呢?...是不是不行啊,因为双向既要支持++还要支持- -,单向是不是只能++啊: 但是我们传随机可以吗? 是不是可以啊,因为随机是支持++和- -。...是不是不需要啊,因为它不需要去释放里面指针指向结点空间。 那为什么不需要释放啊? ,它里面虽然结点指针,但是它指向结点属于谁,是不是属于list啊,那结点释放应该是谁事情?...const迭代器 假如现在我们要写一个打印链表函数: 然后我们调用该函数: 发现报错了,为什么,是不是又是权限放大问题啊? 怎么解决?...->_next; return *this; } self operator++(int) { self tmp(*this); _node = _node->_next;

15710

HashMap自问自答

,没错,数据载体,是数组,并且数组类型Node,节点意思 //真正存放key value地方 transient Node[] table; Node代表是类型,[]代表是数组,K...,相当于乘2 为什么容量都是2倍数 核心还是为了性能,在读跟取时候,经常需要根据keyhash值,快速定位到数组对应position,当数组长度是2倍数时候,就可以用位运算快速计算出来...,不代表找到node就是我们要node,因为不同key,可能hash值是相同,所以引申了下面的问题 碰到hash冲突怎么办 hashmap两种处理冲突方式,一是用链表来存储,存储时候,...也是新建一个node,跟当前node组成链表,不断冲突,就不断往这个链表后面添加 //一个无限循环,由内部条件控制退出循环 for (int binCount = 0; ; ++binCount...,不过看上面代码也知道,当链表比较长时候,就不适合采用链表来存储,会被转成红黑树来存储; 从性能角度考虑,链表只能从头开始往后检索,算法时间复杂度是O(n),红黑树时间复杂度是O(log n),

24120
领券