这些字符在Javascript中做什么

这些字符在Javascript中做什么,javascript,character,Javascript,Character,我在这里浏览了一段代码,我在Javascript框中看到了这段代码- !+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+! 那有什么用?为什么它不在控制台中抛出错误呢 谢谢 这些符号中的任何一个都会将其后面的函数转换为函数表达式,而不是函数声明。把它们放在一起只是为了好玩 如果您试图通过在声明后面放置()来调用常规函数: function () { // this is a syntax error... }(); 您将得到一个语法错误

我在这里浏览了一段代码,我在Javascript框中看到了这段代码-

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


谢谢

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


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

function () {
    // this is a syntax error...
}();
您将得到一个语法错误:

SyntaxError:意外标记(

因为您不能调用函数声明


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

(function () {
    // this will execute immediately
}());
您可以通过预先添加这些符号中的任何一个来实现相同的目的:

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


有关更多信息,请参见此处:

除了作为风格水印之外,长符号集的使用没有任何意义

这组符号充当后续函数的操作,但不执行任何操作

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

所以
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-++!+-+-++!+-+-+-+!+-+-+-+!1
不会引发错误。但其值为
false

!+-+-+!+-+-+!+-+-+!+-+-++!+-+-+!+-+-++!+-+-++!+-+-+-+!function(){…}
只执行函数并计算为false(但无论如何都不会对值进行任何处理)


但是,由于存在某种东西,它会将函数定义转换为一个操作,并立即对函数求值也会做同样的事情。

更详细地说,这些操作符中的每一个都会对执行它的操作数执行类型强制。
+
会将它后面的操作数转换成一个
数字,就像
-
操作符一样。
是not操作符,会将操作数转换成
数字>布尔值
(真/假)

要记住的另一件事是,在Javascript中,任何东西都可以计算为某种值。这可能是一个“truthy”或“false”值,也可能有一个“number”值(即使该值不是一个数字,也称为
NaN

因此,如果您打开JSFIDLE或Firebug,并搞乱这些值对函数的作用,您可以看到它们还将产生某种新的返回值

例如:

  • !function(){}
    的计算值将为
    false
    (因为将函数对象强制为布尔值会产生
    true
  • +function(){}
    将求值为
    NaN
    (因为将函数对象强制为一个数字会产生
    NaN
    )。使用
    -
    可以看到相同的结果
  • !+function(){}
    产生true(强制一个数值
    NaN
    将产生
    false
    而非false产生true
  • !+-+-+!function(){}
    生成true(因为
    !function(){}
    生成
    false
    +false
    生成
    0
    ,并将继续贯穿所有
    +
    -
    操作符,直到最后
    !0
    被计算为true)
  • 像示例中列出的那样应用运算符将在
    false
    、-1、0、1、
    true
    之间来回移动,直到所有运算符都已计算完毕
  • 注意太长了,读不下去了,可能会有不同的浏览器,也许Fibug在评估上显示了什么。TL;DR是JavaScript做了很多类型的强制,并且会用不同的方式来评估表达式。