#javascript
#javascript
Вопрос:
У меня было тестовое интервью, и на 3 вопроса я не знал ответа:
-
Напишите функцию, которая будет вставлять подчеркивание между символами: это станет t_h_i_s .
-
Напишите функцию, которая будет выводить это:
l('t') === 'lt'
l()('t') === 'l3t'
l()()('t') === 'l33t'
l()()('g') === 'l33g'
l()()()()()()()()()()()('t') === 'l33333333333t'
- Почему вывод true?
var bar = true;
function foo() {
bar = false;
return 5;
function bar() {}
}
foo();
console.log(bar);
Может кто-нибудь помочь, пожалуйста, с ответами?
Комментарии:
1. Вам нужно задать 3 разных вопроса
2. Сделайте свою домашнюю работу.
3. 1. и 3. тривиальны, вы вообще пытались что-нибудь исследовать?
4. Я искал в Google, поверьте мне, и я не нашел ничего, что могло бы их решить.
5. Это очень просто для вас, ребята, почему бы вам не написать ответ, вместо того, чтобы писать что-то еще. Я знаю, что я новичок, и я прошу здесь ответов, а не для того, чтобы сказать мне, что я новичок.
Ответ №1:
- Напишите функцию, которая будет вставлять подчеркивание между символами: это станет t_h_i_s .
Вы хотите написать функцию, которая перебирает все символы в строке и добавляет символ подчеркивания между всеми символами.
Например:
function underscoreString(str) {
var result = str.charAt(0);
for (var i=1; i<str.length; i ) {
result = '_' str.charAt(i);
}
return resu<
}
console.log( underscoreString('this') );
- Напишите функцию, которая будет выводить это:
Вам нужно будет написать функцию, которая возвращает другую функцию, чтобы вы могли объединять функции в цепочку. Поскольку Javascript позволяет хранить функции в виде переменных, вы можете использовать это, постоянно вызывая одну и ту же функцию, пока не будет возвращен правильный аргумент.
Следующая функция является примером. Он работает так, как задумано, но не самый красивый.
function l(ch) {
var str = 'l';
if (ch) return str ch;
else str = '3';
var newFunc = function (ch) {
if (ch) return str ch;
str = '3';
return newFunc;
}
return newFunc
}
console.log( l('t') === 'lt' );
console.log( l()('t') === 'l3t' );
console.log( l()()('t') === 'l33t' );
console.log( l()()('g') === 'l33g' );
console.log( l()()()()()()()()()()()('t') === 'l33333333333t' );
- Почему вывод true?
var bar = true;
function foo() {
bar = false;
return 5;
function bar() {}
}
foo();
console.log(bar);
То bar
, что находится внутри функции foo()
, не ссылается на глобальную переменную bar
. Вместо этого он ссылается на функцию function bar() {}
. Это из-за подъема, как упоминалось в комментариях.
Таким образом, глобальная bar
переменная вообще не затрагивается функцией и всегда остается true .
Комментарии:
1. Я думаю, также стоит упомянуть, что из-за подъема функции() объявление bar {} перемещается в начало функции foo
2. Я добавил заявление для этого в ответ, спасибо @Maggie
Ответ №2:
Это действительно зависит от ожидаемого уровня кода. Если вам нужно продемонстрировать понимание алгоритмов или знание того, как использовать конструкции javascript.
Например, первый может быть таким простым, как:
function insertUnderscore(x){
return x.split('').join('_');
}
2-й вопрос рекурсивный метод:
function l( end ){
var acc = '';
function iter( eChar ){
if( typeof eChar === "undefined"){
acc=acc '3';
return iter;
}
return 'l' acc eChar;
}
if(typeof end === "undefined"){
acc = acc '3';
return iter;
}
return iter(end);
}
Третий вопрос:
функция bar(){} фактически объявляет ‘bar’ в локальной области, поэтому ваше назначение bar = false действует на локальный ‘bar’.
Ответ №3:
Это просто возвращает функцию итератора, если буква не определена, когда буква определена, она повторяет символ ‘3’ n раз.
Два других должны быть довольно простыми для понимания
function l(letter) {
let count = 0
function iter(letter) {
if (typeof letter === 'undefined') {
count
return iter
} else {
return 'l' ('3'.repeat(count)) letter
}
}
return iter(letter)
}
console.log(l('t') === 'lt')
console.log(l()('t') === 'l3t')
console.log(l()()('t') === 'l33t')
console.log(l()()('g') === 'l33g')
console.log(l()()()()()()()()()()()('t') === 'l33333333333t')
Комментарии:
1. Я думаю, что у вас есть вопросы 2 и 3, смешанные здесь в один?
Ответ №4:
Вопрос 1
Используйте отрицательный прогноз для начала строки и положительный прогноз для символа. Замените заданную пустую строку символом подчеркивания.
function spacer(s) {
return s.replace(/(?!^.)(?=.)/g, '_');
}
console.log(spacer('this'));
Вопрос 2
Используйте замыкание и возвращайте для не заданного параметра функцию, в противном случае расширенное значение.
function l(v) {
var s = 'l';
fn = function (v) {
s = 3;
return v === undefined ? fn : s v;
};
return v === undefined ? fn : s v;
}
console.log(l('t') === 'lt');
console.log(l()('t') === 'l3t');
console.log(l()()('t') === 'l33t');
console.log(l()()('g') === 'l33g');
console.log(l()()()()()()()()()()()('t') === 'l33333333333t');
Вопрос 3
Потому function bar() {}
что он поднимается до начала функции, а затем перезаписывается false
. Внешняя bar
переменная никогда не меняла свое содержимое.
var bar = true;
function foo() {
bar = false;
console.log('foo's bar:', bar);
return 5;
function bar() {}
}
foo();
console.log(bar);
Комментарии:
1. Спасибо @Nina Scholz за ваши объяснения. В 1 должна быть функция, ничего больше. Другие ребята показывают мне, как это сделать.