繁体   English   中英

JavaScript 函数表达式前的加号

[英]JavaScript plus sign in front of function expression

我一直在寻找有关立即调用函数的信息,并且在某处偶然发现了这个符号:

+function(){console.log("Something.")}()

有人可以向我解释函数前面的+号是什么意思/是什么意思吗?

它强制解析器将+后面的部分视为表达式。 这通常用于立即调用的函数,例如:

+function() { console.log("Foo!"); }();

如果没有+ ,如果解析器处于期望语句(可以是表达式或多个非表达式语句)的状态,则function一词看起来像是函数声明的开头而不是函数表达式,因此()跟随它(上面一行末尾的那些)将是一个语法错误(在那个例子中缺少名称也是如此)。 使用+ ,它使它成为一个函数表达式,这意味着名称是可选的,并且会导致对函数的引用,该函数可以被调用,因此括号是有效的。

+只是选项之一。 它也可以是- , ! , ~或几乎任何其他一元运算符。 或者,您可以使用括号(这更常见,但在语法上既不正确也不正确):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());

@TJCrowder's answer的附属, +通常用于强制数值转换, 如this SO answer所解释的那样 在这种情况下,它被称为“一元加运算符”(为了便于谷歌搜索)。

var num = +variant;

因此,在函数前面,它可以是一种强制将函数的结果解释为数字的方法。 我怀疑它是否会发生,但理论上 JIT 可以使用它来将函数编译为仅数字函数等。但是,为了防止在更大的表达式中使用一元加号时进行连接,您需要括号:

blah + (+(function(){ var scope; return "4"; })());

所以简短的回答是,它通过以一种或另一种方式使用函数结果来防止语法错误。

您还可以使用void运算符指示引擎您甚至对返回值不感兴趣:

void function() { console.log("Foo!"); }();

当然,在整个事物周围放置大括号也可以达到这个目的。

解决方案和起源

函数前的+号,实际上称为一元加号,是一元运算符组的一部分,并且(一元加号)用于将字符串和其他表示形式转换为数字(整数或浮点数)。

一元运算是只有一个操作数的运算,即单个输入。 这与使用两个操作数的二元运算相反

基本用途:

const x = "1";
const y = "-1";
const n = "7.77";

console.log(+x);
// expected output: 1

console.log(+n);
// expected output: 7.77

console.log(+y);
// expected output: -1

console.log(+'');
// expected output: 0

console.log(+true);
// expected output: 1

console.log(+false);
// expected output: 0

console.log(+'hello');
// expected output: NaN

+号位于变量、函数或任何返回的字符串表示之前时,输出将转换为整数或浮点数; 一元运算符 ( + ) 也会转换非字符串值truefalsenull

高级用途

使用您上面提到的功能的正确方法是:

+function(){return "3.141"}()
// expected output: 3.141

我喜欢使用+new Date()对象转换为时间戳,如下所示:

+new Date()
// expected output: 1641387991035

其他一元运算符

-一元否定运算符将其操作数转换为 Number 类型,然后将其取反。

~按位非运算符。

! 逻辑非运算符。

delete delete 运算符从对象中删除属性。

void void 运算符丢弃表达式的返回值。

typeof typeof 运算符确定给定对象的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM