Как работает операторы <и> - PullRequest
3 голосов
/ 30 сентября 2019

Я недавно попал в ката для гольфа, которая попросила проверить, является ли буква заглавной или не более 9 символов.

Ответы пользователей были довольно пугающими (этот пример также работает с >в обратном порядке):

f=s=>s<{}
f=c=>c<{}
f=_=>_<f
f=Z=>Z<f

Некоторые имена переменных не работают с f:

f=a=>a<f
f=z=>z<f

Почему и какработает операторы < и > при сравнении функций с базовыми строками? Может быть, сравнение указателей?

Попробуйте сами:

// working
f1=s=>s<{}
f2=c=>c<{}
f3=_=>_<f3
f4=Z=>Z<f4

// not working
f5=s=>s<f5

console.log('f1', f1('A'))
console.log('f1', f1('a'))

console.log('f2', f2('A'))
console.log('f2', f2('a'))

console.log('f3', f3('A'))
console.log('f3', f3('a'))

console.log('f4', f4('A'))
console.log('f4', f4('a'))

console.log('f5', f5('A'))
console.log('f5', f5('a'))

Ответы [ 2 ]

4 голосов
/ 30 сентября 2019

Сравнение строки с {} эффективно сравнивает строку с результатами ({}).toString(), который всегда равен "[object Object]". Важной частью является символ [, который является первой кодовой точкой после последней заглавной буквы (Z). Таким образом, если вы знаете, что входная строка - это какая-то буква, сравнение со строкой, начинающейся с [, скажет вам, что это заглавная буква.

Для ясности,

s => s<{}

эффективно

s => s<"[object Object]"

Это не имеет ничего общего с именами переменных, выбранными при использовании объекта ({}), но это важно для версий со ссылками на функции. В них «_» важен, потому что это символ после «Z», но перед всеми строчными буквами.

0 голосов
/ 30 сентября 2019

Оператор > и < возвращает true или false в зависимости от двух значений вокруг оператора. если вы попытаетесь назначить тип, который не совместим с логическим значением, он не будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...