Every string can be seen as an array of bytes.
aString db "abcdef", 13, 10, "$"
byteArray db "a", "b", "c", "d", "e", "f", 13, 10, "$"
You can output both in the same way:
mov dx, offset aString
mov ah, 09h ; DOS.PrintString
int 21h
mov dx, offset byteArray
mov ah, 09h ; DOS.PrintString
int 21h
This works because the elements in an array follow each other close in memory and so there's no real difference in the storage for aString and the storage for byteArray.
What helps to differentiate is that when people talk about an array they are mostly interested in the numerical value that is stored in the array element as opposed to when they talk about a string they don't care about the actual ASCII code for the characters that make up the string.
In aString db "abcdef", 13, 10, "$" we see the characters a, b, ...
In byteArray db "a", "b", "c", "d", "e", "f", 13, 10, "$" we rather see the numbers 97, 98, ... (Normally we would also have written it with numbers to start with!)
But not every array is a string because you can have arrays with word-sized elements, or dword-sized elements.
byteArray db 1, 2, 3 <== 3 bytes storage
wordArray dw 1, 2, 3 <== 6 bytes storage
dwordArray dd 1, 2, 3 <== 12 bytes storage