No this it is not strange. You call the constructor of a data.frame with named and unnamed objects.
Originally I supposed that a data.frame is a list and use help(list) to explain the behaviour of data.frame. Even the philosophy is the same (named and unnamed argument) it was a mistake and the answer is in the help of data.frame
from ?data.frame I take this part where we speak about the names of arguments
If the arguments are all named and simple objects (not lists,
matrices of data frames) then the argument names give the column
names. For an unnamed simple argument, a deparsed version of the
argument is used as the name (with an enclosing I(...) removed).
So
x<-data.frame(name<-c("n1","n2"),age<-c(5,6))
this is equivalent to :
x <- data.frame(c("n1","n2"),c(5,6)) ## unnamed objects The functions return dotted pair list
name<-c("n1","n2")
age<-c(5,6)
Then for y
y<-data.frame(name=c("n1","n2"),age=c(5,6)) ## named objects functions return a list
But notice that this explain only the naming procedure for simple object argument. The naming is more complicated than adding some dots.
For example, I find very amazing that theses 2 statements are equivalent(with check.names=T or F) :
a <- data.frame(y <- list(x=1))
a <- data.frame(y = list(x=1))