Я создаю временный файл во время выполнения.
Вот как я это делаю:
#!/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
typeof JS не всегда возвращает «объект», но он возвращает объект для вещей, которые люди могут не считать объектами - то есть массивы, а также, как ни странно, для нулей.
Для массивов это правильно, потому что для JS массивы являются объектами; это одно и то же. Array - это просто еще один класс, и вы можете создавать экземпляры объектов типа Array, но они по-прежнему рассматриваются как объекты.
На этой странице есть список типов в JS, а также ответ, который вы получите для каждого из них от typeof. Он также имеет некоторый JS-код для переопределения функции typeof с той, которая возвращает более полезную информацию. Если вы беспокоитесь, что это бесполезно, вы можете реализовать что-то подобное, если хотите.
Он не всегда возвращает «объект»:
alert(typeof "hello");
Тем не менее, (возможно) более полезный трюк для изучения объектов - это использовать Object.prototype.toString.call()
и посмотреть на результат:
var t = Object.prototype.toString.call(itIsAMystery);
Это даст вам строку, подобную [object Foo]
, где «Foo» является конструктором (я думаю) strike> интересной частью. Для «нативных» типов (таких как Date или String) вы возвращаете это имя конструктора.
По моему опыту, главная проблема с 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;
}
}
}
Нужно быть немного осторожнее с оператором typeof. Он возвращает «объект» для нуля, «число» для NaN, «число» для бесконечности, «объект» для «нового числа (1)» и «объект» для массива.
При проверке существования переменной (переменная typeof! == "undefined") иногда необходимо сначала проверить, если (variable == null), потому что typeof возвращает "объект" для переменной, которая назначена для ноль.
Это немного очевидно, но нужно также быть осторожным, чтобы не вызывать функцию при проверке typeof, потому что сообщается о возвращаемом типе функции, а не о «функции».
Чтобы добавить другие, typeof возвращает как объекты, так и примитивы. В javascript есть 5 примитивных типов: undefined, null, boolean, string и number. Все остальное является объектом. Когда typeof применяется к любому типу объекта, кроме Function, он просто возвращает «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]
Не все 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)
Вы должны понимать, что система типов в JavaScript является динамической с несколькими «первичными» типами, на которые можно опираться. Обрабатывая все сложные объекты как тип «объект», это позволяет вам вводить типы и вызывать методы без необходимости знать тип передаваемого объекта, предполагая, что в этом типе реализован вызов функции. В динамическом языке программирования все является «объектом».