这些字符在JavaScript中做什么?

What do these characters do in Javascript

本问题已经有最佳答案,请猛点这里访问。

我在这里浏览了一段代码http://cssdeck.com/labs/bjiau4dy,我在javascript框中看到了这段代码。-

1
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!

那有什么用?为什么它不在控制台中抛出错误呢?

谢谢!


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

如果您试图通过在声明后立即放置EDOCX1[0]来调用正则函数:

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

您将得到一个语法错误:

SyntaxError: Unexpected token (

因为不能调用函数声明。

因此,人们通常将匿名函数用括号括起来,将其转换为函数表达式:

1
2
3
(function () {
    // this will execute immediately
}());

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

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

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


更详细地说,这些运算符中的每一个都将对继续执行它的操作数执行类型强制。+将其后面的操作数转换为number-运算符也是如此。!是not运算符,它将把操作数转换成boolean(真/假)。

要记住的另一件事是,在JavaScript中,所有东西都可以有某种价值的评估。这可能是一个"真实的"或"虚假的"值,也可能有一个"数字"值(即使该值不是一个数字,也称为NaN)。

因此,如果您打开jsfiddle或firebug,然后乱弄这些值对函数的作用,您可以看到它们也会产生某种新的返回值。

例如:

  • !function(){}将计算为false的值(因为将函数对象强制为布尔值会产生true的值)。
  • +function(){}将计算为NaN的值(因为将函数对象强制为数字会产生NaN)。使用-也可以看到同样的结果。
  • !+function(){}产生真(强制一系列值NaN将产生false而非假产生真。
  • !+-+-+!function(){}的结果为真(因为!function(){}的结果为false+false的结果为0的结果,并将继续贯穿所有这些+-的运算符,直到最终!0被评估为真)。
  • 应用示例中所列的运算符将在false、-1、0、1、true之间来回切换,直到对所有运算符进行了评估。
  • 注意,我用Firebug检查了这些。浏览器之间可能存在差异,也许Firebug在评估中向我们展示了什么。tl;dr是javascript执行大量类型强制,并且将以不同于声明的方式对表达式进行计算。


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

    这组符号对后面的函数起到操作的作用,但不起任何作用。

    在JS中,您可以编写1或+1(one)或!1或!+1(仍然错误)。这只是一个作用于以下函数的长链。

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

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

    但是,由于存在某些内容,它将函数定义转换为一个操作,并立即对函数进行评估。但只有江户十一〔六〕也会做同样的事。