为什么使用数组符号而不是点符号检查变量是否存在?

时间:2014-10-13 02:11:31

标签: javascript

我正在查看https://www.youtube.com/iframe_api,它以:

开头
if (!window['YT']) {
    var YT = {
        loading: 0,
        loaded: 0
    };
}

if (!window['YTConfig']) {
    var YTConfig = {
        'host': 'http://www.youtube.com'
    };
}

我不明白为什么检查变量不使用点符号,例如:

if (!window.YT) {
    var YT = {
        loading: 0,
        loaded: 0
    };
}

if (!window.YTConfig) {
    var YTConfig = {
        'host': 'http://www.youtube.com'
    };
}

这只是个人偏好吗?或者有影响吗?

3 个答案:

答案 0 :(得分:3)

此具体示例中没有任何含义

使用数组表示法的常见原因是字符串包含特殊字符

// something like
obj["hello world"]

// or like
obj["hello-world"]

另一个原因是,您要访问的密钥是变量

var foo = "hello";
obj[foo] === obj.hello;

否则

// these are the same
obj.foo === obj["foo"]

答案 1 :(得分:1)

当字符串不包含任何不能在标识符中使用的字符时,按名称或使用字符串访问属性之间没有区别。

请注意,代码的编写就好像变量是在if语句中创建的,如果它们不存在的话。变量实际上总是存在,因为声明被提升到作用域的开头,所以if语句只检查变量是否包含假值。

代码的作者或许认为通过使用字符串访问变量来检查变量的存在会更安全,但是没有这样的差异。在这种情况下,无论如何都不需要任何这样的谨慎,因为变量肯定总是存在。

代码相当于:

var YT, YTConfig;

if (!YT) {
  YT = {
    loading: 0,
    loaded: 0
  };
}

if (!YTConfig) {
  YTConfig = {
    'host': 'http://www.youtube.com'
  };
}

如果在此代码之前确实存在任何变量,则此变量的声明将被忽略,即该变量不会被重复声明重新声明。

答案 2 :(得分:0)

在您的具体示例中,绝对没有区别。他们都访问相同的变量。

然而,每种方法都有优点和缺点。

点符号

就我个人而言,我每次使用点符号都不需要使用数组符号。通过.分隔每个对象级别,它更具可读性。

office.employees[0].empNumberoffice['employees'][0]['empNumber']更具可读性。 (它们都访问相同的变量)

数组表示法

使用数组表示法有三个主要原因:

  1. 当您访问数字索引数组(员工[0],员工[1],...

  2. 当您需要将变量用作键(phonelist[customerServiceID]时,其中customerServiceID是一个变量,可以是数字或字符串)

  3. 正如@naomik在回答中指出的那样,特殊字符作为键也会让你需要使用数组符号。