为了账号安全,请及时绑定邮箱和手机立即绑定

改写的TS中grid.js中的check方法中的data赋值

在之前的JS版中toArray不是也是返回的HTMLIElement数组吗?HTMLIElement没有toArray方法,为什么那个能通过,而在TS版中就不可以

正在回答

3 回答

JS 没有类型检查,而 TS 进行了类型检查。由于 TypeScript 中 JQuery 的类型定义中它的 map 结果是一个 HTMLElemnt 数组,所以不能直接赋值给其它数组类型。实际数据在这里其实已经不是 HTMLElement 数组了,JS 运行时检查可以通过,但是 TS 转译期检查不能通过(因为类型转不过去)。TS 是按声明来检查,JS 是运行时按实际结果来检查,这应该就是主要区别。

1 回复 有任何疑惑可以回复我~
#1

慕粉3221337 提问者

我懂了,可是我还有一个疑问,在这种情况下弹出false: <script type="text/javascript"> x=$("li").toArray() alert(x[0] instanceof jQuery); //弹出false </script> <ul> <li><span>1</span></li> <li><span>1</span></li> <li><span>1</span></li> </ul> (字数受限了,,,)
2017-11-17 回复 有任何疑惑可以回复我~
#2

慕粉3221337 提问者

而在你的JS版中在最后遍历toArray().map($data => {alert($data instanceof jQuery);$data.toArray()});中我添加了同样一条弹出,可结果是true,toArray()返回的也有可能是一个jQuery对象数组吗?
2017-11-17 回复 有任何疑惑可以回复我~
#3

边城 回复 慕粉3221337 提问者

注意 map 内部使用了 $data.toArray(),也就是说,$data 从逻辑处理上得到的就是一个 jQuery 对象。因为这个示例中,只有 jQuery 对象才有 toArray() 方法。所以可以先看看前端的逻辑,肯定是对一个二维 jQuery 对象(伪数组)进行两层 toArray() 操作。
2017-11-19 回复 有任何疑惑可以回复我~
#4

边城 回复 慕粉3221337 提问者

在“实现功能按钮(2)”的 00:00:12 位置可以看到代码。这里从 _$container.children() 开始,进行了两层 map()。内层 map 把 span 映射成每个 span 对应的数字,得到一行数组(数组),外层 map 把 每行 div 映射成行的数据(就是内层 map 的结果)。但是要注意,这里两层 map() 都是 jQuery 的 map(),所以得到的结果都是 jQuery 封装的 jQuery 对象——所以最后展开(toArray()) 的时候也需要进行两层 toArray()
2017-11-19 回复 有任何疑惑可以回复我~
#5

慕粉3221337 提问者 回复 边城

我知道了,忘了是伪数组了,所以需要用两次toArray,谢谢老师^^
2017-11-19 回复 有任何疑惑可以回复我~
查看2条回复

rrrrrr

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
从JS到TS开发数独游戏(TS版)
  • 参与学习       16489    人
  • 解答问题       5    个

使用TS语言为主的前端开发技术实现数独游戏

进入课程

改写的TS中grid.js中的check方法中的data赋值

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信