Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript或(| |)变量赋值说明_Javascript_Variables_Variable Assignment_Or Operator - Fatal编程技术网

JavaScript或(| |)变量赋值说明

JavaScript或(| |)变量赋值说明,javascript,variables,variable-assignment,or-operator,Javascript,Variables,Variable Assignment,Or Operator,给出这个JavaScript片段 var a; var b = null; var c = undefined; var d = 4; var e = 'five'; var f = a || b || c || d || e; alert(f); // 4 有人能给我解释一下这种技术叫什么吗(我最好的猜测是在这个问题的标题中!)?它究竟是如何/为什么工作的 我的理解是,变量f将被指定第一个变量的最接近值(从左到右),该变量的值不是空的,也不是未定义的,但我还没有找到很多关于这项技术的参考

给出这个JavaScript片段

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4
有人能给我解释一下这种技术叫什么吗(我最好的猜测是在这个问题的标题中!)?它究竟是如何/为什么工作的

我的理解是,变量
f
将被指定第一个变量的最接近值(从左到右),该变量的值不是空的,也不是未定义的,但我还没有找到很多关于这项技术的参考资料,并且已经看到它被大量使用


另外,这种技术是特定于JavaScript的吗?我知道在PHP中执行类似操作会导致
f
具有真正的布尔值,而不是
d
本身的值。

请参阅以获取解释。这是实现这些运营商的常见方式;它不是JavaScript独有的。

JavaScript变量不是类型化的,因此可以为f分配一个整数值,即使它是通过布尔运算符分配的

f被指定为不等于false的最近值。因此0、false、null、未定义都被传递:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'

它没有任何魔力。像
a | | b | | c | | d
这样的布尔表达式是惰性计算的。Interpeter查找
a
的值,它是未定义的,所以它是false,所以它继续,然后它看到
b
是null,它仍然给出false结果,所以它继续,然后它看到
c
-同样的故事。最后,它看到
d
并说“嗯,它不是空的,所以我有我的结果”,然后它将其分配给最后一个变量


这个技巧适用于所有对布尔表达式进行惰性短路计算的动态语言。在静态语言中,它不会编译(类型错误)。在热衷于计算布尔表达式的语言中,它将返回逻辑值(即在本例中为true)。

这意味着如果设置了
x
,则
z
的值将为
x
,否则如果设置了
y
,则其值将设置为
z
的值

这和

if(x)
  z = x;
else
  z = y;
这是可能的,因为JavaScript中的逻辑运算符不返回布尔值,而是返回完成操作所需的最后一个元素的值(在OR语句中,它将是第一个非假值,在AND语句中,它将是最后一个非假值)。如果操作失败,则返回
false

这是为了在
x
变量为false的情况下指定默认值,在这种情况下为
y

JavaScript中的布尔运算符可以返回一个操作数,但不总是像其他语言中那样返回布尔结果

逻辑OR运算符(
|
)返回其第二个操作数的值,如果第一个操作数为falsy,则返回第一个操作数的值

例如:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

Falsy值是在布尔上下文中使用时强制为
false
的值,它们是
0
null
未定义的
,一个空字符串,
NaN
,当然
false

它将计算X,如果X不是null,则计算空字符串,或0(逻辑false),然后将其分配给z。如果X为null、空字符串或0(逻辑错误),那么它将把y分配给z

var x = '';
var y = 'bob';
var z = x || y;
alert(z);

将输出“bob”

它将新变量(
z
)设置为
x
的值,如果它是“truthy”(非零,有效的对象/数组/函数/无论它是什么)或
y
。在
x
不存在的情况下,这是一种相对常见的提供默认值的方法

例如,如果您有一个接受可选回调参数的函数,则可以提供一个不做任何事情的默认回调:

function doSomething(data, callback) {
    callback = callback || function() {};
    // do stuff with data
    callback(); // callback will always exist
}
JavaScript用于逻辑运算符
|
&&
但是,它与其他语言的不同之处在于,它返回停止执行的最后一个值的结果,而不是
true
false
值。

以下值在JavaScript中被认为是错误的

  • 假的
  • 空的
  • (空字符串)
  • 0
  • 未定义
忽略规则并保持简单,下面的示例显示了停止计算并返回结果的值

false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
NaN
之前的前5个值都是错误的,因此它们都是从左到右求值的,直到满足第一个真实值-
“Hello”
,这使得整个表达式为真,因此不会求值更高的值,而
“Hello”
将作为表达式的结果返回。同样,在这种情况下:

1 && [] && {} && true && "World" && null && 2010 // null
前5个值都是真值,并进行求值,直到它满足使表达式为假的第一个假值(
null
),因此不再求值
2010
,并且作为表达式的结果返回
null

您给出的示例是利用JavaScript的这个属性执行赋值。它可以在任何需要获取一组值中第一个truthy或falsy值的地方使用。下面的代码将把值
“Hello”
分配给
b
,因为这样可以更容易地分配默认值,而不是执行if-else检查

var a = false;
var b = a || "Hello";
您可以将下面的示例称为对该特性的利用,我相信这会使代码更难阅读

var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
在警报内部,我们检查
消息是否为假,如果是,则计算并返回
noNewMessagesText
,否则计算并返回
newMessagesText
。由于在本例中是falsy,我们在NonewmessageText处暂停,并提醒“对不起,您没有新消息。”

根据Bill Higgins的博客帖子;(2007年2月),从v1.2开始,这种行为是正确的(至少)

他还建议它的另一个用途(引用): “跨浏览器差异的轻量级标准化

Ret
// determine upon which element a Javascript event (e) occurred
var target = /*w3c*/ e.target || /*IE*/ e.srcElement;
  null || undefined || false || 0 || 'apple'  // Return apple
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f =  ( a ) ? a : 
                ( b ) ? b :
                       ( c ) ? c :
                              ( d ) ? d :
                                      e;

alert(f); // 4
function theSameOldFoo(name){ 
  name = name || 'Bar' ;
  console.log("My best friend's name is " + name);
}
theSameOldFoo();  // My best friend's name is Bar
theSameOldFoo('Bhaskar');  // My best friend's name is Bhaskar`