Certain attributes may be specified by providing just the attribute name, with no value.
In the following example, the disabled attribute is given with the empty attribute syntax:
Note that empty attribute syntax is exactly equivalent to specifying the empty string as the value for the attribute, as in the following example.
So you are allowed to use empty custom data attributes, but special handling needed to use them as boolean.
If you are accessing attribute through element.dataset:
When an empty attribute is present, it's value is "".
When an attribute is absent, you are getting undefined.
Therefore, you can't just check as if (element.dataset.myattr) because it will always be false.
You can and should check boolean attributes as if (element.dataset.myattr !== undefined).
Lloyd's answer is incorrect. He mentions link to boolean attributes microsyntax, but data-* attributes are not specified as boolean in spec.