JavaScript 左移位溢出问题:255<<24变成了负数

JavaScript013

JavaScript 左移位溢出问题:255<<24变成了负数,第1张

JS 左移结果是一个有符号的32位整数,255本身占了8位,左移24位就溢出了

可以参考这个:https://zhidao.baidu.com/question/1757320534541610948.html

首先,你给出的这个函数 是个严重有缺陷的调用,他会无限递归最终内存溢出,

其次 你这段代码是要运行在什么地方,如果运行在浏览器中,不同浏览器解析到这段代码都会主动报错,不会调用,如果你运行在node环境,这段代码运行会依照你物理内存大小 和系统内存分配方法进行调用 最终爆掉,很显然,你的问题没有完整的条件

记录这个调用也很简单,在函数外部声明一个变量 并且赋值为0;并且在调用的时候给这个变量做自增操作,最后的数据就是完成调用到溢出的调用次数。

关于内存结构,假设一个 数据类型是整数,8字节 ,这句话本身就是个问题,首先Var A = 1这是声明了一个 类型为整数的 变量,这个时候 他在栈中声明了一个东西叫A 同时 指向了池的1 所以 这个8字节代表了2部分,他的栈空间占用就是最终调用函数的次数;不管是什么数据类型,变了的声明都是在栈中,数据都在池里面。如果只是声明了 var A 但是并不赋值,此时他在内存结构中 只会占用栈空间,但是没有数据类型;跟没有整数,字符串,数组,对象,undiluted,这样的数据类型之分了。

我个人觉得,这要么是一个非常刁钻的考试题,要么就是不知道谁脑子有毛病想出来的,显然这是一个非常不科学的题目,实际情况程序是根本跑不起来的,

最近做el-tree组件开发的时候,选中某条会报这种错误。这句话的意思是堆超出了最大范围。

因为用例模块3333的id为3,父模块ID也是3。于是怀疑是数组转tree递归的时候导致堆溢出。这个时候打印了一下,数组转tree后的数据,果然是转换的时候逻辑写错了,导致id和父模块id一样无限递归循环导致堆溢出

于是在原有的转换基础上增加了红框内容,完美解决问题。