JavaScript || 或带有未定义变量的运算符

IT技术 javascript
2021-02-03 15:43:06

我最近一直在阅读一篇我读过的文章来自 Opera。

http://dev.opera.com/articles/view/javascript-best-practices/

在那篇文章中,他们写道:

JavaScript 中的另一种常见情况是为未定义的变量提供预设值,如下所示:

if(v){
  var x = v;
} else {
  var x = 10;
}

对此的快捷表示法是双管道字符:

var x = v || 10;

出于某种原因,我无法让它为我工作。是否真的可以检查是否v已定义,如果未定义x = 10

- 谢谢。布莱恩

6个回答

那篇 Opera 文章对正在发生的事情的描述很差。

虽然确实x会得到10if的值vundefined这也是事实,x将是10,如果v任何“falsey”值。

javascript 中的“falsey”值是:

  • 0
  • null
  • undefined
  • NaN
  • "" (空字符串)
  • false

所以你可以看到,除了 just 之外,还有很多情况x会被设置为10undefined

这是一些详细介绍逻辑运算符的文档(这是“逻辑 OR”。)它给出了几个用于此类赋值的示例。

快速示例:http : //jsfiddle.net/V76W6/

var v = 0;

var x = v || 10;

alert( x ); // alerts 10

分配v我上面指出的任何错误值,您将得到相同的结果。

另一种描述影响的方法是:jsfiddle.net/robertpitt/V76W6/1
2021-03-16 15:43:06
感谢您的回答,所以您认为最好这样做: var v = false; var x = v || 10; 警报(x)?
2021-03-25 15:43:06
@bryan:无需分配falsev. 如果你只是这样做var v;,它会自动有一个初始值undefined,所以如果v得到一些其他的非假值,x将被分配那个值。但是如果v没有分配任何东西,或者得到另一个 falsey 值,x将得到10. 请记住,这0是错误的。如果您绝对确定不希望x任何虚假值,则只应以这种方式使用“逻辑 OR”
2021-03-30 15:43:06
还有一个问题,为什么当我为 var a 赋值时:jsfiddle.net/bryansammon/V76W6/2 - 我仍然收到 10 的警报?
2021-04-05 15:43:06
@RobertPitt:有趣的方法。一下子把它全部放在那里。好的。
2021-04-10 15:43:06
var x = v || 10;

该运算符(“逻辑”或“短路” OR 运算符)通常会检查 的值v,如果它是“假”值(它会作为 if 语句中使用的条件失败),则10成为值of x,否则v执行(如果10是函数,则永远不会执行)。

undefined, null, 和0都是变量可以保存的假值的例子(是的,即使是第一个),并且运算符(或 if 语句)会相应地起作用。相比之下,所有对象和数组(不包括空值)都是“真实”值,它允许这样的事情(在 Google Analytics 跟踪器代码中使用):

var _gaq = _gaq || []; // Makes a new array _gaq if it is not already there

然而,如果引用的变量甚至没有在作用域链中的任何地方声明,那么就会发生 JavaScript 异常。

避免这种情况的一种方法是从一开始就声明所有全局变量:

var iAmAGlobalVariable;  // Holds the value undefined by default

如果这是不可能的,您应该使用typeof运算符它不会尝试评估其操作数,因此不会发生异常:

var x;
if(typeof v != 'undefined' && v) {
    x = v;
} else {
    x = 10;
}

或者更好的是,如果您知道该变量将是一个全局变量,则可以将其视为全局(窗口)对象的一个​​属性:

var x = window.v || 10;
很好解释的答案。
2021-04-08 15:43:06

如果v计算结果为 false(例如,0, null, false),则它将不起作用。您可以手动检查未定义:

var x = v !== undefined ? v : 10;

为此,我会在函数中使用三元等于三元。

function myTest(x){
 return x === undefined ? true: false;
}    

仅当 x 未定义时才返回真

请参阅(http://www.impressivewebs.com/why-use-triple-equals-javascipt/)和(http://jsfiddle.net/V76W6/

我只会使用 try-catch

var x = 0;

try
{
    x = v;
}
catch(err)
{
    x = 10;
}