Skip to content

Instantly share code, notes, and snippets.

@AndreSteenveld
Created August 1, 2016 18:05
Show Gist options
  • Save AndreSteenveld/7e71a2cbe9870cb3ec81a9c7982eaaee to your computer and use it in GitHub Desktop.
Save AndreSteenveld/7e71a2cbe9870cb3ec81a9c7982eaaee to your computer and use it in GitHub Desktop.
Checking for a key in a javascript object
// 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