发布于 2026-01-06 0 阅读
0

JavaScript:Ruby 程序员入门指南 显式蕴涵 要么做,要么不做,没有捷径 反向实例化 ES6 中的炫耀主义 顺其自然 结论

JavaScript:Ruby 开发者的入门指南

明确的含义

做或不做,没有捷径。

反向实例化

ES6 中的暴露癖

让它顺其自然

结论

做这件事

我最初在Flatiron开始学习 Ruby 时,带着之前学习 JavaScript 的经验,希望能缩小两种语言语法之间的差距。虽然理解一些编程基础的关键概念很有帮助,但我很快发现自己置身于一个非常陌生的领域,那里充斥着隐含的抽象概念,似乎与我之前所了解的一切都背道而驰。

现在,在过去的六周里,我从简单世界的南方海岸一路跋涉dodefRails 5 的北方高地,讽刺的是,当我再次踏入熟悉的 JavaScript 领域时,我感到很不适应。

本文将尝试从 Ruby 程序员的角度描述 JavaScript 和 Ruby 语法之间的根本区别,并提供我在交替使用这两种语言时提高思维灵活性的策略。

明确的含义

从根本上来说,Ruby 和 JavaScript 之间的主要区别在于,Ruby 被认为是“强类型”的,这意味着数据类型之间的关系非常具体;而 JavaScript 被认为是“弱类型”的,这意味着数据类型更易变,并且可以以不太具体的方式相互关联。

Ruby 允许隐含逻辑,但数据类型有明确的规则;而 JavaScript 则要求显式逻辑,数据类型则有更多隐含规则。

Ruby 将整数和浮点数视为不同的数据类型,必须进行转换才能相互影响,而 JavaScript 则直接使用数字,数字可以是整数也可以是浮点值,这完美地体现了规则集的差异。

这显然意味着程序员在使用 JavaScript 时拥有更大的自由度,然而,当程序员从 Ruby 程序员的背景出发来接受 JavaScript 时,同样的自由度可能会产生意想不到的结果。

逻辑处理方式不同的一个完美例子是,除非return在 JavaScript 中使用裸露的关键字显式地返回一个值,否则函数的返回值是未定义的。

返回值必须明确指定。

这与 Ruby 的惯例背道而驰,Ruby 的惯例倾向于在方法的最后一行使用隐式 return 语句。但就我目前的编程学习经历而言,有一点非常明确:重复练习能积累知识,知识能提升技能。换句话说,以标准化的方式做事有助于巩固概念。为此,我发现,在return最后一行代码上方添加注释,或者直接return在 Ruby 的最后一行代码中加上 `return` 语句,都能帮助我在两种语言中保持对代码的理解。

做或不做,没有捷径。

JavaScript 中有一些do循环可以模拟doRuby 中的代码块的行为,但它们之间存在一个非常重要的区别。

  • do在 Ruby 中,如果代码块的条件不满足,或者传递给代码块的迭代器无法至少执行一次,则代码块不会触发
  • 在 JavaScript 中,do循环只有在执行完代码后才会评估其条件。

这意味着 do 在 JavaScript 中,循环总是至少触发一次,如下图所示。

做这件事

这两种语言在行为方式上的差异,do是 Ruby 程序员学习 JavaScript 语法时面临的首要挑战。我们在 Ruby 中养成的肌肉记忆很容易在编写 JavaScript 代码时不自觉地发挥作用。幸运的是,Ruby 中也有一些策略可以帮助我们最大限度地减少这种学习上的不适。

卷毛男孩前来救援

有些情况下你仍然需要使用这种do end语法,例如将逻辑嵌入到.erb文件中。但大多数情况下,我发现培养跨语言肌肉记忆的最佳方法是在 Ruby 中尽可能使用花括号来传递代码块。

卷曲的牙套拯救了世界

采用这种语法的另一个优点是,它为方法链式调用留下了可能性,在某些情况下,可以灵活地遵守函数式可读性规则,将逻辑写成一行。

只能有一个

do end将简写井号 (#) 符号加入其中,进一步强化了使用花括号而非其他符号的优势key: value。当这些语法约定结合使用时,它们不仅适用于 JSON,也适用于 CSS,从而形成一套更加统一、易于记忆的语法词汇。

对于 Ruby 程序员来说,JavaScript 的受欢迎程度几乎垫底,而 JavaScript 在这方面最大的不同之处在于它缺乏对类似binding.pry`or` 的实用程序的原生支持byebug

虽然如Kevin Kim这篇文章中提到的那样,有一些解决方案在 JavaScript 的上下文中功能上是同义的,但开发前端代码时出现的问题往往会在浏览器中以令人不快的意外形式出现。pry

这些情况并不一定意味着某个项目一定会用 NodeJS 创建,或者某个 bug 一定会在 Chrome 测试中出现。这意味着,即使 NodeJS 或 Chrome 的开发者工具中提供了相应的工具,有时它们也可能不适用。

我们的英雄登场了:console.log()

总比不好好,还不错。

所有开发者都喜欢日志

最简单的解释console.log()是,它是一个实用函数,会将字符串参数的副本打印到浏览器的控制台窗口中。通过使用模板字面量将变量插入字符串,pry可以实现与此类似的效果;尽管不如直接打印字符串那样用户友好。

控制台日志……

需要注意的是,根据 console.log() 调用该函数的函数的作用域,可能无法在控制台中渲染该函数的输出。

因此,最好了解如何使用console.log()调试工具,但在决定如何开发项目的前端代码时,也要考虑调试工具的可用性。

模板字面量

值得庆幸的是,将变量插入字符串的学习曲线要​​简单得多。语法几乎完全相同,如下所示。

字面上的价值

有趣的是:反引号字符的类型叫做“变音符号”,而反引号字符本身的名称是“重音符”。为了记住 JavaScript 中允许插值的字符串引用类型,你可以使用以下联想:

“插值变量至关重要”

反向实例化

从 Ruby 过渡到 JavaScript 最困难的方面之一是实例化类时需要用到的肌肉记忆。在 Ruby 中,我们总是使用 `class` 调用Class.new,而现在我们必须适应 JavaScript 的 `class` 调用new Class()。这看似微小的差别,却会对项目的流程产生相当大的影响。

新新

由于我现在用 Ruby 编写的大部分类实例化操作都发生在 Rails 控制器内部,我发现一种在这两种语法之间进行标准化的策略是将我的#new操作完全抽象到一个before_action辅助方法中。这既能简化我的代码,又能让我将这两种情况在思维上视为独立的,从而避免相互干扰。

ES6 中的暴露癖

既然我们已经考虑了类的实例化方式,不妨先回顾一下辅助方法的before_action定义。根据 Rails 的约定,这些方法定义private在控制器内部的 `<controller>` 关键字下方。这意味着,在服务器请求期间创建控制器实例时,这些辅助方法是该实例的私有方法。而 JavaScript 的工作方式则截然不同。

截至撰写本文时,JavaScript 中所有类实例的所有属性和方法实际上都是(并且原生地)公开的。

回到 JavaScript 隐含数据类型交互方式这一点,这种隐含的关系系统也延伸到了函数作用域。通过利用 JavaScript 中函数作用域的某些特性,可以近似实现与privateRails 中裸词相同的行为,但这需要更多的工作和更深层次的理解。

目前,私有化类属性和方法的各种复杂方法已经超出了我的技能范围,这是一个非常深奥的话题,无法在本文中详述。克里斯·费迪南迪( Chris Ferdinandi)的文章提供了更多关于此过程的信息,请点击此处查看。

也就是说,需要理解的是,与在 Ruby 中工作不同,在 JavaScript 中对数据进行操作并不总是对已存在的数据进行操作,而是可以通过预期数据存在来创建数据。

一个典型的例子是给一个不存在的对象属性赋值,从而在这个过程中创建并附加该属性到对象上。

添加内容很容易

本文发表时,JavaScript 的最新标准仍为 ES6。然而,下一代标准——目前称为 ESNext——预计将于 2019 年或之后不久发布。届时,它将原生支持私有类属性和方法,从而无需使用闭包来隐藏类变量。

让它顺其自然

遗憾的是,这两种语言在语法上存在一个显而易见的巨大差异,无论对哪种语言的工作流程进行多少调整都无法掩盖它。这个巨大差异体现在语句结构和单词使用方式上的诸多不同之处。

本文旨在从 Ruby 程序员的角度提供一些策略,以减少在用 JavaScript 编写代码时,高层差异带来的影响。

由于您将遇到的语法差异信息量很大,我建议您阅读Edozié Izegbu这篇优秀文章,以便更好地应对这些不可避免的难点。

结论

虽然我的编程学习之旅才刚刚开始,但我希望这些策略能够帮助指导或启发你开始规范你使用多种语言进行写作的方法。

文章来源:https://dev.to/allenwoods/javascript-a-primer-for-rubyists-3hep