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 中的函数时,除了括号中定义的参数外,每个函数还有两个其他参数,this
和 arguments
。忽略 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 中这样使用逗号(只是为了分隔表达式)时,每个逗号都会从左到右依次执行。在我看来,除了能够将它写在一行之外,您在这里并没有真正获得任何东西,您可以很容易地用分号替换它 (;
)
其次,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
,因为它实际上被定义了,只是什么都没有.
而且 undefined
和 null
在 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?
我在 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 中的函数时,除了括号中定义的参数外,每个函数还有两个其他参数,this
和 arguments
。忽略 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 中这样使用逗号(只是为了分隔表达式)时,每个逗号都会从左到右依次执行。在我看来,除了能够将它写在一行之外,您在这里并没有真正获得任何东西,您可以很容易地用分号替换它 (;
)
其次,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
,因为它实际上被定义了,只是什么都没有.
而且 undefined
和 null
在 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?