JavaScript property access: dot notation vs. brackets?
(Sourced from here.)
Square bracket notation allows the use of characters that can't be used with dot notation:
var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax
including non-ASCII (UTF-8) characters, as in myForm["ダ"]
(more examples).
Secondly, square bracket notation is useful when dealing with
property names which vary in a predictable way:
for (var i = 0; i < 10; i++) {
someFunction(myForm["myControlNumber" + i]);
}
Roundup:
- Dot notation is faster to write and clearer to read.
- Square bracket notation allows access to properties containing
special characters and selection of
properties using variables
Another example of characters that can't be used with dot notation is property names that themselves contain a dot.
For example a json response could contain a property called bar.Baz
.
var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax
difference between dot notation and bracket notation in javascript
When you use dot notation, key
means the actual property in the object, which will not be there. So, undefined
is returned which is not equal to true
.
When you use []
notation you are accessing the property in the object with the name in the variable key
. So, that will work.
For example,
var myObj = {
myVar : 1
};
for (var key in myObj) {
console.log(key);
console.log(myObj.key);
console.log(myObj[key]);
}
This will print,
myVar
undefined
1
Because, myObj
has no member named key
(myObj.key
tries to get the member with the name key
) and in the next case, myObj
has a member named myVar
(myObj[key]
tries to get the member with the value in key
).
Dot Notation
jslint prefers dot notation.
[] Notation
This offers flexibility. You can dynamically access the members with a variable.
Difference between using bracket (`[]`) and dot (`.`) notation
Accessing members with .
is called dot notation. Accessing them with []
is called bracket notation.
The dot notation only works with property names which are valid identifier names [spec], so basically any name that would also be a valid variable name (a valid identifier, see also What characters are valid for JavaScript variable names?) and any reserved keyword [spec].
Bracket notation expects an expression which evaluates to a string (or can be coerced to a string), so you can use any character sequence as property name. There are no limits to what a string can contain.
Examples:
obj.foo; // valid
obj.else // valid, reserved keywords are valid identifier names
obj.42 // invalid, identifier names cannot start with numbers
obj.3foo // invalid, ""
obj.foo-bar // invalid, `-` is not allowed in identifier names
obj[42] // valid, 42 will be coerced to "42"
obj["--"] // valid, any character sequence is allowed
obj[bar] // valid, will evaluate the variable `bar` and
// use its value as property name
Use bracket notation:
- When the property name is contained in a variable, e.g.
obj[foo]
. - The property name contains characters not permitted in identifiers, e.g. starts with a digit†, or contains a space or dash (
-
), e.g.obj["my property"]
.
Use dot notation: In all other situations.
There is a caveat though regarding reserved keywords. While the specification permits to use them as property names and with the dot notation, not all browsers or tools respect this (notably older IE versions). So the best solution in my opinion is to avoid using reserved keywords for property names or use bracket notation if you cannot.
†: That's also the reason why you can only use bracket notation to access array elements. Identifiers cannot start with digits, and hence cannot consist only of digits.
Javascript Dot Notation vs Bracket Notation
for(var key in sunny){
console.log(sunny.key)
}
sunny.key in bracket notation is equivalent to sunny["key"]. It is searching for a property name "key" which is not there in your object.Hence returning undefined always.
key here is actually variable , not a string to extract the value of a property.
See : https://codeburst.io/javascript-quickie-dot-notation-vs-bracket-notation-333641c0f781
dot Notation vs bracket notation with Reactjs
This isn't specific to React, this is just a javascript question.
and these:
const new_ele_config = {...new_controls[ele]}
const new_ele_config = {...new_controls.ele}
are NOT the same thing.
const new_ele_config = {...new_controls['ele']}
would be the same asconst new_ele_config = {...new_controls.ele}
Because bracket notation allows for dynamic references, so ele
without quotes is seen as a variable, while with dot notation it's always seen as a string.
For the same reason you can't do Array.0 instead of Array[0]
javascript - dot vs bracket notation in enumeration
It is not working because there is no speargun property in the rockSpearguns object.
The reason is that in a JS object, all property keys are strings. When you use dot notation, JS is thinking you are looking for a key with the explicit key of whatever is after the dot.
In your code var speargun
is being replaced with a string value of each of the properties inside the rockSpearguns object.
So, guns[speargun].heft
translates to guns["Sharpshooter"].heft
I suggest you to read this article.
Related Topics
How Is a Promise/Defer Library Implemented
How to Join Two JavaScript Objects, Without Using Jquery
Copy a Variable's Value into Another
How to Replace a Regex Substring Match in JavaScript
Jquery Ajax Requests Are Getting Cancelled Without Being Sent
Referenceerror: Document Is Not Defined (In Plain JavaScript)
Case Insensitive Jquery Attribute Selector
Does JavaScript Process Using an Elastic Racetrack Algorithm
How to Make a Div Element Editable (Like a Textarea When I Click It)
Getting an Absolute Url from a Relative One. (IE6 Issue)
Cross Domain Post Request Is Not Sending Cookie Ajax Jquery
Reason Behind This Self Invoking Anonymous Function Variant
JavaScript New Date Ordinal (St, Nd, Rd, Th)
Spring Boot Controller - Upload Multipart and JSON to Dto
How to Get the Back Button to Work with an Angularjs Ui-Router State MAChine