含义: 返回 x 的绝对值
应用场景: 使 0.1+0.2 == 0.3
方法: 设置一个误差范围值,通常称为“机器精度
”,而对于 Javascript 来说,这个值通常是2^-52
,而在 ES6 中,已经为我们提供了这样一个属性:Number.EPSILON
,而这个值正等于2^-52。这个值非常非常小,在底层计算机已经帮我们运算好,并且无限接近 0,但不等于 0,。这个时候我们只要判断(0.1+0.2)-0.3 小于 Number.EPSILON,在这个误差的范围内就可以判定 0.1+0.2===0.3 为true。
function numbersequal(a,b){
return Math.abs(a-b)<Number.EPSILON;
}
var a=0.1+0.2, b=0.3;
console.log(numbersequal(a,b)); //true
此时,需要考虑兼容性的问题,在 chrome 中支持这个属性,但是 IE 并不支持(笔者的版本是 IE10 不兼容),所以我们还要解决 IE 的不兼容问题。
Number.EPSILON = (function () {
//解决兼容性问题
return Number.EPSILON ? Number.EPSILON : Math.pow(2, -52);
})();
//上面是一个自调用函数,当JS文件刚加载到内存中,就会去判断并返回一个结果,相比if(!Number.EPSILON){
//Number.EPSILON=Math.pow(2,-52);
//}这种代码更节约性能,也更美观。
function numbersequal(a, b) {
return Math.abs(a - b) < Number.EPSILON;
}
//接下来再判断
var a = 0.1 + 0.2,
b = 0.3;
console.log(numbersequal(a, b)); //这里就为true了
含义: 返回 x 的 y 次
应用场景: 上边的机器精度2^-52即可以用此方法求得
方法:
Math.pow(2, -52) = Number.EPSILON
含义: (小数点后第一位)大于五全部加,等于五正数加,小于五全不加。即四舍五入
应用场景:
// 小数点后第一位<5
正数:Math.round(11.46)=11
负数:Math.round(-11.46)=-11
// 小数点后第一位>5
正数:Math.round(11.68)=12
负数:Math.round(-11.68)=-12
// 小数点后第一位=5
正数:Math.round(11.5)=12
负数:Math.round(-11.5)=-11
含义: 天花板,向上取整
应用场景:
Math.ceil(11.46)=Math.ceil(11.68)=Math.ceil(11.5)=12
Math.ceil(-11.46)=Math.ceil(-11.68)=Math.ceil(-11.5)=-11
含义: 地板,向下取整
应用场景:
Math.floor(11.46)=Math.floor(11.68)=Math.floor(11.5)=11
Math.floor(-11.46)=Math.floor(-11.68)=Math.floor(-11.5)=-12
含义: 接受多个参数,并将这些参数放置于数组尾部,返回新数组的长度
,原始数组发生改变。
应用场景:
let arr=[1,2,3];
arr.push(4,5,6);
console.log(arr.push(4,5,6))//6
console.log(arr);//[1,2,3,4,5,6];
含义: 不接收参数,从数组尾部删除一个元素,并返回这个删除的元素
,原数组发生改变。
应用场景:
var arr = [1,2,3,4]
console.log(arr.Pop( ))//4
console.log(arr);//[1,2,3]
含义: 接受多个参数并将这些参数放置于数组头部,返回新数组的长度
,原数组发生改变。
应用场景:
var arr=[1,2,5,3];
arr.unshift(10,11)//6
console.log(arr)//[10,11,1,2,5,3];
含义: 不接受参数,从数组的头部删除一个元素,并返回这个删除的元素
,原数组发生改变。
应用场景:
var arr = [1,2,3,4]
arr.myShift()//1
console.log(arr)//[2,3,4]
含义: 如果是一个参数,那么该参数表示的索引开始截取,直至数组结束,返回截取的数组
,原数组不发生改变。
如果有两个参数,从第一个参数表示的索引开始截取,到第二个参数表示的索引结束,不包括第二个参数对应的索引位上的元素
。
应用场景:
var arr=[1,2,3,4,5,6]
var arr1=arr.slice(1,3)//[ 2, 3 ]
var arr1=arr.slice()//[ 1, 2, 3, 4, 5, 6 ]
//如果没有任何参数就会从头截取到尾部 拷贝
var arr1=arr.slice(1)//[ 2, 3, 4, 5, 6 ]
//如果第二个参数没有,就会从开始截取到尾部
var arr1=arr.slice(-3,-1)//[ 4, 5 ]
//如果是负数就会从后向前数,然后再截取
//前小于后将参数转换为正向数值时,前面的必须小于后面
var arr1=arr.slice(-3,5)//[ 4, 5 ]
//如果第一个参数大于等于数组长度,或者第二个参数小于第一个参数,则返回空数组。
console.log(arr1,arr)//[ 4, 5 ] [ 1, 2, 3, 4, 5, 6 ]
注: slice方法的一个重要应用,是将类似数组的对象转为真正的数组。
Array.prototype.slice.call({
0:'a', 1:'b', length:2 }) //[ 'a', 'b' ]
Array.prototype.slice.call(document.querySelectorAll("div"));
Array.prototype.slice.call(arguments);
上面代码的参数都不是数组,但是通过call方法,再它们上面调用slice方法,就可以把它们转为真正的数组。
含义: 如果一个参数,那么从该参数表示的索引开始截取,直至数组结束,返回截取的数组
,原数组发生改变
。
如果有两个参数,从第一个参数表示索引,第二个参数表示的是截取的长度。
如果有三个及以上参数,从第一个参数表示索引,第二个参数表示的是截取的长度,后边的会从截取的位置添加至原数组里。
应用场景:
var arr = ['a', 'b', 'c', 'd', 'e', 'f']
//从原数组4号位置,删除了两个数组成员
arr.splice(4,2) //["e", "f"]
//原数组发生改变
console.log(arr) //["a", "b", "c", "d"]
//删除了两个,又插入了两个新元素
arr.splice(4,2,1,2) //["a", "b", "c", "d", 1, 2]
//如果起始位置使复数,就表示从倒数位置开始(不包括该元素)删除
//从倒数第四个位置c开始删除两个元素
arr.splice(-4,2)//["c",