Created
August 1, 2016 18:05
-
-
Save AndreSteenveld/7e71a2cbe9870cb3ec81a9c7982eaaee to your computer and use it in GitHub Desktop.
Checking for a key in a javascript object
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// To quickly check the result of this file run it in the babel-repl which can be found at: https://babeljs.io/repl/ | |
// This script can be found the with the following link: https://babeljs.io/repl/#?evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-0%2Cstage-1%2Cstage-2%2Cstage-3&experimental=true&loose=false&spec=false&code=%0Aconst%0A%20%20%20%20object_with_value%20%3D%20%7B%20value%20%3A%20false%20%7D%2C%0A%20%20%20%20object_with_getter%20%3D%20%7B%20%0A%0A%20%20%20%20%20%20%20%20get%20value(%20)%7B%20%0A%20%20%20%20%20%20%20%20%20%20%20%20console.log(%20%22Tripped%20the%20getter%22%20)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%20%0A%0A%20%20%20%20%7D%2C%0A%0A%20%20%20%20instance_with_value%20%3D%20Object.create(%20object_with_value%20)%2C%0A%20%20%20%20instance_with_getter%20%3D%20Object.create(%20object_with_getter%20)%3B%0A%0A%2F%2F%0A%2F%2F%20What%20we%20are%20looking%20for%20is%20a%20way%20to%20check%20the%20presence%20of%20a%20property%20and%20not%20the%20value%2C%20several%20commonly%20used%0A%2F%2F%20methods%20are%20show%20below.%0A%2F%2F%20%0A%0Aconsole.log(%20%22%5CnChecking%20just%20check%20the%20property%20for%20truthy-ness%20(the%20initial%20cause%20of%20this%20bug)%22%20)%3B%0A%0Aconsole.log(%20%60%20%20object%20with%20value%20%5B%20%24%7B%20object_with_value.value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20object%20with%20getter%20%5B%20%24%7B%20object_with_getter.value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20value%20%5B%20%24%7B%20instance_with_value.value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20getter%20%5B%20%24%7B%20instance_with_getter.value%20%7D%20%5D%60%20)%3B%0A%0A%0Aconsole.log(%20%22%5CnCheck%20if%20the%20type%20is%20not%20undefined%22%20)%3B%0A%0Aconsole.log(%20%60%20%20object%20with%20value%20%5B%20%24%7B%20%22undefined%22%20!%3D%3D%20typeof%20object_with_value.value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20object%20with%20getter%20%5B%20%24%7B%20%22undefined%22%20!%3D%3D%20typeof%20object_with_getter.value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20value%20%5B%20%24%7B%20%22undefined%22%20!%3D%3D%20typeof%20instance_with_value.value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20getter%20%5B%20%24%7B%20%22undefined%22%20!%3D%3D%20typeof%20instance_with_getter.value%20%7D%20%5D%60%20)%3B%0A%0A%0Aconsole.log(%20%22%5CnCheck%20if%20'value'%20is%20in%20object%22%20)%3B%0A%0Aconsole.log(%20%60%20%20object%20with%20value%20%5B%20%24%7B%20%22value%22%20in%20object_with_value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20object%20with%20getter%20%5B%20%24%7B%20%22value%22%20in%20object_with_getter%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20value%20%5B%20%24%7B%20%22value%22%20in%20instance_with_value%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20getter%20%5B%20%24%7B%20%22value%22%20in%20instance_with_getter%20%7D%20%5D%60%20)%3B%0A%0A%0Aconsole.log(%20%22%5CnObject.hasOwnProperty%22%20)%3B%0A%0Aconsole.log(%20%60%20%20object%20with%20value%20%5B%20%24%7B%20Object.prototype.hasOwnProperty.call(%20object_with_value%2C%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20object%20with%20getter%20%5B%20%24%7B%20Object.prototype.hasOwnProperty.call(%20object_with_getter%2C%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20value%20%5B%20%24%7B%20Object.prototype.hasOwnProperty.call(%20instance_with_value%2C%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20getter%20%5B%20%24%7B%20Object.prototype.hasOwnProperty.call(%20instance_with_getter%2C%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0A%0A%0Aconsole.log(%20%22%5CnObject.keys(%20...%20).includes(%20...%20)%22%20)%0A%0Aconsole.log(%20%60%20%20object%20with%20value%20%5B%20%24%7B%20Object.keys(%20object_with_value%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20object%20with%20getter%20%5B%20%24%7B%20Object.keys(%20object_with_getter%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20value%20%5B%20%24%7B%20Object.keys(%20instance_with_value%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20getter%20%5B%20%24%7B%20Object.keys(%20instance_with_getter%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0A%0A%0Aconsole.log(%20%22%5CnObject.getOwnPropertyNames(%20...%20).includes(%20...%20)%22%20)%0A%0Aconsole.log(%20%60%20%20object%20with%20value%20%5B%20%24%7B%20Object.getOwnPropertyNames(%20object_with_value%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20object%20with%20getter%20%5B%20%24%7B%20Object.getOwnPropertyNames(%20object_with_getter%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20value%20%5B%20%24%7B%20Object.getOwnPropertyNames(%20instance_with_value%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0Aconsole.log(%20%60%20%20instance%20with%20getter%20%5B%20%24%7B%20Object.getOwnPropertyNames(%20instance_with_getter%20).includes(%20%22value%22%20)%20%7D%20%5D%60%20)%3B%0A | |
const | |
object_with_value = { value : false }, | |
object_with_getter = { | |
get value( ){ | |
console.log( "Tripped the getter" ); | |
return false; | |
} | |
}, | |
instance_with_value = Object.create( object_with_value ), | |
instance_with_getter = Object.create( object_with_getter ); | |
// | |
// What we are looking for is a way to check the presence of a property and not the value, several commonly used | |
// methods are show below. | |
// | |
console.log( "\nChecking just check the property for truthy-ness (the initial cause of this bug)" ); | |
console.log( ` object with value [ ${ object_with_value.value } ]` ); | |
console.log( ` object with getter [ ${ object_with_getter.value } ]` ); | |
console.log( ` instance with value [ ${ instance_with_value.value } ]` ); | |
console.log( ` instance with getter [ ${ instance_with_getter.value } ]` ); | |
console.log( "\nCheck if the type is not undefined" ); | |
console.log( ` object with value [ ${ "undefined" !== typeof object_with_value.value } ]` ); | |
console.log( ` object with getter [ ${ "undefined" !== typeof object_with_getter.value } ]` ); | |
console.log( ` instance with value [ ${ "undefined" !== typeof instance_with_value.value } ]` ); | |
console.log( ` instance with getter [ ${ "undefined" !== typeof instance_with_getter.value } ]` ); | |
console.log( "\nCheck if 'value' is in object" ); | |
console.log( ` object with value [ ${ "value" in object_with_value } ]` ); | |
console.log( ` object with getter [ ${ "value" in object_with_getter } ]` ); | |
console.log( ` instance with value [ ${ "value" in instance_with_value } ]` ); | |
console.log( ` instance with getter [ ${ "value" in instance_with_getter } ]` ); | |
console.log( "\nObject.hasOwnProperty" ); | |
console.log( ` object with value [ ${ Object.prototype.hasOwnProperty.call( object_with_value, "value" ) } ]` ); | |
console.log( ` object with getter [ ${ Object.prototype.hasOwnProperty.call( object_with_getter, "value" ) } ]` ); | |
console.log( ` instance with value [ ${ Object.prototype.hasOwnProperty.call( instance_with_value, "value" ) } ]` ); | |
console.log( ` instance with getter [ ${ Object.prototype.hasOwnProperty.call( instance_with_getter, "value" ) } ]` ); | |
console.log( "\nObject.keys( ... ).includes( ... )" ) | |
console.log( ` object with value [ ${ Object.keys( object_with_value ).includes( "value" ) } ]` ); | |
console.log( ` object with getter [ ${ Object.keys( object_with_getter ).includes( "value" ) } ]` ); | |
console.log( ` instance with value [ ${ Object.keys( instance_with_value ).includes( "value" ) } ]` ); | |
console.log( ` instance with getter [ ${ Object.keys( instance_with_getter ).includes( "value" ) } ]` ); | |
console.log( "\nObject.getOwnPropertyNames( ... ).includes( ... )" ) | |
console.log( ` object with value [ ${ Object.getOwnPropertyNames( object_with_value ).includes( "value" ) } ]` ); | |
console.log( ` object with getter [ ${ Object.getOwnPropertyNames( object_with_getter ).includes( "value" ) } ]` ); | |
console.log( ` instance with value [ ${ Object.getOwnPropertyNames( instance_with_value ).includes( "value" ) } ]` ); | |
console.log( ` instance with getter [ ${ Object.getOwnPropertyNames( instance_with_getter ).includes( "value" ) } ]` ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment