JavaScript是一种特殊的语言。 无论您学习了多少书,总会有一些时刻使即使是经验丰富的专业人士也开始抓萝卜。
本文提供了一些与异常语言行为有关的JavaScript难题。 他们将帮助某人学习新知识,而某人将仅能更新他们的知识。
任务1-“ BANANA”
当时,此推文已在专门用于JavaScript的Twitter Twitter英语部分中获得了一些欢迎。 尤其重要的是,因为这里所发生的一切一点都不明显。
解决方案开头的“ b”和“ a”只是加起来为“ ba”的字符串。 在“ a”之后,您会看到两个加号(+)。 它们中的第一个是用于加法运算的,而第二个是一元运算符,用于将其后的字符串转换为数字。 由于第二个“ a”不能转换为数字,因此将其转换为“ NaN”。
因此,我们有:“ ba” +“ NaN” +“ a”-“ baNaNa”。 toLowerCase阴险地给了我们最终结果-“香蕉”。
任务2-添加阵列
这是一个简单的任务,但是不熟悉JavaScript的工作原理的人可能会感到困惑。
解决方案首先,将数组转换为字符串-“ 1,2,3”和“ 4,5,6”。 这些行的串联结果将是最终答案-字符串“ 1,2,34,5,6”。
任务3-parseInt()函数
在所有JavaScript任务中,这对我来说是最困难的。
如果使用JavaScript的parseInt可能以某种方式遇到了所有问题,那么很少有人知道第二个可选参数“ radix”的存在。 这是第一个参数的数字系统的基础。
解决方案第一个参数“ null”将转换为字符串。 在以24为底的数字系统中,此字符串“ n”的第一个字符被转换为数字。转换结果为23。
parseInt继续逐字符分析字符串,直到遇到无法转换为数字的字符为止。 这是字符串的第二个字符-“ u”,因为在以24为底的数字系统中没有这样的数字。
通过这种方式:
parseInt(null, 24) === parseInt("null", 24) parseInt("null", 24) === parseInt("n", 24) parseInt("n", 24) === 23
任务4-精度浮点数
看起来很糟糕,但公平地讲,某种程度上,您可以在使用浮点计算的任何语言中遇到类似的情况。
解决方案 console.log(0.1 + 0.2);
程序中的常量“ 0.2”和“ 0.3”将近似于机器表示中的“实际”值。 恰好发生了,最接近“ 0.2”的双精度数大于有理数“ 0.2”。 另一方面,最接近“ 0.3”的双精度数小于有理数“ 0.3”。
因此,代码中的“ 0.1”和“ 0.2”之和大于有理数“ 0.3”,并且代码中的常数“ 0.3”小于有理数“ 0.3”。
给女主人的提示:切勿使用“ ===”或“ ==”来处理浮点数。 改用
if (abs(x - y) < toleranceValue) { ... }
结论
是的,使用JavaScript时,会有很多WTF时刻。 另一方面,还有什么其他语言可以给人如此难忘的感觉呢?
以下是链接列表(英文),用于深入研究本文(不仅是)中的任务: