I have a function which parses the address components of the Google Maps API JSON
and then returns the city / locality / route name.
The getAddressComponent()
returns a null
if it cannot find the key.
let route = getAddressComponent(addressComponents, 'route').value.long_name;
So let's say it didn't find the key, then I get a Error: TypeError: Cannot read property 'long_name' of undefined
obviously because it's not defined.
How do I check for null
in javascript other than the conditional method (a === null)
?
How can I simply check like this with ?
EDIT : Safe Navigation Operator
let route = getAddressComponent(addressComponents, 'route')?.value.long_name;
And if it doesn't exists, it could probably set route
to null
instead of throwing a Error ?
2020 Answer, It Exists!!!
You can now directly use ?.
inline to test for existence. It is called the Optional Chaining Operator
, supported by all modern browsers.
If a property exists, it proceeds to the next check, or returns the value. Any failure will immediately short-circuit and return undefined
.
const example = {a: ["first", {b:3}, false]}
example?.a // ["first", {b:3}, false]
example?.b // undefined
example?.a?.[0] // "first"
example?.a?.[1]?.a // undefined
example?.a?.[1]?.b // 3
domElement?.parentElement?.children?.[3]?.nextElementSibling
To ensure a default defined value, you can use ??
. If you require the first truthy value, you can use ||
.
example?.c ?? "c" // "c"
example?.c || "c" // "c"
example?.a?.[2] ?? 2 // false
example?.a?.[2] || 2 // 2
If you do not check a case, the left-side property must exist. If not, it will throw an exception.
example?.First // undefined
example?.First.Second // Uncaught TypeError: Cannot read property 'Second' of undefined
?.
Browser Support - 78%, July 2020
??
Browser Support - 78%
What you want is a null coalescent operator.
Javascript doesn't have one. Most of the time peoples use the logical OR ||
for this purpose but it doesn't work on property access.
There's proposal for adding null coalescing to the language, but it's nowhere near:
https://github.com/tc39/proposal-nullish-coalescing
https://tc39.github.io/proposal-nullish-coalescing/
If you really, really, absolutly want to use it you can use this Babel plugin:
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
But I would strongly suggest you don't: this may never make it to the language and you would have unvalid code in your codebase.
Code below simplified return num ? num : 0
for me:
return num || 0;
let component = getAddressComponent(addressComponents, 'route');
let route = component ? component : null
you can use the ?
operator to check the value is true
or false
then set the value in javascript null
will be false
For empty strings you can use !
:
var foo = 'yo';
console.log(!foo);
var foo = null;
console.log(!foo);
And for the ?
you asked about, it's the Conditional (ternary) Operator, the syntax is condition ? if true : if false
you can use it as follows:
var foo = 'yo';
console.log('1 : ' + (!foo ? 'Null' : 'Not Null'));
console.log('2 : ' + (foo === null ? 'Null' : 'Not Null'));
console.log('3 : ' + (foo == null ? 'Null' : 'Not Null'));
var foo = null;
console.log('1 : ' + (!foo ? 'Null' : 'Not Null'));
console.log('2 : ' + (foo === null ? 'Null' : 'Not Null'));
console.log('3 : ' + (foo == null ? 'Null' : 'Not Null'));
.?
cannot be used in javascript, for that, you might look into typescript.
For example, you can use try...catch
construction:
let route
try {
route = getAddressComponent(addressComponents, 'route').value.long_name
} catch (error) {
route = null
}