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。在上步进:

  1. 评估表达式[]
  2. 将结果转换为布尔值,即ToBoolean([])根据定义结果是true
  3. 返回false,是true的逻辑否定;

我们得到了 **[] == false**

现在,它开始发挥作用了。

因为我们的第二个操作数是一个布尔值,所以该操作被翻译成[] == ToNumber(false)。布尔运算的ToNumbertrue时返回1false时返回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},它有一个3length,并且apply()将如下执行Array:

。排序()

这不是搞什么鬼。

这就是sort()的工作原理。但是我们还是可以玩得开心😃

根据规范sort()根据字符串 unicode 值对数组元素进行排序。

因为10(即1)的第一个字符的 unicode 值低于字符2的 unicode 值,所以“排序”时10出现在2之前

我现在觉得好笑!

🔥。切片()

你们可能都记得我们的朋友slice(),根据它的规范,“它接受两个参数startend,并且返回一个数组,该数组包含从元素 `start` `end(不包括end`)的数组元素”。)

语法

array.slice(begin,end)

在我们的两个例子中,`begin` = 0。****

然而,尽管nullundefined都表示没有值,但是`end= null 的结果与end`= undefined 的结果无关。

**原因是 ECMAScript 规范 。**

上面写着,

顾名思义,`toNumber(null)就是0`。

我们的声明[1, 2, 3].slice(0, null)实际上是[1, 2, 3].slice(0, 0)

你猜对了。那就是[]

🍻**感谢注: 非常感谢@ jooffalcao*为了这个 WTF。***

< your WTF >

如果你发现任何应该在这里的 WTF,请告诉我👐

这就是数组的全部内容。

感谢:

一定要看看我在 JS WTF 上的其他文章

** [## JS WTF🦄带编号

是时候用数字来驾驭一些 JavaScript WTF 了。

hackernoon.com](https://hackernoon.com/js-wtf-with-number-5cd73514befb)**


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除