【问题标题】:JavaScript || or operator with an undefined variableJavaScript ||或带有未定义变量的运算符
【发布时间】:2011-01-02 02:49:44
【问题描述】:

我最近一直在做一些阅读,我读到的一篇文章来自 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

--谢谢。 布莱恩

【问题讨论】:

  • 效果很好!我每天都这样做。
  • 从什么意义上说它对你不起作用?你能详细说明吗?当 v = 0 时,您的解决方案都不起作用,这是一个不同的事实。
  • 如果您专门使用整数,那么您应该使用var x = v > 0 ? v : 10

标签: javascript


【解决方案1】:

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

虽然如果vundefined,则x 将获得10 的值。如果v 具有任何“假”值,x 也将是10

javascript 中的“假”值是:

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

因此您可以看到,除了 undefined 之外,x 将设置为 10 的很多情况。

Here's some documentation 详细说明了逻辑运算符。 (这个是“逻辑或”。)它给出了几个例子来说明这种赋值的用法。

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

var v = 0;

var x = v || 10;

alert( x ); // alerts 10

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

【讨论】:

  • 感谢您的回答,因此您认为最好这样做:var v = false;变量 x = v || 10个;警报(x)?
  • 另一种描述影响的方式是:jsfiddle.net/robertpitt/V76W6/1
  • @bryan:没有必要将false 分配给v。如果你只是简单地做var v;,它会自动有一个初始值undefined,所以如果v 得到一些其他的非假值,x 将被分配那个值。但是如果v 没有被分配任何东西,或者得到另一个虚假值,x 将得到10。请记住,0 是错误的。如果您绝对确定不希望 x 具有 any 错误值,则应仅以这种方式使用“逻辑 OR”。
  • @RobertPitt:有趣的方法。有点一下子就把它全部放在那里。不错。
  • 再问一个问题,为什么我在这个上为 var a 赋值:jsfiddle.net/bryansammon/V76W6/2 - 我仍然收到 10 的警报?
【解决方案2】:
var x = v || 10;

该运算符("logical" or "short-circuit" OR operator)通常会检查 v 的值,如果它是一个“假”值(,它将作为 if 语句中使用的条件失败) ),10 成为x 的值,否则v 会(如果10 是一个函数,它将永远不会被执行)。

undefinednull0 都是变量可以保存的虚假值的示例(是的,甚至是第一个),并且运算符(或 if 语句)会相应地执行。相比之下,所有对象和数组(不包括 null)都是“真实”值,这允许这样的事情(在 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 operator。它不会尝试评估其操作数,因此不会发生异常:

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

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

var x = window.v || 10;

【讨论】:

  • 很好解释的答案。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    仅当 x 未定义时才返回 true

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

    【讨论】:

      【解决方案5】:

      我只会使用 try-catch

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

      【讨论】:

        【解决方案6】:

        下面是如何让它工作:

        var v;         //declare v as undefined
        //  v = 5;     //if uncommented x will be 5   
        
        var x = v || 10;
        alert(x);      //output: 10
        

        http://jsfiddle.net/uLLtu/1/

        【讨论】:

        • 只是为了那些仍然看不到“javascript”并认为“jquery”的少数坚持者的利益,$(function() { ... }); 就是 Eric 所说的“文档就绪的东西”;它是 jQuery 对 $(document).ready(function() { ... }); 的简写,它(通常)在 DOM 完成加载时调用(但在 window 上的 load 事件之前)。我不知道为什么它首先包含在这个答案中。
        • @eyelidlessness 感谢您的澄清,您说得对,不需要它,我只是忘记删除它们,我首先使用标记来说明 var 内容而不是警报。
        • 我继续删除了您评论的那一部分。如果您愿意我不这样做,请随时回滚。
        猜你喜欢
        • 2019-03-22
        • 1970-01-01
        • 2022-10-18
        • 2020-03-13
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多