Похоже, у вас нет всех необходимых частей для npm для работы в Windows. Попробуйте сделать «npm install --global windows-build-tools», и как только это будет сделано, перезапустите «npm install». Для получения дополнительной информации см. https://www.npmjs.com/package/windows-build-tools
Arnaud
typeof
более безопасен, поскольку позволяет идентификатору никогда не объявляться раньше:
if(typeof neverDeclared === "undefined") // no errors
if(neverDeclared === null) // throws ReferenceError: neverDeclared is not defined
Тебе не стоит беспокоиться о переименовании undefined. Если кто-то переименует undefined, у вас будет гораздо больше проблем, чем с несколькими, если проверки не пройдены. Если вы действительно хотите защитить свой код, оберните его в IFFE (немедленно вызванное выражение функции) следующим образом:
(function($, Backbone, _, undefined) {
//undefined is undefined here.
})(jQuery, Backbone, _);
Если вы работаете с глобальными переменными (что уже неправильно) в среде браузера Я бы проверил неопределенность следующим образом:
if(window.neverDefined === undefined) {
//Code works
}
Поскольку глобальные переменные являются частью объекта окна, вы можете просто проверить неопределенность вместо приведения к строке и сравнения строк.
Кроме того, почему ваши переменные не определены? Я видел много кода, где они проверяют существование переменных и выполняют некоторые действия, основанные на этом. Ни разу я не видел, где этот подход был правильным.
Если переменная объявлена (либо с ключевым словом var
, как аргумент функции, либо как глобальная переменная), я думаю, что лучший способ сделать это:
if (my_variable === undefined)
jQuery делает это, поэтому для меня этого достаточно: -)
В противном случае вам придется использовать typeof
, чтобы избежать ReferenceError
.
Если вы ожидаете, что undefined будет переопределено, вы можете обернуть свой код следующим образом:
(function(undefined){
// undefined is now what it's supposed to be
})();
Или получить его с помощью оператора void
:
const undefined = void 0;
// also safe
Если вас действительно беспокоит переопределение undefined, вы можете защитить от этого вспомогательный метод вроде этого:
function is_undefined(value) {
var undefined_check; // instantiate a new variable which gets initialized to the real undefined value
return value === undefined_check;
}
Это работает, потому что когда кто-то пишет undefined = "foo"
он позволяет только name undefined
ссылаться на новое значение, но не изменяет фактическое значение undefined
.
if (input == undefined) { ... }
работает нормально. Конечно, это не сравнение null
, но я обычно нахожу, что если мне нужно различать undefined
и null
, мне на самом деле нужно различать undefined
и любое ложное значение, поэтому
else if (input) { ... }
делает это.
Если программа переопределяет undefined
, она в любом случае бессмысленна.
Единственная причина, по которой я могу думать, это совместимость с IE4, он не понимал ключевое слово undefined
(которое, к сожалению, не является ключевым словом), но, конечно, значения могли быть undefined
, поэтому у вас должно быть следующее:
var undefined;
, и приведенное выше сравнение будет работать нормально.
Во втором примере вам, вероятно, понадобятся двойные круглые скобки, чтобы сделать lint счастливым?