#javascript #ecmascript-6 #babeljs
#javascript #ecmascript-6 #babeljs
Вопрос:
Я использую ES6 babel с плагином [«iife-wrap»].
Я пытаюсь переделать плагин, который я создал ранее (проверка формы). Я пытаюсь проверить, являются ли данные объектом.
Для es5 это просто: typeof blah === 'object'
или string, function, and etc.
Однако, если я помещу его в es6. Это приведет к ошибке Uncaught TypeError: _typeof не является функцией
Вот пример фрагмента моего кода.
let es6function = () => {
return 'asd';
}
console.log(typeof es6function)
class Person {
}
let tryThis = new Person()
console.log(tryThis instanceof Person)
ES5: после компиляции
;
(function () {
'use strict';
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
var _typeof = typeof Symbol === "function" amp;amp; _typeof(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === 'undefined' ? 'undefined' : _typeof(obj);
} : function (obj) {
return obj amp;amp; typeof Symbol === "function" amp;amp; obj.constructor === Symbol amp;amp; obj !== Symbol.prototype ? "symbol" : typeof obj === 'undefined' ? 'undefined' : _typeof(obj);
};
var es6function = function es6function() {
return 'asd';
};
console.log(typeof es6function === 'undefined' ? 'undefined' : _typeof(es6function));
var Person = function Person() {
_classCallCheck(this, Person);
};
var tryThis = new Person();
console.log(tryThis instanceof Person);
})();
Любая помощь будет оценена. Спасибо.
Комментарии:
1. Это почти наверняка как-то связано с вашим транспилятором (babel). Он работает, как и ожидалось, в браузере, который изначально поддерживает ES6.
2. {
}
console.log(typeof es6function)
class Person {
}
let tryThis = new Person()
console.log(tryThis instanceof Person)» rel=»nofollow noreferrer»> Здесь все работает нормально.3. Я предполагаю, что вы не скопировали и не опубликовали весь код. Доказательство того, что это работает: imgur.com/a/8XqZA . Даже если вы посмотрите на код
_typeof
, функции всегда присваивается значение.4. Какой плагин вы используете? Какая версия Babel? То, что вы опубликовали, не то, что Babel генерирует по умолчанию. Мы не сможем вам помочь, если вы не предоставите воспроизводимый пример.
5. Ну, вы можете видеть, что создается недопустимый вывод :
var _typeof = typeof Symbol === "function" amp;amp; _typeof(Symbol.iterator) === "symbol"
._typeof
Вызова не должно быть. Теперь, почему это происходит только при включении плагина, я не могу сказать. Может быть ошибка в Babel. Это, конечно, не имеет никакого отношения к самому ES6.
Ответ №1:
Похоже, вы случайно запускаете Babel за два прохода над своим кодом.
Код ES6
console.log(typeof es6function)
переносится в
var _typeof = typeof Symbol === "function" amp;amp; typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj amp;amp; typeof Symbol === "function" amp;amp; obj.constructor === Symbol ? "symbol" : typeof obj; };
console.log(typeof es6function === 'undefined' ? 'undefined' : _typeof(es6function));
который становится
var _typeof2 = typeof Symbol === "function" amp;amp; typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj amp;amp; typeof Symbol === "function" amp;amp; obj.constructor === Symbol ? "symbol" : typeof obj; };
var _typeof = typeof Symbol === "function" amp;amp; _typeof2(Symbol.iterator) === "symbol" ? function (obj) {
return typeof obj === "undefined" ? "undefined" : _typeof2(obj);
} : function (obj) {
return obj amp;amp; typeof Symbol === "function" amp;amp; obj.constructor === Symbol ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof2(obj);
};
console.log(typeof es6function === 'undefined' ? 'undefined' : _typeof(es6function));
при повторной передаче. Помимо _typeof
/ _typeof2
duplicationэто очень похоже на ваш результат переноса. Проверьте конфигурацию сборки и плагины babel. Попробуйте отключить один за другим, чтобы увидеть, когда проблема исчезнет, и сообщить об ошибке ответственному компоненту.
Ответ №2:
Можете ли вы добавить круглые скобки для переноса таким образом?
if( typeof(Symbol) === 'function') ) { ... }
Комментарии:
1. И почему OP должен это делать?
typeof
является оператором. Круглые скобки бесполезны.typeof foo
совпадает с тем, что совпадаетtypeof (foo)
сtypeof ((((((foo))))))
.2. Действительно, оба способа должны работать, но я думаю, что причиной может быть компилятор
3. Ваше предложение синтаксически недопустимо.