javascript:如果变量不存在则定义变量

joh*_*ack 52 javascript variables

我觉得我想尝试做一些超级简单的事情,但只是对它愚蠢.

我想要做的就是查看先前是否已设置变量,如果它没有,请将其设置为默认值....这里是一个示例:

if(!embed_BackgroundColor) {
    var embed_BackgroundColor;
    embed_BackgroundColor = "#F4F4F4";
}
Run Code Online (Sandbox Code Playgroud)

所以,一旦你停止嘲笑我的代码....为什么它会覆盖变量,无论如何?

请保佑我的神经;)

cal*_*ird 77

专业风格:

var SomeVar = SomeVar || 'Default Value';
Run Code Online (Sandbox Code Playgroud)

  • 一句警告:如果`SomeVar`可能是false-y值,这将失败.像''',`false`和`0`这样的东西会跳过`||`并设置默认值如果你想`SomeVar`能够成为'false-y'值,那就用三元组,比如在@Jhuni中回答(但是在这个中使用var关键字).同意@dylnmc,这导致了无情的重新分配.@Paolo Berantino有我认为'正确'的答案.我个人非常不同意"小而紧凑"是"Pro Style".我们不再使用穿孔卡了,js minifiers等于其余部分. (11认同)
  • 使用这种方法我收到`Uncaught ReferenceError:my_var未定义`(Chrome -v 48.0) (6认同)
  • :\ 这不会将 `SomeVar` 重新分配给自身吗?事实上,它看起来像一种“专业”风格,但它确实 - 事实上 - 似乎有些未优化(尤其是 for/while 循环)。我会坚持如果。但是,我可能是错的,解释器可能会认识到它不需要将 `var` 存储回 *本身*。 (2认同)
  • 由于@Fodagus提到的问题,错误的答案和"亲"肯定不会这样做.另外我怀疑它可能在某些JS引擎中不起作用,具有某些严格的设置或短路,因为它分配了一个可能不存在的值(这可能是@popas的问题).只需使用'typeof Somevar ==='undefined'`的正确方法来避免所有这些问题. (2认同)

Pao*_*ino 59

if (typeof variable === 'undefined') {
    // variable is undefined
    // eg:
    // var variable = "someValue";
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定为什么这是被接受的.它似乎使用上面的代码(使用`var variable ="someValue";`line uncommented导致`variable`总是等于"someValue",即使它已经被定义了. (3认同)
  • @pedz没关系,因为'var'关键字会使if变量中的变量重新定义,即使它永远不会进入if块.JS没有"块级范围变量定义". (3认同)
  • @Mike如果已经定义了,你就不会进入if条件. (2认同)

小智 49

在这种情况下,使用三元运算符将是一个很好的编码实践.与typeof相比,你也不需要有三个相同的符号.这是最简洁的解决方案:

b = typeof(b) == 'undefined' ? 0 : b;
Run Code Online (Sandbox Code Playgroud)

这有希望节省你的手一些时间.

  • 我认为必须使用`===`而不是`==` (5认同)

Zec*_*ecc 29

要真正回答你为什么会发生这种情况的问题 - 这只是两年多一点的时间:D - ,这是因为可变的提升.

基本上,在全局作用域内或在函数内执行代码之前有一个阶段,其中代码被扫描所有varfunction声明(不要与函数表达式混淆,但这是一个不同的故事).
然后,所有这些变量和函数都在当前作用域内声明,之后才会实际运行代码.

无论它们在代码中的位置如何,都会发生这种情况,其范围对应于函数体,而不是语句块.而且这使得这更加反直觉,即使你在声明中为变量设置初始值,它们仍将保持"空",直到在正常执行流程中再次达到声明.

所以当你写:

if(!embed_BackgroundColor) {
    var embed_BackgroundColor;
    embed_BackgroundColor = "#F4F4F4";
}
Run Code Online (Sandbox Code Playgroud)

实际发生的是这个:

  1. 扫描代码以进行var声明.embed_BackgroundColor在此范围内声明,无论它是否已经声明.其初始值未定义.

  2. 代码的执行开始.该if声明已经运行.变量声明,但它的价值是不确定的,所以条件为真.使用typeof不会帮助您区分未声明和声明但尚未设置的变量.无论如何它没有任何区别.

  3. var声明由代码的正常流量达到.如果你给变量一个初始值,它现在就已经设置好了.在这种情况下没有任何反应

  4. embed_BackgroundColor设置为值"#F4F4F4".

所以,底线是:您可以typeof variable == 'undefined'像在其他答案中看到的那样使用,或者甚至像您最初使用的那样使用简单的"!变量",但不要使用var或者会破坏一切.


Mos*_*oss 11

我更喜欢这种语法:

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

不能比这简单得多!它似乎工作,即使它已经变了.

  • ```ReferenceError:embed_BackgroundColor未定义```需要首先定义```var embed_BackgroundColor``` (8认同)

小智 10

如果它是一个全局变量,我喜欢这样做:

var defineMe = window.defineMe || 'I will define you now';
Run Code Online (Sandbox Code Playgroud)

使用窗口命名空间很重要,因为引用未定义的变量会导致非常糟糕的错误,但引用未定义的属性则不会.