位置: 编程技术 - 正文

深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解(深入理解新发展理念,推进供给侧结构性改革)

编辑:rootadmin

推荐整理分享深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解(深入理解新发展理念,推进供给侧结构性改革),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:深入理解中国式现代化,深入理解javascript特性.pdf,深入理解新发展理念,推进供给侧结构性改革 心得体会,深入理解javascript,深入理解javascript特性,深入理解计算机系统,深入理解javascript,深入理解javascript,内容如对您有帮助,希望把文章链接给更多的朋友!

介绍

本章,我们将讲解在ECMAScript向函数function传递参数的策略。

计算机科学里对这种策略一般称为“evaluation strategy”(大叔注:有的人说翻译成求值策略,有的人翻译成赋值策略,通看下面的内容,我觉得称为赋值策略更为恰当,anyway,标题还是写成大家容易理解的求值策略吧),例如在编程语言为求值或者计算表达式设置规则。向函数传递参数的策略是一个特殊的case。

of value),函数内部改变参数的值不会影响到外面的对象(该参数在外面的值),一般来说,是重新分配了新内存(我们不关注分配内存是怎么实现的——也是是栈也许是动态内存分配),该新内存块的值是外部对象的拷贝,并且它的值是用到函数内部的。但是,如果该函数的参数不是原始值而是复杂的结构对象是时候,将带来很大的性能问题,C++就有这个问题,将结构作为值传进函数的时候——就是完整的拷贝。

我们来给一个一般的例子,用下面的赋值策略来检验一下,想想一下一个函数接受2个参数,第1个参数是对象的值,第2个是个布尔型的标记,用来标记是否完全修改传入的对象(给对象重新赋值),还是只修改该对象的一些属性。

按引用传递

另外一个众所周知的按引用传递接收的不是值拷贝,而是对象的隐式引用,如该对象在外部的直接引用地址。函数内部对参数的任何改变都是影响该对象在函数外部的值,因为两者引用的是同一个对象,也就是说:这时候参数就相当于外部对象的一个别名。

伪代码:该策略可以更有效地传递复杂对象,例如带有大批量属性的大结构对象。

按共享传递(Call by sharing)上面2个策略大家都是知道的,但这里要讲的一个策略可能大家不太了解(其实是学术上的策略)。但是,我们很快就会看到这正是它在ECMAScript中的参数传递战略中起着关键作用的策略。

这个策略还有一些代名词:“按对象传递”或“按对象共享传递”。

该策略是年由Barbara Liskov为CLU编程语言提出的。

该策略的要点是:函数接收的是对象对于的拷贝(副本),该引用拷贝和形参以及其值相关联。

这里出现的引用,我们不能称之为“按引用传递”,因为函数接收的参数不是直接的对象别名,而是该引用地址的拷贝。

最重要的区别就是:函数内部给参数重新赋新值不会影响到外部的对象(和上例按引用传递的case),但是因为该参数是一个地址拷贝,所以在外面访问和里面访问的都是同一个对象(例如外部的该对象不是想按值传递一样完全的拷贝),改变该参数对象的属性值将会影响到外部的对象。这个处理的假设前提是大多数语言里用到的对象,而不是原始值。

按共享传递是按值传递的特例

按共享传递这个策略很很多语言里都使用了:Java, ECMAScript, Python, Ruby, Visual Basic等。此外,Python社区已经使用了这个术语,至于其他语言也可以用这个术语,因为其他的名称往往会让大家感觉到混乱。大多数情况下,例如在Java,ECMAScript或Visual Basic中,这一策略也称之为按值传递——意味着:特殊值——引用拷贝(副本)。

一方面,它是这样的——传递给函数内部用的参数仅仅是绑定值(引用地址)的一个名称,并不会影响外部的对象。

另一方面,如果不深入研究,这些术语真的被认为吃错误的,因为很多论坛都在说如何将对象传递给JavaScript函数)。

一般理论确实有按值传递的说法:但这时候这个值就是我们所说的地址拷贝(副本),因此并没哟破坏规则。

在Ruby中,这个策略称为按引用传递。再说一下:它不是按照大结构的拷贝来传递(例如,不是按值传递),而另一方面,我们没有处理原始对象的引用,并且不能修改它;因此,这个跨术语的概念可能更会造成混乱。

深入理解JavaScript系列(19):求值策略(Evaluation strategy)详解(深入理解新发展理念,推进供给侧结构性改革)

理论里没有像按值传递的特殊case一样来面试按引用传递的特殊case。

但依然有必要了解这些策略在上述提到的技术中(Java, ECMAScript, Python, Ruby, other),实际上——他们用的策略就是按共享传递。

按共享与指针

对于С/С+ +,这个策略在思想上和按指针值传递是一样的,但有一个重要的区别——该策略可以取消引用指针以及完全改变对象。但在一般情况下,分配一个值(地址)指针到新的内存块(即之前引用的内存块保持不变);通过指针改变对象属性的话会影响阿东外部对象。

因此,和指针类别,我们可以明显看到,这是按地址值传递。 在这种情况下,按共享传递只是“语法糖”,像指针赋值行为一样(但不能取消引用),或者像引用一样修改属性(不需要取消引用操作),有时候,它可以被命名为“安全指针”。

然而,С/С+ +如果在没有明显指针的解引用的情况下,引用对象属性的时候,还具有特殊的语法糖:和C++关系最为紧密的这种意识形态可以从“智能指针”的实现中看到,例如,在 boost :: shared_ptr里,重载了赋值操作符以及拷贝构造函数,而且还使用了对象的引用计数器,通过GC删除对象。 这种数据类型,甚至有类似的名字- 共享_ptr。

ECMAScript实现

现在我们知道了ECMAScript中将对象作为参数传递的策略了——按共享传递:修改参数的属性将会影响到外部,而重新赋值将不会影响到外部对象。但是,正如我们上面提到的,其中的ECMAScript开发人员一般都称之为是:按值传递,只不过该值是引用地址的拷贝。

JavaScript发明人布伦丹·艾希也写到了:传递的是引用的拷贝(地址副本)。所以论坛里大家曾说的按值传递,在这种解释下,也是对的。

更确切地说,这种行为可以理解为简单的赋值,我们可以看到,内部是完全不同的对象,只不过引用的是相同的值——也就是地址副本。

ECMAScript代码:即两个标识符(名称绑定)绑定到内存中的同一个对象, 共享这个对象:

foo value: addr(0xFF) => {x: , y: } (address 0xFF) <= bar value: addr(0xFF)而重新赋值分配,绑定是新的对象标识符(新地址),而不影响已经先前绑定的对象 :即现在foo和 bar,有不同的值和不同的地址:再强调一下,这里所说对象的值是地址(address),而不是对象结构本身,将变量赋值给另外一个变量——是赋值值的引用。因此两个变量引用的是同一个内存地址。下一个赋值却是新地址,是解析与旧对象的地址绑定,然后绑定到新对象的地址上,这就是和按引用传递的最重要区别。

此外,如果只考虑ECMA-标准所提供的抽象层次,我们在算法里看到的只有“值”这个概念,实现传递的“值”(可以是原始值,也可以是对象),但是按照我们上面的定义,也可以完全称之为“按值传递”,因为引用地址也是值。

然而,为了避免误解(为什么外部对象的属性可以在函数内部改变),这里依然需要考虑实现层面的细节——我们看到的按共享传递,或者换句话讲——按安全指针传递,而安全指针不可能去解除引用和改变对象的,但可以去修改该对象的属性值。

术语版本

让我们来定义ECMAScript中该策略的术语版本。

可以称之为“按值传递”——这里所说的值是一个特殊的case,也就是该值是地址副本(address copy)。从这个层面我们可以说:ECMAScript中除了异常之外的对象都是按值传递的,这实际上是ECMAScript抽象的层面。

或针对这种情况下,专门称之为“按共享传递”,通过这个正好可以看到传统的按值传递和按引用传递的区别,这种情况,可以分成2个种情况:1:原始值按值传递;2:对象按共享传递。

“通过引用类型将对象到函数”这句话和ECMAScript无关,而且它是错误的。

结论

我希望这篇文章有助于宏观上了解更多细节,以及在ECMAScript中的实现。一如既往,如果有任何问题,欢迎讨论。

Redis基本知识、安装、部署、配置笔记 基本知识1、Redis的数据类型:字符串、列表(lists)、集合(sets)、有序集合(sortssets)、哈希表(hashs)2、Redis和memcache相比的独特之处:(1)redis可

深入理解JavaScript系列():S.O.L.I.D五大原则之依赖倒置原则DIP详解 前言本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第5篇,依赖倒置原则LSP(TheDependencyInversionPrinciple)。英文原文:

深入理解JavaScript系列():S.O.L.I.D五大原则之接口隔离原则ISP详解 前言本章我们要讲解的是S.O.L.I.D五大原则JavaScript语言实现的第4篇,接口隔离原则ISP(TheInterfaceSegregationPrinciple)。英文原文:

标签: 深入理解新发展理念,推进供给侧结构性改革

本文链接地址:https://www.jiuchutong.com/biancheng/382879.html 转载请保留说明!

上一篇:深入理解JavaScript系列(50):Function模式(下篇)(深入理解ffmpeg pdf)

下一篇:Redis基本知识、安装、部署、配置笔记(redis基础教程)

  • 企业视同销售的税法依据是什么?
  • 调减加计抵减额会计分录
  • 对方开具红字发票信息表后我们怎么开负数
  • 金蝶旗舰版的现金流量表怎么导出
  • 汇算清缴需要准备哪些数据
  • 销售货物的价外费用有哪些
  • 车间员工的质量管理制度
  • 企业接到银行通知,借入长期借款的应付利息为15000
  • 企业买电动车做资产如何做折旧?
  • 取得投资收益会导致经营现金流量小于
  • 提供境外服务
  • 待处理财产损益科目
  • 一个十图
  • 开具红字发票后发现购买方已做抵扣怎么办
  • 土地出让金为何写有效期
  • windows11蓝牙不能用
  • 工商年报社保需要多少钱
  • world超链接
  • 电子商务如何做账
  • 公司实缴资本有什么风险
  • 一个完整的php文件由哪些元素组成
  • 系统之家u盘重装系统流程
  • win7打开启动
  • 现金解款单怎么读
  • 钢铁企业成本核算表
  • php模板之家官网
  • 购买财务软件的费用
  • PHP实现中国公民身份证号码有效性验证示例代码
  • 结转,结余
  • phpcurl模拟登录
  • 小规模纳税人未开票收入如何填申报表
  • 深入分析php优化模型
  • 大学生web前端期刊有哪些
  • 命令who的含义
  • 货到付款付的是什么费用
  • 外地工程预缴的个人所得税是什么申报
  • 实收资本大于注册资本是什么意思
  • 不计入法定期间的情形包括
  • three.js gui
  • 递归是从底向上逐层计算的
  • 织梦网站停止使用了还侵权吗
  • 教大家8天学通MongoDB——第一天 基础入门篇
  • 电脑管理费用入什么账户
  • 运输发票怎么做账
  • 送礼的烟酒去哪里买
  • 经审计的财务报表是否要会计师事务所盖章
  • sql实现split函数的脚本
  • 实收资本报表怎么填
  • 应收应付会计分录大全
  • 股东垫付的钱可以作为实收资本吗
  • 我国会计准则规定企业的会计核算基础是
  • 个税手续费返还比例
  • 事业单位劳务派遣工能长期干下去吗
  • 消费税也是流转税吗
  • 企业银行贷款保证金多少
  • 存货换入无形资产账务处理
  • 厂房拆了建住宅可以么
  • 账户与会计科目有什么联系与区别?
  • windows更新kb5001391
  • win7系统远程
  • winxp使用到什么时候
  • 在windows七中
  • 帝国时代2能在win10
  • os x 10.10 yosemite自动纠正怎么关?os x yosemite自动纠正功能关闭教程
  • win7 64位系统只有搜狗浏览器可以打开网页其他浏览器打不开的故障原因及解决方法
  • win10通知中心
  • win8旗舰版官方下载
  • win7取消关机命令
  • 常用at命令集
  • css各种滤镜的应用是什么
  • 网页的css
  • python多线程怎么写
  • 启动游戏使用的文件夹什么意思
  • jQuery Ajax 加载数据时异步显示加载动画
  • js实现fizzbuzz
  • 拟录用人员公示后还会递补吗
  • 南京退林还耕
  • 小规模纳税人进口环节的增值税税率
  • 外汇申报填写什么最简单
  • 入库税收怎么根据完税证明
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设