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 形式解决跨域问题