Поскольку $results
является массивом пар ключ-значение (вместо просто значений), json_encode
закодирует его в объект (поскольку объекты имеют пары ключ-значение), когда у вас есть результаты, но пустой массив, когда его нет (потому что $results
- это массив).
Таким образом, когда результатов нет, результат, полученный из response.allResults
, является пустым массивом (его длина равна 0). Когда есть результаты, вы получаете объект с этими результатами. Объекты не имеют элемента длины, поэтому он не определен.
Когда вы делаете $(obj)
, где obj
- это какой-то объект (не массив), в результате получается такой объект:
{ 0: obj, length: 1 }
Когда вы делаете $(arr)
, где arr
- некоторый массив, в результате получается такой объект:
{ length: arr.length, 0: arr[0], 1: arr[1], etc. }
Поскольку ваш результат является пустым массивом при отсутствии результатов, объект, возвращаемый $(result)
, будет выглядеть так:
{ length: 0 }
Так что, если у вас есть результаты, длина $(result)
будет равна 1 (потому что ему был дан объект), а если у вас нет результатов, это будет 0 (потому что ему был дан пустой массив). $.size
просто возвращает $.length
, как указано на странице документа, на которую вы ссылались.