12

如果我知道该变量稍后将成为对象,我使用:

var obj;

但如果我将它初始化为 null 或 undefined 并不重要:

var obj = null;

或者

var obj = undefined;

对于我个人使用的字符串:

var str = '';

稍后我可以做

str += 'some text';

如果我使用 null 例如,我会得到“nullsome text”。

null, undefined, empty string or 0都是falsy值,以便检查它们是否已定义。如果我的变量将用作object, dom node, etc..,这是初始化变量的正确方法?

4

2 回答 2

13

默认初始化为undefined,直接使用即可,不用写出来:

var obj;

如果你想连接到一个字符串,使用'', 计数器使用0......只需使用常识。

于 2013-07-15T11:05:08.657 回答
5

在理想情况下,您只需在范围顶部声明变量,如下所示:

var foo, bar, obj, domNode;

所有这些变量都将是undefined,因为它们的值是undefined。例如,如果您知道这些变量之一将用作循环中的字符串,而不是写作foo = (foo === undefined ? '' : foo) + 'add this';,只需写:

var foo = '', bar, obj, domNode;

如果您打算将objvar 用作对象文字,只需{my: 'objec', vals: 'here'}在时机成熟时将其分配,或将其初始化为{},然后添加属性obj.as = 'you'; obj[foo] = 'go';。如果您要分配对 DOM 元素的引用,请保留它undefined,因为任何分配都只会产生毫无意义的开销。
任何类型的引用(函数对象、数组、对象......)也是如此。只是推迟分配,因为它只会覆盖任何以前的分配。

至于数字,undefined + 123将评估为NaN,因此在这种情况下,初始化为0是有意义的。但是,对于循环计数器:

var foo, i, obj, arr = [1,2,3];
for (i=0;i<arr.length;i++)
{
    console.log(arr[i]);
}

相当于:

var foo, i= 0, arr = [1,2,3];
for (;i<arr.length;i++)
{
    console.log(arr[i]);
}

只有后者几乎看起来大肆复杂。只要用你的常识,你会没事的。

只要知道变量声明被提升到范围的顶部,但赋值不是:

console.log(foo);//undefined
var foo = 123;
console.log(foo);//123

因为它被翻译成:

var foo;
console.log(foo);
foo = 123;
console.log(foo);

那么为什么不编写代码,因为它会被引擎解释呢?

于 2013-07-15T11:22:34.297 回答