纯函数可以返回符号吗?

2023-12-01

这可能有点哲学性,但我认为这是提问的正确地点。

假设我有一个创建 ID 列表的函数。这些标识符仅在应用程序内部使用,因此使用 ES2015 是可以接受的Symbol() here.

我的问题是,技术上,当您请求一个符号时,我想 JS 运行时会创建一个唯一标识符(随机数?内存地址?不确定),为了防止冲突,需要访问全局状态。我不确定的原因是因为“技术上”这个词。我不确定(再次从哲学的角度来看)这是否足以打破 API 所呈现的数学抽象。

tl;dr:这是一个例子——

function sentinelToSymbol(x) {
  if (x === -1) return Symbol();
  return x;
}

这个函数是纯函数吗?


不完全是,不,但这实际上可能并不重要。

在表面上,(foo) => Symbol(foo)显得纯洁。虽然运行时may做一些有副作用的操作,你永远不会看到它们,即使你调用Symbol()同时具有相同的参数。然而,调用Symbol使用相同的参数永远不会返回相同的值,这是主要标准之一(#2,如下)。

From MDN 页面:

请注意,Symbol("foo") 不会将字符串“foo”强制转换为符号。它每次都会创建一个新符号:

Symbol("foo") === Symbol("foo"); // false

只看副作用,(foo) => Symbol(foo)是纯粹的(高于运行时)。

然而,纯函数必须满足更多标准。来自维基百科:

纯函数(或表达式)没有副作用(内存或 I/O)。这意味着纯函数具有几个有用的属性,其中许多属性可用于优化代码:

  • 如果不使用纯表达式的结果,则可以将其删除而不影响其他表达式。
  • 如果使用不会引起副作用的参数调用纯函数,则结果相对于该参数列表是恒定的(有时称为引用透明性),即,如果使用相同的参数再次调用纯函数,则将得到相同的结果返回(这可以启用缓存优化,例如记忆)。
  • 如果两个纯表达式之间不存在数据依赖关系,那么它们的顺序可以颠倒,或者可以并行执行并且不能相互干扰(换句话说,任何纯表达式的求值都是线程安全的)。
  • 如果整个语言不允许副作用,那么可以使用任何评估策略;这使编译器可以自由地重新排序或组合程序中表达式的计算(例如,使用毁林)。

你可能会认为该列表的前言排除了这一点一切在 JavaScript 中,因为任何操作都可能导致内存分配、内部结构更新等。按照最严格的解释,JS 从来都不是纯粹的。这不是很有趣或有用,所以......

该函数满足标准#1。不考虑结果,(foo) => Symbol(foo) and (foo) => ()与任何外部观察者都是相同的。

标准#2 给我们带来了更多麻烦。给定bar = (foo) => Symbol(foo), bar('xyz') !== bar('xyz'), so Symbol根本不符合这个要求。您每次调用时都保证会得到一个唯一的实例Symbol.

继续,标准#3 不会造成任何问题。您可以致电Symbol来自不同线程,不会发生冲突(并行),并且调用它们的顺序并不重要。

最后,标准 #4 比直接要求更重要,并且很容易满足(JS 运行时会随机调整所有内容)。

所以:

  • 严格来说,JS 中没有什么是纯粹的。
  • Symbol()绝对不是纯粹的,因此这个例子也不是。
  • 如果您关心的只是副作用而不是记忆,那么该示例确实符合这些标准。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

纯函数可以返回符号吗? 的相关文章

  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • 如何测试 javascript 闭包内的函数

    这似乎是不可能的 也可能是 但我正在尝试更多的 TDD 但我总是在闭包方面碰壁 假设我有以下内容 function createSomething init function privateMethod param return init
  • 解析“流”JSON

    我在浏览器中有一个网格 我想通过 JSON 将数据行发送到网格 但浏览器应该在接收到 JSON 时不断解析它 并在解析时将行添加到网格中 换句话说 在接收到整个 JSON 对象后 不应将行全部添加到网格中 应该在接收到行时将其添加到网格中
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • 使用 jQuery/JS 打开时使
    标签的内容具有动画效果

    我只想要 HTML5 的内容details标记为 滑行 动画打开 而不是仅仅弹出打开 立即出现 这可以用 jQuery Javascript 实现吗 Fiddle http jsfiddle net 9h4Hq HTML
  • Meteor:应用程序无法在 0.9.1.1 版本上运行

    出现类似错误 Error TypeError undefined is not a function evaluating Template create anonymous function iron dynamic template j
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • Node.js:如何在检索数据(块)时关闭响应/请求

    我正在用 node js 构建一个应用程序 它加载多个页面并分析内容 因为 node js 发送块 所以我可以分析这些块 如果一个块包含例如索引 nofollow 我想关闭该连接并继续其余部分 var host example com to
  • 从未用 @flow 标记的导入文件中获取类型定义

    TL DR我怎么告诉flow从未声明的导入模块导入类型定义 flow 加长版 流接缝能够从不使用流语法的文件中派生类型 请参阅示例 示例文件 flow js if Math random lt 0 5 var y hello else va
  • 在requestAnimationFrame中使用clearRect不显示动画

    我正在尝试在 HTML5 画布上做一个简单的 javascript 动画 现在我的画布是分层的 这样当我收到鼠标事件时 背景层不会改变 但带有头像的顶层会移动 如果我使用 requestAnimationFrame 并且不清除屏幕 我会看到
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • 为什么在 Internet Explorer 中访问 localStorage 对象会引发错误?

    我正在解决一个客户端问题 Modernizr 意外地没有检测到对localStorageInternet Explorer 9 中的对象 我的页面正确使用 HTML 5 文档类型 并且开发人员工具报告该页面具有 IE9 的浏览器模式和 IE
  • 如何在类似控制台的环境中运行 JavaScript?

    我正在尝试遵循这里的示例 http eloquentjavascript net chapter2 html http eloquentjavascript net chapter2 html and print blah 在浏览器中运行时
  • 如何获取给定 DOM 元素的所有定义的 CSS 选择器?

    如何使用 jQuery 获取给定 DOM 元素的所有定义的 CSS 选择器 定义后 我的意思是在应用于任何样式表的所有 CSS 选择器document 在某种程度上 这类似于 FireBug 实现的功能 其中显示所选 DOM 元素的所有应用
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • 条件在反应本机生产中失败,但在开发中有效

    我创建了一个反应本机应用程序 我需要通过它进行比较 如果属实 就会执行死刑 问题是 该条件适用于 React Native 开发模式 而不适用于 React Native 生产版本 我使用 firebase 作为数据库 也使用 redux
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win

随机推荐

  • 如何判断 Sympy 变量是否为复数?

    我正在编写一个涉及求解这个方程的代码 X solve Theta Mod Eqn Ramp Equation x PT C x 我正在使用 sympy 库 现在方程有 7 个根 很少是复数根 很少是实数根 我无法将它们分开 因为isinst
  • 服务永久处于“启动”状态

    我用 C 编写了一个 Windows 服务 它将 wav 文件转换为 mp3 然后将它们存储在远程服务器上 在我的开发平台 操作系统 WinXP SP3 上 服务启动正常并按预期运行 当我将其安装到生产机器 操作系统 WinServer 2
  • notificationDataSetChanged() 使列表刷新并滚动跳回顶部

    我正在尝试实现无限滚动列表视图 但是当我打电话时notifyDataSetChanged 整个列表刷新然后滚动位置返回到顶部 这是正常行为吗 如何让它简单地添加添加的项目而不刷新并保持滚动位置 这种行为是不正常的 在没有看到您的代码的情况下
  • 使用 Javascript/jQuery 访问 id 属性不正确的 HTML 元素

    我正在为某人制作一个 Greasemonkey 脚本 以更改其 CRM Zoho 创建的某些字段的显示 因为他们无权更改呈现的 HTML 这应该很容易 但是 Zoho 认为创建正确的 HTML 太麻烦了 我猜 他们的 HTML 包含这样的内
  • 如何使用 Google Apps 脚本在电子邮件主题中使用表情符号?

    我正在尝试使用 Google Apps 脚本发送电子邮件 try 1 const subject Hello World try 2 const subject Hello World String fromCodePoint 0x1F60
  • 使用 new-azwebapp 时如何选择运行环境?

    我目前正在构建一个脚本来自动创建天蓝色网络应用程序 前端是用 React 构建的并且部署得很好 后端是使用node构建的 发布时不会运行 我认为默认情况下 New AzWebApp 创建一个 net windows 运行时环境 而我想要一个
  • 为同一路线航行多个处理程序

    正如标题所示 我想在不同的控制器中为 Sails Js 中的同一路线分配多个操作处理程序 我尝试过的 post rest users controller FirstController action someAction controll
  • Visual Studio 2022:更改垂直滚动条中定位区域的颜色

    如何更改图像中突出显示的区域的颜色 该区域显示您所在的位置或要滚动到正在编辑的页面中的位置 我发现能够更改此设置的唯一方法是创建自己的主题 因为 Visual Studio 独立版似乎不支持此功能 幸运的是 有一个很好的扩展名为Visual
  • 将 sp_executesql 与 params 一起使用会抱怨需要声明变量

    我正在尝试创建一个使用 sp executesql 的存储过程 我已经仔细观察了很久here 但我看不到我在代码中做错了什么 一般来说 我对存储过程 sql 服务器功能很陌生 所以我猜我错过了一些简单的东西 存储过程更改发生得很好 但是当我
  • 通告揭示了新活动的过渡

    As per https developer android com training material animations html The ViewAnimationUtils createCircularReveal 方法使您能够
  • BCNF分解算法不起作用

    我有以下问题 R ABCDEFG 和 F AB gt CD C gt EF G gt A G gt F CE gt F 显然 B 和 G 应该是键的一部分 因为它们不是依赖集的一部分 此外 BG ABCDEFG 因此是候选键 显然 AB g
  • Webkit CSS 控制输入[type=color] 中颜色周围的框?

    是否有特定于 Webkit 的 CSS 样式 可以让我控制颜色周围的框的颜色 大小 样式input type color 我已经设置了输入的颜色和背景颜色 因此它与我用于旧版 Chrome 和 Firefox 的交叉兼容性填充程序看起来不错
  • NavigationService 何时初始化?

    我想从我的页面捕获 NavigationService Navigating 事件 以防止用户向前导航 我有一个这样定义的事件处理程序 void PreventForwardNavigation object sender Navigati
  • 如何使用 %s 和 %c 正确 printf 字符串和字符

    我对使用感到困惑 c and s在以下 C 程序中 include
  • 从 SQL Server 表中选择扩展属性

    我正在为客户的数据库编写一个简单的 CMS 有 12 个表 他们需要管理其中 4 个表中的所有数据 我设置了一个动态数据项目 Linq to SQL 因为这是我最熟悉的 并且第一页使所有 12 个表都可以按其应有的方式进行编辑 它们位于名为
  • 无效并不是重画屏幕。安卓

    BufferedReader hl new BufferedReader new InputStreamReader getResources openRawResource R raw lines while hl ready showL
  • getDrawable(int id) 已弃用。如何设置图像?

    有一个问题 getDrawable 在 API 22 中已弃用 那么 如果我使用最小 API 16 制作应用程序 如何设置图像 我看到我可以使用 getDrawable int id theme 但这是在 API 21 中添加的 所以我不能
  • 在 D3 的上下文菜单中获取节点详细信息

    我正在尝试获取节点详细信息 id属性 当右键单击时 contextmenu函数被调用 我可以使用获取节点对象var self d3 select this 但我无法计算出 节点的 id 属性 不过我可以在控制台日志中看到它 我打算通过id一
  • CSS 三角形是如何工作的?

    有很多不同的 CSS 形状CSS 技巧 CSS 的形状我对三角形特别困惑 triangle up width 0 height 0 border left 50px solid transparent border right 50px s
  • 纯函数可以返回符号吗?

    这可能有点哲学性 但我认为这是提问的正确地点 假设我有一个创建 ID 列表的函数 这些标识符仅在应用程序内部使用 因此使用 ES2015 是可以接受的Symbol here 我的问题是 技术上 当您请求一个符号时 我想 JS 运行时会创建一