js易忽略的知识点

329 阅读2分钟

js中0.1+02的值

let num=0.1+0.2
console.log(num)//0.30000000000000004

从上面的执行可看出在js中0.1+0.2!=0.3 ,这是由js的运算来决定的。

  • 1、JS中的数字是用IEEE 754 双精度 64 位浮点数来存储的,它由64位组成,这64位由3部分组成。
  • 2、十进制小数转换为二进制小数:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。

结论:

我们可以看到,当十进制小数的二进制表示的有限数字超过 52 位时,在 JavaScript 里是不能精确存储的,这时候就存在舍入误差(Round-off error)。

- 解决:

利用es6的Number.EPSILON。
作用:是 JavaScript 能够表示的最小精度。误差如果小于这个值,就可以认为已经没有意义了,即不存在误差了。

//解决兼容性问题
if(!Number.EPSILON){
   Number.EPSILON=Math.pow(2,-52)
}
//判断差值是否在最小数据中
function numberFun(a,b){
   return Math.abs(a-b)<Number.EPSILON
}

let num=0.1+0.2
let lastNum=0.3
console.log(numberFun(num,lastNum));//true

同源策略

所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问方式进行的限制。比如源a的js不能读取或设置引入的源b的元素属性。

同源指两个页面具有相同的协议,主机(也常说域名),端口,三个要素缺一不可。

URL1 URL2 说明 是否允许通信
www.foo.com/js/a.js www.foo.com/js/b.js 协议、域名、端口都相同 允许
www.foo.com/js/a.js www.foo.com:8888/js/b.js 协议、域名相同,端口不同 不允许
www.foo.com/js/a.js www.foo.com/js/b.js 主机、域名相同,协议不同 不允许
www.foo.com/js/a.js www.bar.com/js/b.js 协议、端口相同,域名不同 不允许
www.foo.com/js/a.js foo.com/js/b.js 协议、端口相同,主域名相同,子域名不同 不允许

同源策略限制的不同源之间的交互主要针对的是 js中的XMLHttpRequest等请求,下面这些情况是完全不受同源策略限制的。

  • 1、页面中的链接,重定向以及表单提交是不会受到同源策略限制的。
  • 2、跨域资源嵌入是允许的,当然,浏览器限制了Javascript不能读写加载的内容。

跨域问题

  • 1、 vue-cli项目中通过node.js代理服务器来实现跨域请求
  • 2、在服务器响应客户端的时候,带上 Access-Control-Allow-Origin:* 头信息 [推荐使用]
  • 3、通过 jquery 的 jsonp 形式解决跨域问题