【问题标题】:"To Be or Not to Be" about variables in JavaScript关于 JavaScript 中的变量的“To Be or Not to Be”
【发布时间】:2011-02-24 14:07:32
【问题描述】:

只是对 JavaScript 做一点介绍。我习惯于经常在 C++ 中测试我的指针是否存在,以免崩溃。

我从未读过《哈姆雷特》,但我读过 this page 关于 JavaScript 中的 nullundefined

简而言之,我可以:

if (varname == null)
if (varname === null)
if (typeof(varname) != 'undefined') 
if (varname != undefined)
if ('varname' in object) 
if (object.hasOwnProperty('varname')) 

老实说,这对我来说有点过分了 :)。 JavaScript 中测试变量以避免崩溃的经典方法是什么?

【问题讨论】:

  • 无事生非可能是另一个值得阅读的游戏:-)
  • 我从来不需要在 javascript o.O 中测试它
  • @Renanlf 你的脚本总是能无缝运行吗?
  • 是的...工作正常...但我不记得做了一些真正不同的事情然后为HTML标签设置一些CSS或值或属性...最详细的代码是Radix Sort in javascript...所以我从不担心
  • 说你从来不用担心这个是假的。这就像说你生来就有知识。我想说下面的答案表明这不是一件简单的事情,这是一个很好的问题,

标签: javascript variables null


【解决方案1】:

由于读取未声明的全局变量会引发错误,因此最好使用第三个示例(typeof 示例)检查变量。

if (varname == null)

将告诉您该值是否已定义且为空,如果未声明则抛出错误。

if (varname === null)

将告诉您该值是否已定义且完全为 null,如果未声明则抛出错误。

if (typeof(varname) != 'undefined')

会告诉你变量是否被定义而不抛出错误。

if (varname != undefined)

与第一个相反。

if ('varname' in object)

会告诉你对象本身是否有一个属性,或者它的原型链的某个地方。这不保证适用于宿主对象。

if (object.hasOwnProperty('varname'))

会告诉你对象是否有自己的属性,忽略原型链。 如果设置了名为“hasOwnProperty”的属性,这将中断。

if (Object.hasOwnProperty.call(object, 'varname'))

是上一个更可靠的版本。

【讨论】:

  • varname 未声明时,您会大惊小怪——您很可能想要因为输入错误而引发错误。 varname == null 是最有用的测试之一,因为它适用于 nullundefined。好的答案仍然+1。
  • 我支持这个。变量永远不应未声明。
  • @Box9,通常你是对的。我的印象是 OP 在询问如何进行功能测试,但如果与功能测试没有特别相关,那么您是对的。
  • +1 非常完整的答案。但实际上,在大多数情况下,只需要一个简单的if (a)...请参阅下面的帖子。
【解决方案2】:

通常的方法是使用值的真实性。

if(varname){

}

这涵盖了您提供的大部分示例

【讨论】:

  • 是的,但请注意,如果变量包含零或空字符串,它也被视为false ...
  • -1: 如果......好吧,varname 未定义,将失败并显示“varname is not defined” ;-)
  • @Capsule 啊...没有一行语句吗?
  • 这通常不是你想要的。您最终会拒绝完全合法的值,例如 0 或 false。
  • @lots of people,实际上varname 没有声明会失败,但声明但未定义则不会。
【解决方案3】:

最初的问题是这样的:在 JavaScript 中测试变量以避免崩溃的经典方法是什么?

这可能是经典的方式,当然也是非常实用的方式:

首先,您永远不应该有未声明的变量。使用JSLint 确保您没有这样做。

如果您认为a 是数字,if (a != null) 会告诉您其中是否有一些值(尽管可能是 NaN),if (a) 会告诉您其中是否有一些非零值。

如果您认为a 是一个字符串,if (a != null) 会告诉您其中是否有一些值(尽管可能是空字符串),if (a) 会告诉您字符串中是否至少有一个字符。

如果您认为a 是一个对象,if (a) 会告诉您它是否已定义。推论:if (a && a.prop==7) 是检查属性值的安全方法。

如果您不知道a 应该是什么,那么您仍然可以使用if (a) 安全地对其进行测试,尽管我不能确定结果会有多大用处。

(再说一次,如果您不知道 a 应该是什么,那么您遇到的问题比这里可以解决的要大得多。)

【讨论】:

    【解决方案4】:

    这取决于你必须对变量做什么。 null 可能是也可能不是一个完全可接受的值,具体取决于上下文(但我不得不承认我从来没有在 javascript 中很好地使用 null)。可能最安全的做法是在出现问题时依靠异常来捕获问题,而不是试图通过检查变量的存在来预测错误。

    另一方面,如果您将某些内容与nullundefined 进行比较,最好使用不需要类型强制的=== 运算符。

    更简单的检查if(variable) 将检查variable 不是假的(也就是说,它不是nullundefinedfalse0NaN-0 或空字符串)。

    最后,当您想要遍历对象的属性并排除从原型继承的属性时,hasOwnProperty 方法通常很有用。

    EDIT注意上面指的是未定义的变量,也就是声明为like的变量

    var variable;
    

    但未分配任何值,或函数中缺少参数。人们可能还想考虑处理根本未声明的变量的情况。在这种情况下,所有测试都像

    if(variable);
    if(variable === null);
    

    等会失败,报错。我知道处理这种情况的唯一安全方法是检查变量的类型。也就是说,typeof 运算符可以温和地处理不存在的变量。

    if(typeof variable === 'undefined')
    

    如果有则为真

    • variable 已声明但未定义,或
    • variable 根本没有声明。

    在任何情况下,最后一次检查都不会触发错误。

    【讨论】:

    • Hellloooo 人们,如果 varname 未定义,“if(varname)”会失败!
    • 虚假值包括NaN-0
    • 我真的很想知道为什么我的答案给出了一些选项,得到-1,而另一个只列出 if(varname) 的答案得到 +3。在任何情况下,如果 varname 未定义,if(varname) 将 not 失败。如果没有声明 varname,它会失败,这是另一个问题。请在投票前记录下来!
    • @Mike:抱歉,我忘记了 NaN。 -0 与 0 相同。
    • @Andrea。 -00 不同。 1/0 !== 1/-0。和1/Math.min(0, -0) === 1/Math.min(-0, 0),因此数学运算符需要通过将-0 视为0 之前的比较来保持区别。
    【解决方案5】:

    您需要了解的第一件事是严格的平等与真实或虚假。 Strict 使用三个等号,而真性使用 2。

    这些都是等价的:

    var a = false;
    if(!a)
    if(a == false)
    if(a != true)
    if(a == 0)
    if(a == "")
    

    使用三个标志是严格的。 False 表示假,而不是“假”:

    var a = false;
    if(a === false)
    if(a !== true)
    if(a !== anything_else)
    id(a === 0) // this will be false
    

    接下来,null 和 undefined 之间存在细微差别。 Null 表示已声明但无效(字面意思设置为“null”),undefined 表示已声明但未设置:

    window.a;
    console.log(a); // undefined
    
    window.a = null;
    console.log(a); // null
    

    最后,你不会使用 typeof 来判断真假。对于字符串或对象类型的东西更是如此。对象中的变量是属性,而不是变量,处理方式略有不同。

    【讨论】:

    • 未声明与未定义不同。
    • == 并不是一个真实的比较——它只允许类型强制。例如null 是假的,但false != null
    • @awm 那么你会怎么做才能防止这两种可能的崩溃原因呢?
    • @Stephane 给你写了一个很长的答案(如下)。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 2014-11-22
    • 2022-11-20
    • 1970-01-01
    • 2023-01-12
    • 2018-10-09
    • 2022-12-26
    • 1970-01-01
    相关资源
    最近更新 更多