这些角色在Javascript中做了什么

时间:2013-02-01 04:35:37

标签: javascript character

我在这里查看了一段代码http://cssdeck.com/labs/bjiau4dy,我在Javascript框中看到了这一点 -

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!

那是做什么的?为什么它不会在控制台中抛出错误?

谢谢!

3 个答案:

答案 0 :(得分:4)

这些符号中的任何一个都将其后面的函数转换为函数表达式,而不是函数声明。将它们放在一起只是为了好玩。


如果您尝试通过在声明后放置()来调用常规函数:

function () {
    // this is a syntax error...
}();

你会收到语法错误:

  

SyntaxError:意外的令牌(

因为你不能调用函数声明。


因此人们通常在括号中包含一个匿名函数,将其转换为函数表达式:

(function () {
    // this will execute immediately
}());

你可以在这些符号之前做同样的事情:

!function () {
    // this will also execute immediately
}();

有关详细信息,请参阅此处:http://kangax.github.com/nfe/#expr-vs-decl

答案 1 :(得分:0)

除了作为风格水印之外,做一长串符号是没有意义的。

这组符号作为后续函数的一个操作,但什么都不做。

在JS中你可以写1或+1(一)或!1(假)或!+(仍为假)。这只是对以下功能起作用的长链。

所以!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1不会抛出错误。它的值是false

!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }只执行该函数并计算为false(但无论如何都没有对该值进行处理)

然而,因为某些东西,它将函数定义转换为操作并立即评估函数。但只是+function(){ ... }会做同样的事情。

答案 2 :(得分:0)

为了详细说明,这些运算符中的每一个都会在操作数上执行类型强制。 +会将其后的操作数转换为number-运算符也是如此。 !是not运算符,会将操作数转换为boolean(true / false)。

要记住的另一件事是,在Javascript中,一切都可以评估某种价值。这可能是一个“真实”或“虚假”的值,也可能有一个“数字”值(即使该值不是数字,AKA NaN)。

因此,如果你打开JSFiddle或Firebug,并弄乱这些值对函数的作用,你会发现它们也会产生某种新的返回值。

例如:

  1. !function(){}将计算为false的值(因为将函数对象强制转换为布尔值会产生true的值)。
  2. +function(){}将评估为NaN的值(因为将函数对象强制转换为数字会产生NaN)。使用-
  3. 可以看到相同的结果
  4. !+function(){}产生true(强制使用一些值NaN将产生false而不是false产生true。
  5. !+-+-+!function(){}结果为真(因为!function(){}产生false+false产生0,并将继续遍及所有+和{ {1}}运算符直到最后-被评估为真)。
  6. 应用像示例中列出的运算符将在!0,-1,0,1,false之间来回切换,直到所有运算符都已经过评估。
  7. 请注意,我使用Firebug检查了这些内容。浏览器之间可能存在差异,也许是Firebug在评估时向我们展示的内容。 TL; DR是Javascript执行大量类型强制,并且将以不同于声明的方式评估表达式。