Подтвердить что ты не робот

Почему javascript typeof всегда возвращает "объект"?

Для чего он используется, если всегда возвращает object как тип?

always for Elements or lists.

4b9b3361

Ответ 1

JS typeof не всегда возвращает "объект", но возвращает объект для вещей, которые люди не могут считать объектами, т.е. массивами, а также, что странно, для нулей.

Для массивов это правильно, поскольку в отношении JS массивы являются объектами; они то же самое. Массив - это еще один класс, и вы можете создавать объекты типа Array, но они по-прежнему рассматриваются как объекты.

Эта страница содержит список типов в JS, а также ответ, который вы получите для каждого из них из typeof. Он также имеет некоторый JS-код для переопределения функции typeof с той, которая возвращает более полезную информацию. Если вы беспокоитесь, что это не полезно, вы можете реализовать что-то подобное, если хотите.

Ответ 2

Он не всегда возвращает "объект":

alert(typeof "hello");

Тем не менее, (возможно) более полезный трюк для изучения объектов - использовать Object.prototype.toString.call() и посмотреть на результат:

var t = Object.prototype.toString.call(itIsAMystery);

Это даст вам строку типа [object Foo], где Foo будет конструктором (я думаю) интересной частью. Для "родных" типов (например, Date или String) вы возвращаете это имя конструктора.

Ответ 3

В моем опыте основная проблема с typeof связана с различием между массивами, объектами и нулями (все возвращают "объект" ).

Чтобы сделать это, я сначала проверяю typeof, затем проверяю нулевой регистр или конструктор "object", например:

for (o in obj) {
    if (obj.hasOwnProperty(o)) {
        switch (typeof obj[o]) {
            case "object":
                if (obj[o] === null) {
                    //do somethign with null
                } else {
                    if (obj[o].constructor.name === "Array") {
                        //do something with an Array
                    } else {
                        //do something with an Object
                    }
                }
                break;
            case "function":
                //do something with a function
                break;
            default:
                //do something with strings, booleans, numbers
                break;
        }
    }
}

Ответ 4

Нужно быть немного осторожным с оператором typeof. Он возвращает "объект" для null, "number" для NaN, "number" для Infinity, "object" для "нового Number (1)" и "object" для массива.

При проверке существования переменной (typeof variable! == "undefined" ) иногда необходимо сначала проверить, является ли (variable == null), потому что typeof возвращает "объект" для переменной, которой присваивается значение null,

Это немного очевидно, но также нужно быть осторожным, чтобы не вызывать функцию при проверке typeof, потому что будет возвращен тип возвращаемой функции, а не "функция".

Ответ 5

Чтобы добавить к другим, typeof возвращает оба объекта и примитивы. В javascript есть 5 примитивных типов: undefined, null, boolean, string и number. Все остальное - это объект. Когда typeof применяется к любому типу объекта, отличному от Function, он просто возвращает "объект" . При применении к функции он возвращает объект функции.

Итак, например:

  • typeof true;//возвращает примитивный тип "boolean"
  • typeof 123;//возвращает примитивный тип "число"
  • typeof null//возвращает "объект" , что является ошибкой, но до сих пор нет исправления в другой версии ECMAScript, просто поговорите об этом.
  • typeof object//возвращает "объект" , что имеет смысл

Чтобы изложить дальше ответ Pointy, в каждом объекте JavaScript есть внутреннее свойство, известное как [[Класс]] в ECMAScript 5. Чтобы отобразить фактическое значение объекта, вы можете ссылаться на [[Class]] свойство используя: Object.prototype.toString. Чтобы избежать некоторых специализированных встроенных объектов, переписывающих toString, вы используете внутренний метод вызова, который будет показывать фактический тип объекта.

Итак, вместо того, чтобы вернуть общий объект обратно из toString:

var dateObject = Object.prototype.toString(new Date);
document.write(dateObject);//[object Object]

Вы можете получить фактический тип объекта, используя Call:

var dateObject = Object.prototype.toString.call(new Date);
document.write(dateObject);//[object Date]

Ответ 6

Не все typeof возвращают объекты.

Объекты, массивы и RegEx возвращают тип object.

Функция, которая является объектом (ссылочный тип), но возвращает тип function. Это несоответствие в языке.

Следует также отметить, что undefined возвращает undefined, а null возвращает object, что является ошибкой в JS.

NaN (не число) возвращает тип number.

Лучше вы будете следить за всем этим и знать об этом странном поведении.

Для справки здесь приведены все типы значений:

typeof "Tamal" ---> string
typeof 100 ---> number
typeof true ---> boolean
typeof false ---> boolean
typeof undefined ---> undefined
typeof function() {} ---> function
typeof Symbol() ---> symbol
typeof {name: "Tamal"} ---> object
typeof [1, 2, 3] ---> object
typeof /^/ ---> object
typeof NaN ---> number
typeof null ---> object (bug)

Ответ 7

Вы должны понимать, что система типов в JavaScript динамична с несколькими "примитивными" типами, которые нужно использовать. Рассматривая все сложные объекты как тип "объект", вы можете использовать методы утиного типа и вызова, не обязательно знать тип передаваемого объекта, предполагая, что тип имеет реализованный вызов функции. На динамическом языке программирования все является "объектом".