数据类型判断
1、typeof 对于基本数据类型判断是没有问题的,但是遇到引用数据类型(如:Array)是不起作用
console.log(typeof 2); // number
console.log(typeof null); // object
2、instanceof 只能正确判断引用数据类型 而不能判断基本数据类型,其内部运行机制是判断在其原
型链中能否找到该类型的原型
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true
console.log({} instanceof Object);
// true
3、constructor 似乎完全可以应对基本数据类型和引用数据类型 但如果声明了一个构造函数,并且把他的
原型指向了 Array 的原型,所以这种情况下,constructor 也显得力不从心
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true
console.log((2).constructor === Number); // true
4、Object.prototype.toString.call() 完美的解决方案,可以通过toString() 来获取每个对象的类型,
Object.prototype.toString.call() 使用 Object 对象的原型方法 toString 来判断数据类型:
var a = Object.prototype.toString;
console.log(a.call(2));
console.log(a.call(true));
console.log(a.call('str'));
console.log(a.call([]));
console.log(a.call(function(){}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));
补充:基本数据类型赋值的时候 赋的是具体的值 引用数据类型传的是地址,一个变另一个跟着变
5、Array.isArray 判断是否数组
let arr=[1,2,3,4]
console.log(Array.isArray(arr))
判断数组中是否包含某个字段
let arr=[1,2,3,5,7]
1、indexOf
console.log(arr.indexOf(7)) // 4 (索引号)
console.log(arr.indexOf(8)) // -1
2、includes
console.log(arr.includes(7)) //true
console.log(arr.includes(8)) //false
3、find
console.log(arr.find(a=>a===7)) //7
console.log(arr.find(a=>a===8)) //undefined
//存在返回值,不存在返回undefined (如果是>或者<等条件,返回第一个符合条件的)
4、findIndex
console.log(arr.findIndex(a=>a===7)) //4
console.log(arr.findIndex(a=>a===8)) //-1
//存在索引号,不存在返回-1 (只返回第一个符合条件的)
数组去重
new Set
let a=[1,2,3,2,4,6,3]
let c=[... new Set(a)]
console.log(c) // [1,2,3,4,6]
console.log(a) // [1,2,3,2,4,6,3]
不改变原数组
reduce
let arr=[1,1,2,2,3]
let newarr=arr.reduce((ar,value)=>{
if(ar.includes(value)=>{
ar.push(value)
})
return ar
},[])
console.log(newarr) //[1,2,3]
console.log(arr) //[1,1,2,2,3] 不改变原数组
原理:
arr.reduce((ar,value)=>{
return ar
},[])
filter
let arr=[1,1,2,2,3]
let newarr=arr.filter((item,index)=>{
return arr.indexOf(item)===index
})
console.log(newarr) //[1,2,3]
console.log(arr) //[1,1,2,2,3] 不改变原数组
原理:
arr.filter((item,index)=>{
return arr.indexOf(item)===index
}
js函数使用方法
let a=[1,2,3,6,5,4,7]
1、sort //会改变原数组
a.sort((x,y)=>x-y) 从小到大
a.sort((x,y)=>y-x) 从大到小
2、reverse //会改变原数组
a.reverse()
3、slice //原数组不变
a.slice(-2) //[5,4,7]
a.slice(2) //[3,6,5,4,7] 返回剩余数组
a.slice(2,4) //[3,6] 返回中间数组,前闭后开 第二个值是index
4、splice //会改变原数组
a.splice(-2) //[5,4,7]
console.log(a) //[1,2,3,6]
a.splice(2) //[3,6,5,4,7]
console.log(a) //[1,2]
a.splice(2,4) //[3,6,5,4] 第二个值是长度
console.log(a) //[1,2,7]
a.splice(2,4,888) //[3,6,5,4]
console.log(a) //[1,2,888,7]
a.splice(2,0,999) //[]
console.log(a) //[1,2,999,3,6,5,4,7]
5、filter //原数组不变
a.filter(x=>x<4) //[1,2,3]
6、some
a.some(x=>x<4) //true
7、every
a.every(x=>x<4) //false