Subs

子集生成

我怕爱的太早我们不能终老 提交于 2019-12-01 12:38:00
问题:输出$[0,1,2,3,...n)$的所有子集。 1. 增量构造法:一次选出一个元素放到集合中。由于$A$中的元素个数不确定,每次递归调用都要输出当前集合。另外,递归边界也不需要显示确定——如果无法继续添加元素,自然就不会递归了。 void print_subset(int n, int* A, int cur){ for(int i = 0; i < cur; i++) printf("%d ", A[i]); printf("\n"); int s = cur ? A[cur - 1] + 1 : 0; for(int i = s; i < n; ++i){ A[cur] = i; print_subset(n, A, cur + 1); } } 2. 位向量法:构造一个位向量$B[i]$,而不是直接构造子集$A$本身,其中$B[i]=1$,当且仅当$i$在子集$A$中。 void print_subset1(int n, int* B, int cur){ if(cur == n){ for(int i = 0; i < cur; ++i) if(B[i]) printf("%d ", i); printf("\n"); return; } B[cur] = 1; print_subset1(n, B, cur + 1); B[cur] = 0; print

Vue.js的响应式系统原理

隐身守侯 提交于 2019-11-30 09:40:54
写在前面 Vue.js是一款MVVM框架,核心思想是数据驱动视图,数据模型仅仅是普通的 JavaScript 对象。而当修改它们时,视图会进行更新。实现这些的核心就是“ 响应式系统 ”。 我们在开发过程中可能会存在这样的疑问: Vue.js把哪些对象变成了响应式对象? Vue.js究竟是如何响应式修改数据的? 上面这幅图的下半部分是怎样一个运行流程? 为什么数据有时是延时的(即什么情况下要用到nextTick)? 实现一个简易版的响应式系统 响应式系统核心的代码定义在src/core/observer中: 这部分的代码是非常多的,为了让大家对响应式系统先有一个印象,我在这里先实现一个简易版的响应式系统,麻雀虽小五脏俱全,可以结合开头那张图的下半部分来分析,写上注释方便大家理解。 /** * Dep是数据和Watcher之间的桥梁,主要实现了以下两个功能: * 1.用 addSub 方法可以在目前的 Dep 对象中增加一个 Watcher 的订阅操作; * 2.用 notify 方法通知目前 Dep 对象的 subs 中的所有 Watcher 对象触发更新操作。 */ class Dep { constructor () { // 用来存放Watcher对象的数组 this .subs = []; } addSub (sub) { // 往subs中添加Watcher对象 this

Vue setter/getter 是何原理?

时光总嘲笑我的痴心妄想 提交于 2019-11-29 21:43:24
1 、 defineProperty 重定义对象 JS原生es5版本提供对象重新定义的接口 defineProperty defineProperty 可以修改对象的访问器属性,对象属性值发生变化前后可以触发回调函数。 对象的访问器属性包括 2 种类型:数据描述符、 存取描述符 1.1 数据描述符 value:对象key的值,默认是 空字符串 '' writeable:是否可写,默认 true configurable:true是否可配置,默认 true enumerable:true是否可枚举, 默认 true Object.getOwnPropertyDescriptors(obj); { k:{ configurable: true, enumerable: true, value: 90, writable: true } } 1.2 存取描述符 set:function(){}属性访问器 进行写操作时调用该方法 get:function(){}属性访问器 进行读操作时调用该方法 属性描述符: configurable 、enumerable configurable 、 enumerable 、 set 、 get 对象中新增 key 的value发生变化时会 经过set和get方法 。 var obj = {};var temp = ''; Object

当面试官问你Vue响应式原理,你可以这么回答他

只愿长相守 提交于 2019-11-29 13:50:07
看过vue官方文档的同学,对这张图应该已然相当熟悉了。 vue的响应式是如何实现的? 听过太多回答,通过 Object.defineProperty ,可是再详细的问时,对方浑然不知。 先撸为敬 const Observer = function ( data ) { for ( let key in data) { defineReactive(data, key); } } const defineReactive = function ( obj, key ) { const dep = new Dep(); let val = obj[key]; Object .defineProperty(obj, key, { enumerable : true , configurable : true , get() { console .log( 'in get' ); dep.depend(); return val; }, set(newVal) { if (newVal === val) { return ; } val = newVal; dep.notify(); } }); } const observe = function ( data ) { return new Observer(data); } const Vue = function ( options

简单实现一个VUE的双向绑定

北城余情 提交于 2019-11-29 07:59:41
首先我们来看一些,vue的基本使用方法 new Vue({ el:'#app', data:{ price:27, info:{ title:'猪肉的价格' }, name:23 }, beforeCreate() { // console.log(this.info) }, created(){ // console.log(this.info) }, beforeMount () { // console.log(document.querySelector('#home')) }, mounted(){ // console.log(document.querySelector('#home')) }, render(createElement) { return createElement('div',{ attrs:{ title:this.info.title, id:'home' } },[ createElement('span',{},this.price) ]) } }) 然后我们根据使用方法,来设计一个类和一些基础的声明周期 class Vue { constructor(options) { this.$el = document.querySelector(options.el) // 获取根元素 this.beforeCreate = options

【Vue原理】依赖收集

拈花ヽ惹草 提交于 2019-11-28 11:26:42
写文章不容易,点个赞呗兄弟 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本 【2.5.17】 如果你觉得排版难看,请点击 下面链接 或者 拉到 下面 关注公众号 也可以吧 【Vue原理】依赖收集 - 源码版之基本数据类型 如果对依赖收集完全没有概念的同学,可以先看我这篇 【Vue原理】响应式原理 - 白话版 依赖收集,主要是为了解决一个问题,什么问题呢? 首先,我们都知道,Vue 的数据是响应式更新的,一旦数据改变了,那么相应使用到 数据的地方也会跟着改变。 那么问题来了,数据改变的时候,Vue 怎么知道,去让那些使用到数据的地方也改变呢? 这就是依赖收集要解决的问题! 他是怎么解决的?简单说就是把依赖了数据的地方,给集中收集起来以便变化后通知!我们今天来看源码的流程 首先,响应式更新,分为两步,依赖收集和依赖更新 今天讲的是依赖收集,如何去收集 使用了数据的地方 依赖收集,又分为两个流程 1、数据初始化流程 2、依赖收集流程 当前篇,先以基本数据类型为例讲解,因为 基本数据和 引用数据 在处理上有很大的不同,引用类型需要理解的东西更多更复杂,所以需要循序渐进,分两篇描述 数据初始化流程 首先,在实例初始化的时候,需要对数据进行响应式处理,也就是给每个属性都使用 Object

在微信小程序里使用 watch 和 computed

纵然是瞬间 提交于 2019-11-27 10:13:18
在开发 vue 的时候,我们可以使用 watch 和 computed 很方便的检测数据的变化,从而做出相应的改变,但是在小程序里,只能在数据改变时手动触发 this.setData() ,那么如何给小程序也加上这两个功能呢? 我们知道在 vue 里是通过 Object.defineProperty 来实现数据变化检测的,给该变量的 setter 里注入所有的绑定操作,就可以在该变量变化时带动其它数据的变化。那么是不是可以把这种方法运用在小程序上呢? 实际上,在小程序里实现要比 vue 里简单,应为对于 data 里对象来说,vue 要递归的绑定对象里的每一个变量,使之响应式化。但是在微信小程序里,不管是对于对象还是基本类型,只能通过 this.setData() 来改变,这样我们只需检测 data 里面的 key 值的变化,而不用检测 key 值里面的 key 。 先上测试代码 <view>{{ test.a }}</view> <view>{{ test1 }}</view> <view>{{ test2 }}</view> <view>{{ test3 }}</view> <button bindtap="changeTest">change</button> const { watch, computed } = require('./vuefy.js') Page({

【Vue原理】依赖更新

杀马特。学长 韩版系。学妹 提交于 2019-11-27 07:23:52
写文章不容易,点个赞呗兄弟 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本 【2.5.17】 如果你觉得排版难看,请点击 下面链接 或者 拉到 下面 关注公众号 也可以吧 【Vue原理】依赖更新 - 源码版 如果对依赖收集完全没有概念的同学,可以先看我这篇白话版 响应式原理 - 白话版 我们已经讲过了 依赖收集 【Vue原理】依赖收集 - 源码版之基本数据类型 【Vue原理】依赖收集 - 源码版之引用数据类型 现在就要看依赖更新了哈哈哈,毕竟收集完是要更新的嘛 其实依赖更新挺简单的,就是两步 修改属性值 通知保存的依赖进行更新 重点只需要看 Object.defineProperty 设置的set 函数,当给数据重赋新值的时候,自然会触发 set 函数,完成依赖更新 function defineReactive(obj, key, val) { var dep = new Dep(); var childOb = observe(val); Object.defineProperty(obj, key, { get(){ ... 属性被读取,完成依赖收集 // 返回闭包值 return val }, set(newVal) { // 值没有变化 if (newVal ===val)