点和方括号表示法

IT技术 javascript syntax square-bracket
2021-03-03 10:06:51

我试图了解点和方括号表示法之间的区别。在 SO 和其他一些网站上查看各种示例时,我遇到了以下两个简单示例:

var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello

var user = {
  name: "John Doe",
  age: 30
};
var key = prompt("Enter the property to modify","name or age");
var value = prompt("Enter new value for " + key);
user[key] = value;
alert("New " + key + ": " + user[key]);

如果在第三行中我将 替换为obj[x]则第一个示例返回 y 未定义obj.x为什么不"hello"


但是在第二个示例中,表达式user[key]可以简单地替换为user.key没有任何异常行为(至少对我而言)。现在这让我很困惑,因为我最近了解到,如果我们想通过存储在变量中的名称访问属性,我们使用 [ ] 方括号表示法。

2个回答

在点表示法中,点后面的名称是被引用的属性的名称。所以:

var foo = "bar";
var obj = { foo: 1, bar: 2 };

console.log(obj.foo) // = 1, since the "foo" property of obj is 1,
                     //      independent of the variable foo

然而,在方括号表示法中,被引用的属性的名称 是方括号中任何内容

var foo = "bar";
var obj = { foo: 1, bar: 2 };

console.log(obj[foo])   // = 2, since the value of the variable foo is "bar" and
                        //      the "bar" property of obj is 2

console.log(obj["foo"]) // = 1, since the value of the literal "foo" is "foo" and
                        //      the "foo" property of obj is 1

换句话说,点符号obj.foo总是等价于obj["foo"],而obj[foo]取决于变量 的值foo


在您的问题的特定情况下,请注意点表示法和方括号表示法之间的区别:

// with dot notation
var obj = { name: "John Doe", age: 30 };
var key = "age";
var value = 60;

obj.key = value; // referencing the literal property "key"
console.log(obj) // = { name: "John Doe", age: 30, key: 60 }


// with square bracket notation
var obj = { name: "John Doe", age: 30 };
var key = "age";
var value = 60;

obj[key] = value; // referencing property by the value of the key variable ("age")
console.log(obj)  // = { name: "John Doe", age: 60 }
嘿 Frxstrem,非常感谢你,你的例子和你的解释消除了我对这个话题的所有疑虑,现在真是一种解脱...... :D 感谢一堆......
2021-04-23 10:06:51

从/在 JavaScript 对象中访问/创建属性可以通过两种方式完成

  1. 使用表示法
  2. 使用方括号表示法

每当某些属性未定义,即对象中不存在并且您尝试访问它时,您将获得undefined(显然,因为它不存在)。

因此,在第一个示例中,您正在访问一个属性,而在第二个示例中,您正在创建一个属性。因此,替换符号不会影响第二个示例中的代码。

这一行确实对我有帮助,“只要某个属性未定义,即对象中不存在,而您尝试访问它时,您将获得未定义”
2021-05-21 10:06:51