Javascript 感叹号在函数之前做什么?
它返回语句的计算结果是否为false。例如:Javascript 感叹号在函数之前做什么?,javascript,function,Javascript,Function,它返回语句的计算结果是否为false。例如: !function () {}(); 可以使用它两次将值强制为布尔值: !false // true !true // false !isValid() // is not valid 因此,要更直接地回答您的问题: !!1 // true !!0 // false 编辑:它的副作用是将函数声明更改为函数表达式。例如,以下代码无效,因为它被解释为缺少所需标识符(或函数名称)的函数声明: 它返回语句的计算结果是
!function () {}();
可以使用它两次将值强制为布尔值:
!false // true
!true // false
!isValid() // is not valid
因此,要更直接地回答您的问题:
!!1 // true
!!0 // false
编辑:它的副作用是将函数声明更改为函数表达式。例如,以下代码无效,因为它被解释为缺少所需标识符(或函数名称)的函数声明:
它返回语句的计算结果是否为false。例如:
!function () {}();
可以使用它两次将值强制为布尔值:
!false // true
!true // false
!isValid() // is not valid
因此,要更直接地回答您的问题:
!!1 // true
!!0 // false
编辑:它的副作用是将函数声明更改为函数表达式。例如,以下代码无效,因为它被解释为缺少所需标识符(或函数名称)的函数声明:
职能:
function () { return false; }(); // syntax error
不返回任何内容(或未定义)
有时,我们希望在创建函数时正确调用它。您可能会尝试以下方法:
function () {}
但它会导致一个语法错误
使用函数将其视为表达式之前的code>运算符,因此我们可以调用它:
function () {}()
这也将返回与函数返回值相反的布尔值,在本例中为true
,因为!未定义的
为真
。如果希望实际返回值是调用的结果,请尝试以下方法:
!function () {}()
职能:
function () { return false; }(); // syntax error
不返回任何内容(或未定义)
有时,我们希望在创建函数时正确调用它。您可能会尝试以下方法:
function () {}
但它会导致一个语法错误
使用函数将其视为表达式之前的code>运算符,因此我们可以调用它:
function () {}()
这也将返回与函数返回值相反的布尔值,在本例中为true
,因为!未定义的
为真
。如果希望实际返回值是调用的结果,请尝试以下方法:
!function () {}()
JavaScript语法101。下面是一个函数声明:
(function () {})()
请注意,没有分号:这只是一个函数声明。您需要一个调用,foo()
,才能实际运行该函数
(function(){})();
现在,当我们添加看似无害的感叹号时:!函数foo(){}
将其转换为表达式。它现在是一个函数表达式
!function bool() { return false; }() // true
!function bool() { return true; }() // false
当然,代码>本身并不能调用函数,但我们现在可以将()
放在末尾:!函数foo(){}()
,其优先级高于
并立即调用该函数
(function(){})();
因此,作者所做的是为每个函数表达式保存一个字节;更具可读性的书写方式是:
function foo() {}
最后,
使表达式返回true。这是因为默认情况下,所有立即调用的函数表达式(IIFE)都返回未定义的,,这给我们留下了!未定义
,即为真
。不是特别有用。JavaScript语法101。下面是一个函数声明:
(function () {})()
请注意,没有分号:这只是一个函数声明。您需要一个调用,foo()
,才能实际运行该函数
(function(){})();
现在,当我们添加看似无害的感叹号时:!函数foo(){}
将其转换为表达式。它现在是一个函数表达式
!function bool() { return false; }() // true
!function bool() { return true; }() // false
当然,代码>本身并不能调用函数,但我们现在可以将()
放在末尾:!函数foo(){}()
,其优先级高于
并立即调用该函数
(function(){})();
因此,作者所做的是为每个函数表达式保存一个字节;更具可读性的书写方式是:
function foo() {}
最后,
使表达式返回true。这是因为默认情况下,所有立即调用的函数表达式(IIFE)都返回未定义的,,这给我们留下了!未定义
,即为真
。不是特别有用。感叹号使任何函数始终返回布尔值。
最后一个值是函数返回值的求反
(function(){})();
省略上述示例中的代码>将是一个语法错误
!function bool() { return false; }() // true
!function bool() { return true; }() // false
然而,实现这一目标的更好方法是:
function bool() { return true; }() // SyntaxError
感叹号使任何函数始终返回布尔值。
最后一个值是函数返回值的求反
(function(){})();
省略上述示例中的代码>将是一个语法错误
!function bool() { return false; }() // true
!function bool() { return true; }() // false
然而,实现这一目标的更好方法是:
function bool() { return true; }() // SyntaxError
使用有一个很好的理由上标记的函数调用的代码>
一般来说,在单独的文件(aka模块)上使用这种技术是一个好主意,这些文件后来被连接起来。这里需要注意的是,文件应该由将新文件放在新行的工具连接起来(这对于大多数concat工具来说都是常见的行为)。在这种情况下,请使用
将有助于避免前面连接的模块遗漏尾随分号时出现错误,但这将提供将它们按任意顺序排列的灵活性,而无需担心
(function bool() { return true; })() // true
工作原理与
!function abc(){}();
!function bca(){}();
但保存一个字符和任意的外观更好
顺便说一句,+
,-
,~
,void
操作符中的任何一个在调用函数方面都具有相同的效果,可以肯定的是,如果您必须使用某个东西从该函数返回,它们的行为会有所不同
!function abc(){}();
(function bca(){})();
但如果您使用IIFE模式进行一个文件一个模块的代码分离,并使用concat工具进行优化(这使得一行一个文件工作),那么构建
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
将执行安全代码执行