关于方向简化函数及stack[stack.length-1]用法的技术疑问
方向化简函数(dirReduc)疑问解答
1. dirReduc函数的工作逻辑
这个函数靠**栈(Stack)**的思路实现相反方向抵消,核心流程如下:
- 先创建一个空栈
stack,用来存最终要保留的方向 - 逐个遍历输入的方向数组:
- 拿当前方向和栈顶的方向(也就是栈里最后一个元素)对比,判断是不是相反方向(NORTH对应SOUTH,EAST对应WEST)
- 如果是相反方向,说明这两个方向可以互相抵消,直接把栈顶的元素删掉(
stack.pop()) - 如果不是相反方向,就把当前方向加到栈里(
stack.push(direction))
- 遍历完所有方向后,栈里剩下的就是没法抵消的方向数组,直接返回就行
举个实际例子:输入['NORTH', 'SOUTH', 'EAST', 'WEST', 'NORTH']
- 第一个方向NORTH,栈是空的,直接加入,栈变为
['NORTH'] - 第二个方向SOUTH,和栈顶NORTH相反,弹出栈顶,栈变空
- 第三个方向EAST,栈为空,加入栈,栈变为
['EAST'] - 第四个方向WEST,和栈顶EAST相反,弹出栈顶,栈变空
- 第五个方向NORTH,栈为空,加入栈,栈变为
['NORTH']
最终返回['NORTH']
2. 栈为空时stack[stack.length - 1]的处理
当栈为空时,stack.length是0,所以stack.length - 1等于-1。在JavaScript里,访问数组的-1索引会得到undefined——因为数组的合法索引是从0开始的,负数索引没有对应的元素。
那代码为啥不会报错?这要靠逻辑或(||)的短路特性:
比如栈为空时,判断direction === 'NORTH' && stack[stack.length -1] === 'SOUTH',stack[stack.length -1]是undefined,和'SOUTH'对比结果是false,整个&&表达式就成了false。另外三个判断分支同理也都是false,所以整个if条件不成立,代码会自动走到else分支,把当前方向压入栈里,完全不会触发错误。
内容的提问来源于stack exchange,提问作者687edf53
相关产品推荐
相关产品推荐

