最大安全数
//最大安全数
{
var start = 2 ** 53;
var end = start + 100
for (var i = start; i < end; i++) {
console.log('loop')
}
//上面这段代码会输出多少loop。答案是:不可预测
Number.MAX_SAFE_INTEGER//最大的安全整数,
//在使用二进制表示的时候,全部的53位都是1.就是(2的53次方减一),也就是Number.MAX_SAFE_INTEGER
}
判断某对象是否存在某个属性
//判断某对象是否存在某个属性
{
/**
*obj 对象 Object
key 属性名 String
*/
//方法1
function hasProperty(obj, key) {
return Object.keys(obj).includes(key)
}
//但是在这种情况下没有用
var obj = { a: underfind, b: 1 }
Object.defineProperties(obj, 'c', {
enumerator: false,
value: 1,
})
console.log(obj.c);//1
console.log(hasProperty(obj, 'c'));//false
//方法2 但是这个方法只能判断obj自身上的属性,原型链上的判断不到
function hasProperty(obj, key) {
return obj.hasOwnProperty(key)
}
//方法3 最好的方法
function hasProperty(obj, key) {
return key in obj
}
}
数组去重
//数组去重
{
//方法一 严格去重,两个相同的对象去不掉
function uniqueArray1(arr) {
return [...new Set(arr)]
}
function unique2(arr) {//利用对象的属性不能相同的特点进行去重(这种数组去重的方法有问题,不建议用,有待改进)
if (!Array.isArray(arr)) {
console.log('type error!')
return
}
var arrry = [];
var obj = {};
for (var i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
arrry.push(arr[i])
obj[arr[i]] = 1
} else {
obj[arr[i]]++
}
}
return arrry;
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
//[1, "true", 15, false, undefined, null, NaN, 0, "a", {…}] //两个true直接去掉了,NaN和{}去重
function unique3(arr) {//利用hasOwnProperty
var obj = {};
return arr.filter(function (item, index, arr) {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];
console.log(unique(arr))
//[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}] //所有的都去重了
}