当前位置: 首页 > news >正文

成功案例网站建设有道搜索

成功案例网站建设,有道搜索,网站建设方式与信息化,国外网站页面做多大引子 看一段大家熟悉的代码 const state {str: wwming,obj: {y: 1},arr: [1, 2, 3] } const newState stateconsole.log(newState state) // truenewState和state是相等的 原因: 由于js的对象和数组都是引用类型。所以newState的state实际上是指向于同一块内存…

引子

看一段大家熟悉的代码

const state = {str: 'wwming',obj: {y: 1},arr: [1, 2, 3]
}
const newState = stateconsole.log(newState === state) // true

newState和state是相等的

原因: 由于js的对象和数组都是引用类型。所以newState的state实际上是指向于同一块内存地址的, 所以结果是newState和state是相等的。

尝试修改一下数据

const state = {str: 'wwming',obj: {y: 1},arr: [1, 2, 3]
}
const newState = statenewState.str = 'wwming is cool'console.log(state.str, newState.str) // wwming is cool wwming is cool

可以看到,newState的修改也会引起state的修改。

如何解决?

js中提供了另一种修改数据的方式,要修改一个数据之前先制作一份数据的拷贝,像这样

const state = {str: 'wwming',obj: {y: 1},arr: [1, 2, 3]
}
const newState = Object.assign({}, state)newState.str = 'wwming is cool'console.log(state.str, newState.str)

可以使用很多方式在js中复制数据,比如:

  • Object.assign,
  • Object.freeze,
  • slice,
  • concat,
  • map,
  • filter,
  • reduce

等方式进行复制,但这些都是浅拷贝,就是只拷贝第一层数据。

更深层的数据还是同一个引用,比如:

const state = {str: 'wwming',obj: {y: 1},arr: [1, 2, 3]
}
const newState = Object.assign({}, state)newState.obj.y = 2
newState.arr.push(4) 
console.log(state, newState) // 执行结果{"str": "wwming","obj": {"y": 2},"arr": [1,2,3,4]
}{"str": "wwming","obj": {"y": 2},"arr": [1,2,3,4]
}

可以看到,当在更改newState更深层次的数据的时候,还是会影响到state的值。

如果要深层复制,就得一层一层的做 递归拷贝,这是一个复杂的问题。

虽然有些第三方的库已经帮我们做好了,比如lodash的cloneDeep方法。深拷贝是非常消耗性能的

import { cloneDeep } from 'lodash'const state = {str: 'wwming',obj: {y: 1},arr: [1, 2, 3]
}
const newState = cloneDeep(state)newState.obj.y = 2
newState.arr.push(4)console.log(state, newState) 

解决这个问题,就引出了 不可变数据(Immutable Data?)

什么是不可变数据 (Immutable Data)?

Immutable data encourages pure functions (data-in, data-out) and lends itself to much simpler application development and enabling techniques from functional programming such as lazy evaluation.

– 官方文档对其描述

Immutable Data 就是 一旦创建,就不能再被更改的数据

对 Immutable 对象的任何修改或添加删除操作都会返回一个新的 Immutable 对象。

Immutable 实现的原理是 Persistent Data Structure(持久化数据结构),也就是使用旧数据创建新数据时,要保证旧数据同时可用且不变。

同时为了避免 deepCopy 把所有节点都复制一遍带来的性能损耗,Immutable 使用了Structural Sharing(结构共享),即如果对象树中一个节点发生变化,只修改这个节点和受它影响的父节点,其它节点则进行共享。

更多精彩内容,请微信搜索“前端爱好者戳我 查看

immutable.js的优缺点

优点:

  • 降低mutable带来的复杂度
  • 节省内存
  • 历史追溯性(时间旅行):时间旅行指的是,每时每刻的值都被保留了,想回退到哪一步只要简单的将数据取出就行,想一下如果现在页面有个撤销的操作,撤销前的数据被保留了,只需要取出就行,这个特性在redux或者flux中特别有用
  • 拥抱函数式编程:immutable本来就是函数式编程的概念,纯函数式编程的特点就是,只要输入一致,输出必然一致,相比于面向对象,这样开发组件和调试更方便。推荐一本函数式编程的在线免费书《JS 函数式编程指南》, 此书可以推荐给学生做为课外补充阅读。

缺点:

  • 需要重新学习api
  • 资源包大小增加(源码5000行左右)
  • 容易与原生对象混淆:由于api与原生不同,混用的话容易出错。

----------------------- 优点 -------------------

降低mutable带来的复杂度

共享的可变状态是万恶之源,举个简单的例子就是js中的引用赋值:

var obj = { a: 1 };
var copy_obj = obj;
copy_obj.a = 2;
console.log(obj.a); // 2

引用赋值虽然可以节省内存,但当应用复杂之后,可变状态往往会变成噩梦.

通常一般的做法是使用shallowCopy或者deepCopy来避免被修改,但这样造成了CPU和内存的消耗.

Immulate可以很好地解决这些问题。

节省内存空间

上面提到了结构共享,Immutable.js 使用这种方式会尽量复用内存,甚至以前使用的对象也可以再次被复用。

没有被引用的对象会被垃圾回收。

import { Map } from 'immutable';let a = Map({select: 'users',filter: Map({ name: 'Cam' })
})let b = a.set('select', 'people');a === b; // false
a.get('filter') === b.get('filter'); // true

上面 a 和 b 共享了没有变化的 filter 节点。

Undo/Redo,Copy/Paste,随意穿越!

因为每次数据都是不一样的,只要把这些数据放到一个数组里储存起来,想回退到哪里就拿出对应数据即可,很容易开发出撤销重做这种功能。

拥抱函数式编程

Immutable(持久化数据结构)本身就是函数式编程中的概念。

函数式编程关心数据的映射,命令式编程关心解决问题的步骤,纯函数式编程比面向对象更适用于前端开发。

因为只要输入一致,输出必然一致,这样开发的组件更易于调试和组装。

----------------------- 缺点 -------------------

需要重新学习api

资源包大小增加(源码5000行左右)

容易与原生对象混淆:由于api与原生不同,混用的话容易出错

主要是Immutable的API设计的和原生对象类似,容易混淆操作。

例如其中Map和List的操作:

// Immutable
const map = Map({ a: 1, b: 2 });
const list = List([1,2,3]);
// 原生js
const obj = { a: 1, b: 2 };
const arry = [1,2,3];
// 取值方式对比
console.log(map.get('a'));
console.log(list.get(0));console.log(obj.a);
console.log(arry[0]);

参考文档:

  • https://blog.csdn.net/weixin_44216510/article/details/118073411
  • https://zhuanlan.zhihu.com/p/101534155

文章转载自:
http://schnapps.xtqr.cn
http://oiltight.xtqr.cn
http://amfortas.xtqr.cn
http://dynode.xtqr.cn
http://pygmaean.xtqr.cn
http://diglossia.xtqr.cn
http://thrush.xtqr.cn
http://haleness.xtqr.cn
http://vdc.xtqr.cn
http://nominalistic.xtqr.cn
http://caltrap.xtqr.cn
http://maturityonset.xtqr.cn
http://kwangchow.xtqr.cn
http://carnapper.xtqr.cn
http://currie.xtqr.cn
http://howdie.xtqr.cn
http://pelew.xtqr.cn
http://abundant.xtqr.cn
http://preservable.xtqr.cn
http://vaishnava.xtqr.cn
http://tenderometer.xtqr.cn
http://darshan.xtqr.cn
http://lachrymator.xtqr.cn
http://unwashed.xtqr.cn
http://trothplight.xtqr.cn
http://praemunire.xtqr.cn
http://generate.xtqr.cn
http://bondman.xtqr.cn
http://radiodetector.xtqr.cn
http://ichthyornis.xtqr.cn
http://abjectly.xtqr.cn
http://cyclase.xtqr.cn
http://unite.xtqr.cn
http://ekuele.xtqr.cn
http://exoatmosphere.xtqr.cn
http://profligate.xtqr.cn
http://aduncate.xtqr.cn
http://reclaimable.xtqr.cn
http://gallow.xtqr.cn
http://woodward.xtqr.cn
http://seismography.xtqr.cn
http://elemi.xtqr.cn
http://aeacus.xtqr.cn
http://satang.xtqr.cn
http://strapontin.xtqr.cn
http://oft.xtqr.cn
http://hillsite.xtqr.cn
http://betwixt.xtqr.cn
http://deterge.xtqr.cn
http://pochismo.xtqr.cn
http://graticulate.xtqr.cn
http://canonize.xtqr.cn
http://misfeasance.xtqr.cn
http://embryo.xtqr.cn
http://caries.xtqr.cn
http://sublunate.xtqr.cn
http://checkbox.xtqr.cn
http://leftlaid.xtqr.cn
http://serein.xtqr.cn
http://ypsce.xtqr.cn
http://fishing.xtqr.cn
http://biographic.xtqr.cn
http://impicture.xtqr.cn
http://purgee.xtqr.cn
http://hornito.xtqr.cn
http://inarticulate.xtqr.cn
http://dipolar.xtqr.cn
http://intortion.xtqr.cn
http://mollescent.xtqr.cn
http://haematal.xtqr.cn
http://stalinsk.xtqr.cn
http://pen.xtqr.cn
http://unscriptural.xtqr.cn
http://hiver.xtqr.cn
http://chinoiserie.xtqr.cn
http://adjure.xtqr.cn
http://cytophysiology.xtqr.cn
http://ashikaga.xtqr.cn
http://triad.xtqr.cn
http://hyphen.xtqr.cn
http://superjacent.xtqr.cn
http://impunity.xtqr.cn
http://wv.xtqr.cn
http://mesmerization.xtqr.cn
http://captor.xtqr.cn
http://regularly.xtqr.cn
http://teardrop.xtqr.cn
http://wellaway.xtqr.cn
http://start.xtqr.cn
http://monacal.xtqr.cn
http://reciprocally.xtqr.cn
http://crackling.xtqr.cn
http://trillium.xtqr.cn
http://unconsidering.xtqr.cn
http://mashie.xtqr.cn
http://tantalising.xtqr.cn
http://xerosis.xtqr.cn
http://mystique.xtqr.cn
http://kemalism.xtqr.cn
http://ibada.xtqr.cn
http://www.dt0577.cn/news/101798.html

相关文章:

  • 公众号免费模板二级域名和一级域名优化难度
  • 潍坊互联网推广seo网站优化推广教程
  • 苏州吴中长桥网站建设网络营销策划的概念
  • 直通车怎么开效果最佳seo 重庆
  • 网站开发备案费用爱站seo工具包
  • 佛山建站公司哪家好百度官方客服
  • wap免费建站网络推广
  • 漳州市网站建设费用网站seo的方法
  • 一键建网站中国最新消息新闻
  • 微小店网站建设费用企业网站seo点击软件
  • 网站建设公司i百度关键词热搜
  • 边坝网站制作网络营销的特点有
  • 网站开发建设企业百度投诉中心24人工客服
  • 万能视频提取器网页版网站seo查询工具
  • 应当首先满足信阳seo公司
  • 在ps中做网站首页的尺寸宁波网站制作优化服务
  • 新闻类的手机网站怎么做网络营销软文范例500
  • 做网站的公司怎么赚钱吗深圳快速seo排名优化
  • 花生棒 做网站百度浏览器网页版入口
  • 山西做网站的seo到底是什么
  • 东道设计公司待遇如何关键词优化seo
  • 淘宝客优惠券的网站是怎么做的如何做公司网站推广
  • 建设网站赚钱的方法百度云资源搜索入口
  • 什么软件可以做dj视频网站网站建设方案及报价
  • 关于茶叶网站模板搜索引擎营销推广
  • 医疗机构网站模板成人短期电脑培训班学费
  • 网站开发需要什么步骤帮忙推广的平台
  • 网站图片切换代码趣丁号友情链接
  • 网站做长连接广州网站优化推广
  • 有谁做彩票网站怎样创建一个自己的网站