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

Я создаю временный файл во время выполнения.

Вот как я это делаю:

#!/bin/sh
# check if lock file exists
if [ -e /tmp/script.lock ]; then
  echo "script is already running"
else
# create a lock file
  touch /tmp/script.lock
  echo "run script..."
#remove lock file
 rm /tmp/script.lock
fi
19
задан Penny Liu 3 September 2019 в 02:21
поделиться

7 ответов

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

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

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

21
ответ дан 30 November 2019 в 03:52
поделиться

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

alert(typeof "hello");

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

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

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

7
ответ дан 30 November 2019 в 03:52
поделиться

По моему опыту, главная проблема с typeof заключается в различении массивов, объектов и нулей (все возвращают «объект»).

Для этого я сначала проверяю typeof, а затем проверяю нулевой регистр или конструктор «объекта», например:

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;
        }
    }
}
2
ответ дан 30 November 2019 в 03:52
поделиться

Нужно быть немного осторожнее с оператором typeof. Он возвращает «объект» для нуля, «число» для NaN, «число» для бесконечности, «объект» для «нового числа (1)» и «объект» для массива.

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

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

1
ответ дан 30 November 2019 в 03:52
поделиться

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

Так, например:

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

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

Таким образом, вместо получения универсального объекта из 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]
1
ответ дан 30 November 2019 в 03:52
поделиться

Не все 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)
2
ответ дан 30 November 2019 в 03:52
поделиться

Вы должны понимать, что система типов в JavaScript является динамической с несколькими «первичными» типами, на которые можно опираться. Обрабатывая все сложные объекты как тип «объект», это позволяет вам вводить типы и вызывать методы без необходимости знать тип передаваемого объекта, предполагая, что в этом типе реализован вызов функции. В динамическом языке программирования все является «объектом».

-1
ответ дан 30 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: