我在Java工作,我的所有教育都是用Java编写的,我试图弄清楚它对Atom文本编辑器的贡献。这是来自Coffeescript.org的代码示例:
race = function() {
var runners, winner;
winner = arguments[0], runners = 2 <= arguments.length ? slice.call(arguments, 1) : [];
return print(winner, runners);
};
if (typeof elvis !== "undefined" && elvis !== null) {
alert("I knew it!");
}
我遇到了麻烦,因为我不明白胜利者的行为是什么。获胜者被分配为第0个参数,所以你可以打电话:种族(&#34;尼克&#34;,&#34; jordan&#34;,&#34; mitchell&#34;),你会打印昵称,乔丹,米切尔,胜利者是尼克,乔丹和米切尔被分配为选手,因为尼克被切掉了。如果有2名选手,你只有一名获胜者?或者更确切地说,该功能如何运作?
第二个块有两个if条件,因为Javascript有两种不同的表示null的方式,对吗?
您对学习Coffeescript有什么建议吗?
其次,是否有任何关于开始为开源软件做出贡献的建议?
答案 0 :(得分:2)
尼克,欢迎来到Stack Overflow,因为这是你在任何论坛上的第一个问题。堆栈溢出(SO)主要是一个问答网站,而不是真正的论坛。所以第一点建议,你问过3个问题,如果你只询问一个问题最好,请阅读我如何在本网站上提出一个好问题页面以获得更多建议here。其次,任何可能引起辩论或可能有许多观点和意见的问题通常都是不受欢迎的。这个网站纯粹是为了问答(而不是讨论)。
那么,关于JavaScript问题,我可以提供帮助&gt;我对CoffeeScript一无所知,除了它是围绕JavaScript的更多OO包装器。就个人而言,我说更好地学习JavaScript。特别是随着新JavaScript标准(ECMAScript 6)的出现,它有望使像CoffeeScript这样的东西不再需要(仅限IMHO)。
当您在JavaScript中调用函数时,除了括号中定义的参数外,每个函数还会获得另外两个参数this
和arguments
。忽略this
(除了说它是调用函数的对象上下文,或者全局对象),arguments
参数是一个类似于对象的数组,它包含传递给函数的所有参数
在你的情况下,函数race
根本没有定义参数(因此是空括号()
),所以函数使用arguments
参数,每个函数得到一个参数默认。 arguments
参数可能很有用,因为这意味着您可以在JavaScript中编写一个函数,该函数可以使用您提供给它的任意数量的参数。
现在竞争函数也有很多缩短的语法,所以我会重写一点,这可能有助于理解:
race = function () {
var winner; //Declare two variables, winner and runners, but they are set to undefined
var runners;
winner = arguments[0]; //Assign winner to the first argument
if (arguments.length >= 2) { //If there is 2 or more arguments passed in
runners = slice.call(arguments, 1); //trim off the first argument (that was Arguments[0], the winner), and assign whats left to runners
}
else {
runners = []; //Set runners to an empty array
}
return print(winner, runners); //Call print
};
现在上面的函数片对我来说似乎不正确,它必须在其他地方的范围内。通常它是Array.prototype.slice.call(arguments,1);
,因为这里的意图是在对象(arguments
)这样的数组上使用数组函数,并且使用array.prototype和调用使用不同的上下文执行函数。如果我失去了你,请原谅我,但如果你想了解更多信息,请查看JavaScript中的原型继承和函数重用。
现在慢慢放回缩短的语法。声明变量可以使用一个var
和逗号来完成:
var winner;
var runners;
可以
var winner,
runners;
//Or all on one line
var winner, runners;
当然,您可以包括声明和作业;
var winner = arguments[0],
runners = 2 <= arguments.length ? slice.call(arguments, 1) : [];
现在,对于跑步者的分配使用了一个三元运算符(?:),它只是if... else
语句的一个班组,即(test) ? (do this if true) : (do this if false);
我实际上走得更远了。原始文件在一个语句中仍然有变量声明,然后在下一个语句中有赋值。原文有一个逗号分隔两个作业。当在javascript中使用这样的逗号(只是为了分隔表达式)时,每个只是从左到右依次执行。 IMO除了能够在一行上写它之外没什么好处,你可以很容易地用分号(;
)取代它
其次,undefined
和null
。是的,JavaScript有两个概念。但它们都有用途。首先,当您创建变量并且不为其分配任何内容时,var a;
JavaScript始终将这些变量设置为undefined
。函数调用中的任何未应用的参数,即:。
function somethingcool(a,b)
{
//do something cool here
//If a, or b are not passed in, they will be undefined
}
somethingcool(2); //b will be undefined
somethingcool(); //both a and b will be undefined
现在问题是null
,我倾向于将其用作任何用户版本。 JavaScript本身永远不会为null
设置任何内容,所以有时候我会在代码中表示没有任何价值,但我不希望它是undefined
,因为它实际上是定义的,只是没有。< / p>
同样,undefined
和null
在JavaScripts falsey规则中解析为false,因此最后一行可能只是
if (elvis) {
alert("I knew it!");
}
并且可能工作相同(唯一的问题可能是空字符串""
,因为它在JavaScript中也会解析为false,这可能不是您之后的行为)
无论如何,如果你想了解更多只是google JavaScript truthy和falsey。
正如我之前所说的那样,我对Coffeescript了解不多,而且我认为你对开源的问题会导致更多的讨论问题和意见,这不是真正正确的地方
答案 1 :(得分:0)
您发布的代码是javascript。请参阅OJay的答案,了解其工作原理。
<小时/> 在coffeescript中,使用splats(...):会更简单
race = (winner, runners...) ->
console.log winner, runners
或在ES6中:
race = function(winner, runners...) {
console.log(winner, runners);
}
至于第二个区块,你只需使用coffeescript中的existential operator:
alert "I knew it!" if elvis?