JS WTF🦄使用数组
JS WTF🦄使用数组
原文:https://medium.com/hackernoon/oh-my-goodnejs-arrays-f9e9e4f03c97
让我们利用一些带有 JavaScript 数组的 WTF。

[] == ![]
出现这种情况是因为[precedence](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)和[coercion](https://www.safaribooksonline.com/library/view/you-dont-know/9781491905159/ch04.html)。
旁注—优先级 决定了运算符执行的顺序。优先级越高,操作执行得越快。例如, *** 的优先级高于运算符 *+* 。至于 强制 ,这是 JS 将(一个运算符的)其中一个操作数转换为另一个操作数的“等价”值的能力。当操作数的类型不同时,就会发生这种情况。例如,对于 *boolean == integer* , *boolean* 操作数将被转换为 *integer* 。
由于[precedence](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Operator_Precedence),JS 首先执行操作![],然后执行==。
逻辑非运算![]对[]的真值求反,并返回布尔值false。在上步进:
- 评估表达式
[]; - 将结果转换为布尔值,即
ToBoolean([])。根据定义结果是true; - 返回
false,是true的逻辑否定;
我们得到了
**[] == false**。
现在,它开始发挥作用了。
因为我们的第二个操作数是一个布尔值,所以该操作被翻译成[] == ToNumber(false)。布尔运算的ToNumber在true时返回1或false时返回0(参见规范)。
我们得到了
**[] == 0**。
通过规范 , [] == 0转化为ToPrimitive([]) == 0,进而产生操作OrdinaryToPrimitive([], "number") == 0。
参数Object和"number"的OrdinaryToPrimitive运行Object的**.valueOf()**和**.toString()** 两种方法,返回结果不是对象。在我们的例子中,因为[].valueOf()返回一个对象(即[],所以返回的是[].toString()的结果(即"")。
我们得到了
**"" == 0**。
耐心。我们快到了😅
现在,一旦第一个操作数是一个字符串,我们的操作就被翻译成ToNumber("") == 0。根据定义,空字符串被转换成0。
我们得到了
**0 == 0**。
也就是true🎉
这就对了。

注: 我在第一次 WTF 上尽可能深入地让你知道 JS 有多方便。从现在开始,我会尽量简短。
。应用()
这个“特性”是由 ECMAScript 第五版带给你的。
从ES5开始,我们可以用任何类似的数组对象 来调用Function.prototype.apply()。这意味着apply()的第二个参数(见定义)需要有属性length和范围0…length — 1内的整数属性。
例如,数组[6,8]的属性长度为2,整数属性来自0…1(意为,[6,8][0]和[6,8][1])。)所以它是一个类数组的对象(这是一个简单的解释,你可以在这里阅读详情。)
因为所有的 4 个例子都是带有属性length的 类数组 对象,apply()将执行Array函数,并将来自0…length — 1的每个值作为其参数。
对于示例{length: 3},它有一个3的length,并且apply()将如下执行Array:
。排序()
这不是搞什么鬼。
这就是sort()的工作原理。但是我们还是可以玩得开心😃
根据规范,sort()根据字符串 unicode 值对数组元素进行排序。
因为10(即1)的第一个字符的 unicode 值低于字符2的 unicode 值,所以“排序”时10出现在2之前

我现在觉得好笑!
🔥。切片()
你们可能都记得我们的朋友slice(),根据它的规范,“它接受两个参数start和end,并且返回一个数组,该数组包含从元素 `start` 到 `end(不包括end`)的数组元素”。)
语法
array.slice(begin,end)
在我们的两个例子中,`begin` = 0。****
然而,尽管null和undefined都表示没有值,但是`end= null 的结果与end`= undefined 的结果无关。
**原因是 ECMAScript 规范 。**
上面写着,
- 如果“`end` 是 未定义,那么“`end` 是 数组的长度”。
- else "[to integer](https://www.ecma-international.org/ecma-262/6.0/#sec-tointeger)(`end`)",即翻译成"[to number](https://www.ecma-international.org/ecma-262/6.0/#sec-tonumber)(`end`)"。
顾名思义,`toNumber(null)
就是0`。
我们的声明[1, 2, 3].slice(0, null)实际上是[1, 2, 3].slice(0, 0)。
你猜对了。那就是
[]。
🍻**感谢注: 非常感谢@ jooffalcao*为了这个 WTF。***
< your WTF >
如果你发现任何应该在这里的 WTF,请告诉我👐
这就是数组的全部内容。
感谢:
一定要看看我在 JS WTF 上的其他文章
是时候用数字来驾驭一些 JavaScript WTF 了。
hackernoon.com](https://hackernoon.com/js-wtf-with-number-5cd73514befb)**