如何使用 < 和 > 运算符?

3

最近我接触了一个高尔夫卡塔,要求在不超过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'))


这只是条件语句中的简单算术运算。 - Fernando Torres
所有的解释都在规范中。 - Sebastian Simon
2个回答

4
比较字符串与{}相当于将字符串与({}).toString()的结果进行比较,该结果始终为"[object Object]"。重要的部分是[字符,它是最后一个大写字母Z之后的第一个代码点。因此,如果您知道输入字符串是一封信,将其与以[开头的字符串进行比较,就会告诉您这是一封大写字母信。
清楚地说,
s => s<{}

实际上是

s => s<"[object Object]"

与对象({})使用时选择的变量名称无关,但对于函数引用版本非常重要。在这些版本中,"_"很重要,因为它是在所有小写字母之前但在"Z"后面的字符。


1
还有关于F5无法工作的混淆,那是因为F5.toString()会以's'开头。 - Smern
但是为什么 f3f4 能够正常工作,而 f5 却不能? - Nathanael Demacon
@D.Nathanael和f3之所以能够工作,是因为"_"在编码序列中排在所有大写字母之后。请注意,在几乎任何情况下,您都会疯狂地使用它们来编写实际的生产代码。 - Pointy
我仍然不明白为什么使用名为s的参数时,f5不起作用。别担心,这个怪物不会进入生产环境哈哈! - Nathanael Demacon
“f5”的“字符串化”版本的第一个字符是“s”,这意味着我在答案中说的话完全是错误的(我会进行编辑)。 “a”小于“s”。 - Pointy
哦,好的!所以f5的字符串版本是与字符串进行比较的!感谢您的解释 :) - Nathanael Demacon

-3

运算符><根据操作符周围的两个值返回truefalse。如果您尝试分配一个与布尔类型不兼容的类型,则它将无法工作。


1
这个并没有太多的意义。 - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接