当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《javascript:如果变量不存在则定义变量》经验,为你挑选了6个好方法。

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

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

if(!embed_BackgroundColor) {
    var embed_BackgroundColor;
    embed_BackgroundColor = "#F4F4F4";
}

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

请保佑我的神经;)



1> calmbird..:

专业风格:

var SomeVar = SomeVar || 'Default Value';


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

2> Paolo Bergan..:
if (typeof variable === 'undefined') {
    // variable is undefined
    // eg:
    // var variable = "someValue";
}


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

3> 小智..:

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

b = typeof(b) == 'undefined' ? 0 : b;

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


我认为必须使用`===`而不是`==`

4> Zecc..:

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

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

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

所以当你写:

if(!embed_BackgroundColor) {
    var embed_BackgroundColor;
    embed_BackgroundColor = "#F4F4F4";
}

实际发生的是这个:

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

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

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

    embed_BackgroundColor设置为值"#F4F4F4".

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



5> Moss..:

我更喜欢这种语法:

embed_BackgroundColor = embed_BackgroundColor || "#F4F4F4"

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


```ReferenceError:embed_BackgroundColor未定义```需要首先定义```var embed_BackgroundColor```

6> 小智..:

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

var defineMe = window.defineMe || 'I will define you now';

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

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有