Javascript 一行多声明和学习Javascript

Javascript Multiple Declarations in one line and Learning Javascript

我在 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!");
}

我遇到了麻烦,因为我不明白 winner 行在做什么。 winner 被指定为第 0 个参数,因此您可以调用:race("nick","jordan","mitchell"),您将打印 nick、jordan、mitchell,winner 是 nick,乔丹和米切尔被指定为跑步者,因为尼克被切掉了。如果有 2 个跑步者,你只有一个赢家?或者更确切地说,该功能是如何工作的?

由于 Java脚本有 2 种不同的表示 null 的方式,第二个块有两个 if 条件,对吗?

你对学习 Coffeescript 有什么建议吗?

其次,对于开始为开源软件做贡献有什么建议吗?

Nick,欢迎来到 Stack Overflow,因为这是您在任何论坛上的第一个问题。 Stack overflow (SO) 主要是一个问答站点,而不是真正的论坛。所以第一个建议,你问了大约 3 个问题,最好只问一个,阅读本网站上的如何提出一个好的问题页面以获得更多建议 here。其次,任何可能引起争论或可能有多种观点和意见的问题通常都不受欢迎。本站纯属问答(非讨论)。

所以,关于你 JavaScript 的问题,我可以帮助 > 我对 CoffeeScript 一无所知,除了它是 JavaScript 的更面向对象的包装器。我个人认为学习 JavaScript 更好。特别是随着新的 JavaScript 标准 (ECMAScript 6) 的出现,它有望让像 CoffeeScript 这样的东西变得不再需要(尽管只是恕我直言)。

当您调用 JavaScript 中的函数时,除了括号中定义的参数外,每个函数还有两个其他参数,thisarguments。忽略 this(除了说它是调用函数的对象上下文或全局对象),arguments 参数是一个类似数组的对象,包含传递给函数的所有参数.

在你的例子中,函数 race 根本没有定义参数(因此空括号 ()),所以函数使用 arguments 参数,每个函数都有一个默认获取。 arguments 参数很有用,因为它意味着您可以在 JavaScript 中编写一个函数,该函数可以使用您提供给它的任意数量的参数。

现在race函数也有很多简化的语法,所以我会重写扩展一下,这可能有助于理解:

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
};

现在上面的函数 slice 对我来说似乎不正确,它必须在其他地方的范围内。通常它是 Array.prototype.slice.call(arguments,1); 因为这里的目的是在像对象 (arguments) 这样的数组上使用数组函数,并且 array.prototype 的使用和调用在不同的上下文中执行函数.如果我失去了你,请原谅我,但如果你想了解更多,请查看 JavaScript 中的 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) : [];

现在对 runners 的赋值使用了三元运算符 (?:),它只是 if... else 语句的一行,即 (test) ? (do this if true) : (do this if false);

实际上我走得更远了。原来在一个语句中仍然有变量声明,然后在下一个语句中赋值。原文有一个逗号分隔两个作业。当在 javascript 中这样使用逗号(只是为了分隔表达式)时,每个逗号都会从左到右依次执行。在我看来,除了能够将它写在一行之外,您在这里并没有真正获得任何东西,您可以很容易地用分号替换它 (;)

其次,undefinednull。是的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 ,因为它实际上被定义了,只是什么都没有.

而且 undefinednull 在 JavaScript 的错误规则中都解析为 false,因此最后一行可能只是

if (elvis) {
    alert("I knew it!");
}

并且可能工作相同(唯一的问题可能是空字符串 "",因为它在 JavaScript 中也解析为 false,这可能不是您想要的行为) 不管怎样,如果你想知道更多只是 google JavaScript 真假。

最后,正如我之前所说,对 Coffeescript 了解不多,我认为你关于开源的问题会引起更多的讨论问题和意见,这不是真正正确的地方

您发布的代码是 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?