No references to offer, sorry. Only my opinion based on experience:
An empty table tells the user that the current page could possibly have some relevant info (they can deduce the kind of info and layout from column headers).
Rule of thumb I apply (in enterprise environment):
- empty table is useful if the user can do something on the same page to instantly populate the table, without a noticable reload, e.g. set or clear filters, enter search text, add/ delete a row etc etc).
- do not show an empty table if the user cannot populate the table by an action on the same page, e.g. empty table is the result of search on another page that results in no items founds, list is today's todo-items and there are no todo's etc.
Display a message (inside the empty table or instead of the table), but make sure that the message clearly communicates what you want the user to do, and this may be context sensitive.
- messages like "there is no content", "no items found" are too generic, and do not provide the user with any useful info.
- "click here to add another to-do item" with a button could be useful
- "there are no todo-items for today" would be helpful. Please note that the text here could vary depending on filters set by the user.
The last context-sensitive messages usually require more coding in the backend: a simple if list.length == 0 then display "nothing found"
does not suffice. But for intuitive and user-friendly UX, it is worth the effort.