在过去的几个小时里,我一直在试图找出这 3 个之间的区别,而不仅仅是区别,我也一直在试图找出哪些是同义词,MDN 将所有声明称为“声明”,所以我认为那是真实的。但是,我阅读的所有文章和 SO 问题都没有提供给我区分 3(或 2,表达式与语句)的备忘单。
我注意到语句的一点是它们都以某种方式涉及一个特殊的 JavaScript 关键字,如 break 或 for 或 var。文章说表达式求值,而语句执行操作。那什么是函数呢?它是一个语句表达式混合体(因为它在调用时都执行一个 Action ,并返回一个值)?现在,我假设情况并非如此,因为函数调用不涉及 JavaScript 关键字。
然后是声明,每一个声明也是一个声明吗?
我也知道像 20 + 5 * 2/3; 这样的表达式语句,但这些语句不是毫无用处吗?为什么有人会用这样的行污染他们的代码?
如果有人可以提出上述问题(或至少其中的一些问题),或者如果有人可以向我提供某种备忘单,我将非常高兴。为什么用如此流行的语言看起来如此简单的主题的资料如此之少?
最佳答案
所有语言(包括 JS)都遵循这些术语的标准定义。我对它们的看法如下:
表达式产生一个值,可以写在任何需要值的地方。
另一方面,语句是一个独立的执行单元。它不返回任何内容。
声明是将值赋给变量的语句。
所有声明都是声明,但并非所有声明都是声明。
大多数语句和所有声明都包含表达式。
Javadoc还给出了简洁明了的定义:
An expression is a construct made up of variables, operators, and method invocations, which are constructed according to the syntax of the language, that evaluates to a single value.
Statements are roughly equivalent to sentences in natural languages. A statement forms a complete unit of execution.
现在,您关于必然涉及关键字的理论是不正确的。这是包含关键字的语句:
break;
这是一个没有的:
foo();
在第一个示例中,我执行了一个break,而在第二个示例中,我调用了一个函数。两者都是语句,但只有一个包含任何特殊关键字。
函数不是语句。如上所示,函数 call 是一个语句。对于返回某些内容的函数,调用也可以是声明:
var bar = foo();
对于您的最后一个问题,关于这方面的 Material 如此之少的原因是因为这仅仅是一个语义问题。人们不会停留在这些术语的确切定义上。
为了进一步说明,我建议看一下 this Axel Rauschmayer 的博客文章,专门讨论了 JS 中语句和表达式之间的区别。
关于JavaScript:声明 vs 表达式 vs 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46351924/
在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
@raw_array[i]=~/[\W]/非常简单的正则表达式。当我用一些非拉丁字母(具体来说是俄语)尝试时,条件是错误的。我能用它做什么? 最佳答案 @raw_array[i]=~/[\p{L}]/使用西里尔字符进行测试。引用:http://www.regular-expressions.info/unicode.html#prop 关于ruby-正则表达式将非英文字母匹配为非单词字符,我们在StackOverflow上找到一个类似的问题: https://
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案
这是一个例子:s="abcd+subtext@example.com"s.match(/+[^@]*/)Result=>"+subtext"问题是,我不想在其中包含“+”。我希望结果是“潜台词”,没有+ 最佳答案 您可以在正则表达式中使用括号来创建匹配组:s="abcd+subtext@example.com"s=~/\+([^@]*)/&&$1=>"subtext" 关于ruby-正则表达式-排除一个字符,我们在StackOverflow上找到一个类似的问题:
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/