控制台诡异录之展开与缩略不同

问题复现

最近朋友发给我这样的一个串代码:

var arr = [1, 4, 2, 3 ];
console.log(arr);
arr.sort();

朋友说,这个输出不正确。我表示不信,就试了下:

clipboard.png

从结果看,没毛病啊。朋友说,你展开看看,一看果然有问题

clipboard.png

缩略状态的显示与展开的显示不同!!!

问题思考

这个问题的表现是:

缩略状态下显示原数组 [1, 4, 2, 3 ],展开状态下显示排序后的数组[1, 2, 3, 4 ]

这里的不一致导致我们比较困惑:

console.log(arr)打印的数组到底是原数组还是排序后的数组?

我们知道的是JS代码是按照顺序执行的,按道理说应该打印[1, 4, 2, 3 ],也就是说缩略状态的显示是符合常理的。通过下面的代码我们可以佐证:

var arr = [1, 4, 2, 3 ];
console.log(arr.toString()); // 1,4,2,3
arr.sort();

但是为什么展开后的数组却是排序后的呢?
我们思考3秒钟
1...
2...
3...
我个人理解这个问题是这样的:
Chrome的展开是一个点击事件,也就是说这是一个异步,等你点击的时候arr.sort()
已经执行完毕了,这时候点击展开arr,其实展开的就是排序后的数组(因为arr是引用类型的)。这样,就出现了上面这个问题。
除数组外,对象也存在这个问题,换句话说,这个引用类型的应该也都存在这个问题。
至此,这个问题算是有了解释。
以上,个人理解,如果你有更好的解释,欢迎提出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是React实现多行,包含展开和收起的代码示例: ```jsx import React, { useState } from "react"; const TextTruncate = ({ text, maxLines }) => { const [isExpanded, setIsExpanded] = useState(false); const toggleExpand = () => setIsExpanded(!isExpanded); const shouldTruncate = text.split("\n").length > maxLines; return ( <div> <div style={{ overflow: "hidden", display: "-webkit-box", WebkitBoxOrient: "vertical", WebkitLineClamp: maxLines, }} > {text} </div> {shouldTruncate && ( <button onClick={toggleExpand}> {isExpanded ? "收起" : "展开"} </button> )} </div> ); }; export default TextTruncate; ``` 在这个例子中,我们使用useState钩子来跟踪当前文本是否已展开。我们还定义了一个toggleExpand函数,用于切换展开和收起状态。 我们使用CSS属性来实现文本截断。我们设置overflow为hidden,使文本溢出隐藏,并使用-webkit-box属性来定义一个垂直方向上的弹性盒子。我们可以使用WebkitLineClamp属性来限制文本的行数。 最后,我们使用一个条件来显示展开和收起按钮,仅当文本超过指定的行数时。我们使用button元素来呈现按钮,并在单击时调用toggleExpand函数。 你可以使用以下代码片段来渲染TextTruncate组件: ```jsx <TextTruncate text={longText} maxLines={3} /> ``` 在这个例子中,我们将一个长文本字符串作为文本传递给TextTruncate组件,并将maxLines属性设置为3。这将限制文本的行数为3行,并在需要时显示展开和收起按钮。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值