js数据操作常见问题(一天一个问题18)(判断数据类型,拷贝,遍历,拼接增删改查,其他)

1.判断数据类型方法
值类型引用类型es6
number string boolean null undefinedarray object functionsymbol

判断数据类型方法

判断方法
typeof constructor instanceof Object.prototype.toString()
1.1typeof

操作符返回一个字符串,可以用来判断数据所属的基本类型(null除外),但引用类型的判断结果都为object(function除外)

typeof返回会类型
number,string,boolean,undefined,object,function,symbol
numberstringbooleanundefinedobjectfunctionsymbol
number,NaNstringbooleanundefinednull array object new Date() new RegExp()functionsymbol

typeof null array object new Date() new RegExp() //object(引用类型)
typeof null number //number

1.2 instanceof

表达式为:A instanceof B instanceof 运算符用于判断构造函数B的 prototype 属性是否出现在某个实例对象A的原型链上
不能用于区分null和undefined
string,number,boolean字面量如果不是new关键字创建也不能区分

console.log(undefined instanceof undefined);//Undefined is not defined
console.log(null instanceof Null);//Null is not defined
console.log(1 instanceof Number);//false
console.log(‘1’ instanceof String);//false
console.log(true instanceof Boolean);//false
console.log([1] instanceof Array);//true
console.log(function(){} instanceof Function);//true
console.log({name:“tom”} instanceof Object);//true
1.3 constructor

JS对象的constructor是不稳定的。当开发者重写prototype后,原有的constructor会丢失,constructor会默认为Object
undefined和null不能区分

1.4 Object.prototype.toString

最全面
toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型。更严格的讲,是 toString运行时this指向的对象类型, 返回的类型格式为[object,xxx],xxx是具体的数据类型

1.5 Array.isArray()

用于确定传递的值是否是一个 Array
Array.isArray([1, 2, 3]);
// true
Array.isArray({foo: 123});
// false
Array.isArray(“foobar”);
// false
Array.isArray(undefined);
// false

2.拷贝数据

对象
JSON.parse(JSON.stringify())//不能拷贝方法,日期,正则表达式
object.assign({},obj1,obj2)//一级是深拷贝,二级浅拷贝
递归拷贝
数组
slice(idx1, idx2);concat(arr1, arr2,…)//slice()和concat()这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝

2.1 JSON.parse(JSON.stringify())

日期类型、方法、正则表达式均没有复制成功

let obj = {
  a:1,
  arr:[1,3,5,7,9],
  c:{
    num:100
  },
  fn:function(){
     console.log(1)
  },
  date:new Date(),
  reg:/\.*/g
}
function clone1(obj){ // 使用JSON.parse(JSON.stringify(obj))
  return JSON.parse(JSON.stringify(obj))
}
let obj1 = clone1(obj);
console.log(obj === obj1); //false 代表复制成功了
obj.c.num = 555;
console.log(obj.c.num,obj1.c.num) // 555,100
console.log(obj1)
//{a: 1,arr: (5) [1, 3, 5, 7, 9],c: {num: 100},date: "2020-09-15T06:22:52.730Z",reg: {}}
//日期类型、方法、正则表达式均没有复制成功
2.2 obj = object.assign(obj1,obj2,obj3)

一级是深拷贝,二级浅拷贝
浅拷贝 将obj2,obj3合并到obj1,改变obj1,返回合并后的对象obj

2.3自定义拷贝方法
 function deepClone(obj){
    let objClone =  Array.isArray(obj) ? [] : {};
    if (obj && typeof obj === 'object') {
      for(let key in obj){
        if (obj[key] && typeof obj[key] === 'object'){
          objClone[key] = deepClone(obj[key]);
        }else{
          objClone[key] = obj[key]
        }
     }
   }
   return objClone;
 }
2.4 concat(arr1, arr2,…)slice(idx1, idx2)
var arr1 = [{"name":"weifeng"},{"name":"boy"}];//原数组
var arr2 = [].concat(arr1);//拷贝数组
arr1[1].name="girl";
console.log(arr1);// [{"name":"weifeng"},{"name":"girl"}]
console.log(arr2);//[{"name":"weifeng"},{"name":"girl"}]
复制代码
var a1=[["1","2","3"],"2","3"],a2;
a2=a1.slice(0);
a1[0][0]=0; //改变a1第一个元素中的第一个元素
console.log(a2[0][0]);  //影响到了a2

var b1=[["1","2","3"],"2","3"],b2;
b2=b1.slice(0);
b1[0][0]=0; //改变a1第一个元素中的第一个元素
console.log(b2[0][0]);  //影响到了a2
3.遍历数据

for in for of
foreach 不改原数组,没有返回值,不可跳出
map 不改原数组,返回新数组
filter 不改原数组,返回符合条件的新数组
every ----true/false
some ----true/false
reduce ----累加器
keys,values,entries----返回可遍历对象

for in------index

for of------val

foreach------不改变原数组,没有返回值,不能打断

arr.forEach((item,index,array)=>{
    //执行代码
    参数:value数组中的当前项, index当前项的索引, array原始数组;
})

map----不改变原数组,返回一个新数组

arr.map(function(value,index,array){
  //do something
  return XXX
})

filter----不改变原数组,返回符合条件的新数组

arr.filter(item => item.done)

every----每一项为true返回true

var arr = [ 1, 2, 3, 4, 5, 6 ]; 
console.log( arr.every( function( item, index, array ){ 
        return item > 3; 
    })); 
false

some----有一项为true返回true

reduce----接收一个函数作为累加器(accumulator)
var total = [0,1,2,3,4].reduce((a, b)=>a + b); //10
reduceRight-----方法的功能和reduce()功能是一样的,不同的是reduceRight()从数组的末尾向前将数组中的数组项做累加

find----find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined

var stu = [
    {
        name: '张三',
        gender: '男',
        age: 20
    },
    {
        name: '李四',
        gender: '男',
        age: 20
    }
]
function getStu(element){
   return element.name == '李四'
}
stu.find(getStu)
//返回结果为
//{name: "李四", gender: "男", age: 20}

keys,values,entries----它们都返回一个遍历器对象,可以用for…of循环进行遍历
keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历

for (let index of ['a', 'b'].keys()) {
console.log(index);
}
// 0
// 1
for (let elem of ['a', 'b'].values()) {
console.log(elem);
}
// 'a'
// 'b'
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"
4.拼接

4.1拼接

split—字符串拼接数组

±–字符串拼接字符串
join----数组拼接字符串
concat—数组拼接

4.2增删改查

splice
slice
indexOf -----找到返回下标,没找到返回-1 str.indexOf(“a”);arr.indexOf(‘a’)
str.includes(“d”)
Array.prototype.includes

5.其他

pop push shift unshift
数组排序
arr.sort()-arr.reverse();
冒泡排序原理(相邻进行比较,大的放在后面)
博客地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值