这些字符在Javascript中做了什么?
这个问题在这里已经有了答案:
任何这些符号都会将后面的函数转换为函数表达式,而不是函数声明。 把他们放在一起只是为了好玩。
如果您尝试通过在声明后立即放置()
来调用常规函数:
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
除了作为风格水印之外,做长符号集有零点。
该组符号充当后续功能的操作,但什么都不做。
在JS中,您可以编写1
或+1(一)或!1
(假)或!+1(仍然为假)。 这只是那些对以下功能起作用的长链。
所以!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!1
不会抛出错误。 它的价值虽然是false
。
和!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!function(){ ... }
只是执行函数并计算为false(但是,无论如何都没有对值做任何处理)
但是,由于存在某些东西,它将函数定义转换为操作并立即评估函数。 但只是+function(){ ... }
会做同样的事情。
再详细一点,这些操作符中的每一个实际上都会对操作数进行类型强制操作。 +
会将后面的操作数转换为number
, -
操作符也是如此。 !
是非运算符,并将操作数转换为boolean
(真/假)。
还有一点需要记住的是,在Javascript中,所有东西都可以评估为某种价值。 这可能是一个“truthy”或“falsey”的值,也可能有一个“数字”值(即使该值不是数字,AKA NaN
)。
所以,如果你打开JSFiddle或者Firebug,并且弄清楚这些值的作用,你可以看到它们也会产生某种新的返回值。
例如:
!function(){}
将计算为false
值(因为强制函数对象为布尔值会产生true
值)。 +function(){}
将计算为NaN
值(因为强制函数对象为数字会产生NaN
)。 使用-
可以看到相同的结果。 !+function(){}
产生true(强制许多值NaN
将产生false
而不是false产生true。 !+-+-+!function(){}
产生true(因为!function(){}
产生false
, +false
产生0
,并且将继续贯穿所有这些+
和-
操作符,直到finally !0
被计算为真) 。 false
,-1,0,1, true
,直到所有的运营商都进行了评估。 请注意,我使用Firebug检查了这些。 浏览器之间可能存在差异,也许Firebug向我们展示了评估内容。 TL; DR是Javascript执行大量类型的强制操作,并且将对表达式的评估与声明不同。
链接地址: http://www.djcxy.com/p/94931.html