除了第一种形式可以使用变量而不仅仅是字符串文字这一显而易见的事实之外,是否有任何理由使用其中一种而不是另一种,如果是这样,在哪些情况下?
在代码:
// Given:
var foo = {'bar': 'baz'};
// Then
var x = foo['bar'];
// vs.
var x = foo.bar;
上下文:我写了一个代码生成器,产生这些表达式,我想知道哪个更可取。
除了第一种形式可以使用变量而不仅仅是字符串文字这一显而易见的事实之外,是否有任何理由使用其中一种而不是另一种,如果是这样,在哪些情况下?
在代码:
// Given:
var foo = {'bar': 'baz'};
// Then
var x = foo['bar'];
// vs.
var x = foo.bar;
上下文:我写了一个代码生成器,产生这些表达式,我想知道哪个更可取。
如果属性名有特殊字符,则需要使用括号:
var foo = {
"Hello, world!": true,
}
foo["Hello, world!"] = false;
除此之外,我想这只是个人喜好的问题。恕我直言,点表示法更短,而且更明显地表明它是一个属性而不是数组元素(当然JavaScript没有关联数组)。
(来源此处)
方括号表示法允许使用点表示法不能使用的字符:
var foo = myForm.foo[];//错误的语法 var foo = myForm["foo[]"];//正确的语法
包括非ascii (UTF-8)字符,如myForm["ダ"](更多示例)。
其次,方括号符号在处理时很有用 以可预测的方式变化的属性名:
For (var I = 0;I < 10;我+ +){ someFunction(myForm["myControlNumber" + i]); }
摘要:
点表示法写起来更快,读起来更清楚。 方括号符号允许访问包含 特殊字符的选择 使用变量的属性
不能与点表示法一起使用的字符的另一个例子是本身包含点的属性名。
例如,json响应可以包含一个名为bar.Baz的属性。
var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax
括号表示法允许您通过存储在变量中的名称访问属性:
var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello
obj。X在这种情况下不成立。
一般来说,他们做同样的工作。 尽管如此,括号符号给了你做点符号做不到的事情的机会,比如
var x = elem["foo[]"]; // can't do elem.foo[];
这可以扩展到任何包含特殊字符的属性。
在ie8中,点表示法不适用于某些关键字(如new和class)。
我有这样的代码:
//app.users is a hash
app.users.new = {
// some code
}
这会触发可怕的“期望标识符”(至少在IE8和windows xp上,我还没有尝试过其他环境)。简单的解决方法是切换到括号符号:
app.users['new'] = {
// some code
}
括号表示法可以使用变量,所以它在两个点表示法不起作用的情况下很有用:
1)动态确定属性名时(直到运行时才知道确切的名称)。
2)当使用for..in循环遍历对象的所有属性时。
来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
使用这些符号时要小心: 如。如果我们想访问一个窗口的父函数。 在IE中:
window['parent']['func']
并不等同于
window.['parent.func']
我们可以用:
window['parent']['func']
or
window.parent.func
访问它
[]符号有用的情况:
如果您的对象是动态的,并且在键中可能有一些随机值,如number和[]或任何其他特殊字符,例如-
var a = {1:3};
如果你试图访问a。1,它会报错,因为它期待的是一个字符串。
让我再添加一些方括号符号的用例。如果你想访问一个属性,比如对象中的x-proxy,那么-将被错误地解释。还有一些其他的情况,比如空格,点,等等,点运算对你没有帮助。另外,如果你在一个变量中有键,那么在一个对象中访问键值的唯一方法是用括号符号。希望你能了解更多的背景。
The two most common ways to access properties in JavaScript are with a dot and with square brackets. Both value.x and value[x] access a property on value—but not necessarily the same property. The difference is in how x is interpreted. When using a dot, the part after the dot must be a valid variable name, and it directly names the property. When using square brackets, the expression between the brackets is evaluated to get the property name. Whereas value.x fetches the property of value named “x”, value[x] tries to evaluate the expression x and uses the result as the property name.
So if you know that the property you are interested in is called “length”, you say value.length. If you want to extract the property named by the value held in the variable i, you say value[i]. And because property names can be any string, if you want to access a property named “2” or “John Doe”, you must use square brackets: value[2] or value["John Doe"]. This is the case even though you know the precise name of the property in advance, because neither “2” nor “John Doe” is a valid variable name and so cannot be accessed through dot notation.
对于数组
数组中的元素存储在属性中。因为这些属性的名称都是数字,而且我们经常需要从变量中获取它们的名称,所以我们必须使用括号语法来访问它们。数组的length属性告诉我们它包含多少个元素。这个属性名是一个有效的变量名,我们事先知道它的名字,所以要找到一个数组的长度,你通常写array。长度,因为它比数组[" Length "]更容易写。
当-时必须使用方括号
属性名是number。 Var ob = { 1:“一个”, 7:“7” } ob.7 // SyntaxError ob[7] // " 7 " 属性名有特殊字符。 Var ob = { 'This is one': 1, 这是7:7, } ob.'This is one' // SyntaxError ob['这是一个']// 1 属性名被赋给一个变量,您要访问 属性值。 Var ob = { “一”:1、 “七”:7, } var _Seven = ' 7 '; b. _seven //未定义 ob[_Seven] // 7 .使用实例
点表示法总是可取的。如果你正在使用一些“更聪明的”IDE或文本编辑器,它将显示来自该对象的未定义名称。 只有当你的名字有破折号或类似无效的东西时,才使用括号符号。如果名称存储在变量中也一样。
foo。Bar和foo[" Bar "]访问foo上的属性,但不一定是相同的属性。区别在于如何解释bar。当使用点时,点后面的单词是属性的字面名称。使用方括号时,将计算方括号之间的表达式以获得属性名。而foo。Bar获取 属性的值名为"bar", foo["bar"]尝试计算表达式"bar"并使用转换为字符串的结果作为属性名
点表示法的局限性
如果我们拿这个物体:
const obj = {
123: 'digit',
123name: 'start with digit',
name123: 'does not start with digit',
$name: '$ sign',
name-123: 'hyphen',
NAME: 'upper case',
name: 'lower case'
};
使用点符号访问它们的专有属性
obj.123; // ❌ SyntaxError
obj.123name; // ❌ SyntaxError
obj.name123; // ✅ 'does not start with digit'
obj.$name; // ✅ '$ sign'
obj.name-123; // ❌ SyntaxError
obj.'name-123';// ❌ SyntaxError
obj.NAME; // ✅ 'upper case'
obj.name; // ✅ 'lower case'
但对于括号符号来说,这些都不是问题:
obj['123']; // ✅ 'digit'
obj['123name']; // ✅ 'start with digit'
obj['name123']; // ✅ 'does not start with digit'
obj['$name']; // ✅ '$ sign'
obj['name-123']; // ✅ 'does not start with digit'
obj['NAME']; // ✅ 'upper case'
obj['name']; // ✅ 'lower case'
使用variable访问变量:
const variable = 'name';
const obj = {
name: 'value'
};
// Bracket Notation
obj[variable]; // ✅ 'value'
// Dot Notation
obj.variable; // undefined
或者当你想动态改变一个元素的classList动作时:
// Correct
showModal.forEach(node => {
node.addEventListener(
'click',
() => {
changeClass(findHidden, 'remove'); // Correct
},
true
);
});
//correct
function changeClass(findHidden, className) {
for (let item of findHidden) {
console.log(item.classList[className]('hidden'));// Correct
}
}
// Incorrect
function changeClass(findHidden, className) {
for (let item of findHidden) {
console.log(item.classList.className('hidden')); // Doesn't work
}
}
我举了另一个例子来清楚地理解用法上的差异。当使用嵌套数组和嵌套对象时
const myArray = [
{
type: "flowers",
list: [ "a", "b", "c" ],
},
{
type: "trees",
list: [ "x", "y", "z" ],
}
];
现在如果我们想要访问树列表中的第二项是y。
我们不能一直用括号
const secondTree = myArray[1]["list"][1]; // incorrect syntex
相反,我们必须使用
const secondTree = myArray[1].list[1]; // correct syntex
点表示法和括号表示法都用于在JavaScript中访问对象属性。点表示法是最常用的,因为它更容易阅读和理解。为什么我们要用括号,这两者有什么区别呢?好吧,方括号符号[]允许我们使用变量访问对象属性,因为它将方括号内的表达式转换为字符串。
Const person = { 名称:“约翰”, 年龄:30 }; / /点符号 const nameDot = person.name; console.log (nameDot); / /“约翰” const name括号= person['name']; console.log (nameBracket); / /“约翰”
现在,让我们看一个变量的例子:
Const person = { 名称:“约翰”, 年龄:30 }; const myName = 'name'; console.log(人[名字]); / /“约翰”
点表示法的另一个优点是只包含字母数字(以及_和$),例如,如果你想访问一个像下面这样的对象(包含'-',你必须使用括号表示法)
Const person = { my-name: John } console.log(人['我的名字']);/ /“约翰” / / console.log (person.my-name);/ /错误