这些字符在Javascript中做什么
What do these characters do in Javascript
我 http://cssdeck.com/labs/bjiau4dy 在这里浏览一段代码,我在 Javascript 框中看到了这个 -
!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!+-+-+!
这有什么作用?为什么它不会在控制台中抛出错误?
谢谢!
这些符号中的任何一个都会将它后面的函数转换为函数表达式,而不是函数声明。把它们放在一起只是为了好玩。
如果您尝试通过将 ()
放在声明之后来调用常规函数:
function () {
// this is a syntax error...
}();
你将收到语法错误:
语法错误:意外的令牌 (
因为你不能调用函数声明。
所以人们通常将匿名函数包装在括号中,将其转换为函数表达式:
(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
,-
运算符也是如此。 !
是 not 运算符,会将操作数转换为boolean
(真/假)。
要记住的另一件事是,在Javascript中,一切都可以评估为某种值。这可以是"真"或"假"值,也可以有一个"数字"值(即使该值不是数字,又名NaN
)。
因此,如果你打开JSFiddle或Firebug,并弄乱这些值对函数的作用,你可以看到它们也会产生某种新的返回值。
例如:
-
!function(){}
的计算结果为false
(因为将函数对象强制转换为布尔值会产生true
的值)。 -
+function(){}
的计算结果为NaN
(因为将函数对象强制转换为数字会产生NaN
)。使用-
可以看到相同的结果。 -
!+function(){}
产生真(强制一些值NaN
将产生false
而不是假产生真。 -
!+-+-+!function(){}
产生 true(因为!function(){}
产生false
,+false
产生0
,并将持续贯穿所有这些+
和-
运算符,直到最终!0
被评估为 true)。 - 应用示例中列出的运算符将在
false
、-1、0、1true
之间来回切换,直到计算完所有运算符。
请注意,我使用Firebug检查了这些。浏览器之间可能存在差异,也许Firebug在评估中向我们展示了什么。TL;DR是Javascript做了很多类型强制,并且计算表达式的方式与声明不同。
- 这是什么 ==- javascript 运算符
- 使用较少代码隐藏和显示选择菜单内容的更好方法是什么?javascript
- 我可以使用什么Javascript或Jquery库来处理带有IE8的GANTT图表
- 这是什么JavaScript语法
- 并行开发同步/阻塞和异步/非阻塞库api的好方法是什么?(JavaScript)
- 我用什么javascript解析器在node的javascript中重新实现jsCoverage
- 两个代码之间的区别是什么(javascript的循环)
- 在循环中定义函数的最佳方法是什么?- JavaScript
- 存在什么 JavaScript 库,允许部分加载较大的图像
- 可以使用什么 Javascript 正则表达式模式来捕获可能嵌套括号中的文本
- 我如何知道在运行 V8 时编译了什么 JavaScript
- 这是什么javascript命令
- 我如何使用Firebug来告诉我正在激发什么JavaScript
- 如何处理这个琐事游戏的答案I'我在做什么?(Javascript)
- 我的代码中缺少什么?Javascript和XML
- duojs使用什么javascript模块api
- 我使用什么JavaScript模式从原型方法访问私有方法
- 确定在chrome中调用什么javascript函数
- 在一个函数中,返回另一个函数的目的是什么?(Javascript)
- 看看当你按下一个按钮时使用了什么(javascript)函数