关于数据类型的一些判断:例如是objects
能够全部统一判断的方法:
①Object.prototype.toString.call(objects) === ‘[object Array]‘;
获取this对象的[[Class]]属性的值.[Class]]是一个内部属性,所有的对象都拥有该属性. 表明该对象的类型
②objects.instanceof 数据类型 objects.constructor==数据类型
上面2中方法只能判断基本的数据类型,
首先instanceof判断的时候当对象为对象里面的数组的时候判断不了只能判断数组的基本类型,而constructor属性是可以被改写的
③typeof 数据类型
该方法判断不了object,array,null等类型,其余的类型是可以判断的
④jquery.type()
不适用于数组对象
⑤用prototype原型进行
1.数组的判断
①Array.isArray(objects)
②可以通过数组独有的方法push和join
若不是数组的话则会报错
2.对象的判断
对象的判断就是上面的方法了,
那就在说下怎么判断对象是否为空
①用for in循环
for(var i in objects){
......//不为空执行
}
②将对象转化为json格式进行判断
- var jsonObj1 = JSON.parse(json); //使用JSON.parse() 将JSON字符串转为JS对象;
- var jsonObj2 = eval('(' + json + ')'); //使用eval() 将JSON字符串转为JS对象
- var jsonStr = JSON.stringify(json); //转为JSON字符串
if (JSON.stringify(objects) === '{}') {
......//为空执行
}
③key值数组为空
var a = {}
Object.keys(a) // []
if (Object.keys(object).length === 0) {
.... //为空执行
}
数组对象的拷贝
1.数组拷贝
方法一:遍历复制
1 var arr = ["a", "b"], arrCopy = [];
2 for (var item in arr) arrCopy[item] = arr[item];
3 arrCopy[1] = "c";
4 arr // => ["a", "b"]
5 arrCopy // => ["a", "c"]
方法二:slice()
可以参考 W3School 对 slice() 方法的描述:slice() 方法可从已有的数组中返回选定的元素。
调用格式为:
arrayObject.slice(start,end)
方法返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。该方法并不会修改数组,而是返回一个子数组。
在这里我们的思路是直接从数组开头截到尾:
arrCopy = arr.slice(0);
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]
可以看出成功创建了一份原数组的拷贝。
方法三:concat()
可以参考 W3School 对 concat() 方法的描述:concat() 方法用于连接两个或多个数组。
调用格式为:
arrayObject.concat(arrayX,arrayX,......,arrayX)
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
使用这种方法的思路是我们用原数组去拼接一个空内容,放回的便是这个数组的拷贝:
arrCopy = arr.concat();
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]
4.for 循环实现数组的深拷贝
for循环是非常好用的。如果不知道高级方法,通过for循环能够完成我们大多数的需求。
var arr = [1,2,3,4,5]
var arr2 = copyArr(arr)
function copyArr(arr) {
let res = []
for (let i = 0; i < arr.length; i++) {
res.push(arr[i])
}
return res
}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
如上,通过对数组的for循环,即可实现对数组的深拷贝了。
5.es6拷贝(运用rest即...)
const array = [1, 2];
const array2 = [...array];//es6
array2[0] = 2;
console.log(array) // [1, 2]
数组的去重
①ES6 的set方法去重
function dedupe(array) {
return [...new Set(array)]
}
var arr = [1,2,2,3,3,4,4,5,5
]console.log(dedupe(arr))
var set1 = Array.from(new Set([1,1,2,2,33,'33',44,'44']))
②利用数组的indexof;
var arr = ['abc','abc','ss','2','d','ss','2','ss','f','22','d'];
//定义一个新的数组
var s = [];
//遍历数组
for(var i = 0;i<arr.length;i++){
if(s.indexOf(arr[i]) == -1){ //判断在s数组中是否存在,不存在则push到s数组中
s.push(arr[i]);
}
}
console.log(s);
//输出结果:["abc", "ss", "2", "d", "f", "22"]
3.过滤数组中对象某一属性相同的方法
前两种只能过滤到数组中时基本类型的重复数据;
delRepeat(array) {
var hash = {};
array = array.reduce(function(item, next) {
hash[next.id] ? '' : hash[next.id] = true && item.push(next);
return item
}, []);
}
对象的拷贝
1.浅拷贝
①
var
Chinese = {
nation:
'中国'
}
var
Doctor = {
career:
'医生'
}
function
extendCopy(p) {
var
c = {};
for
(
var
i
in
p) {
c[i] = p[i];
}
c.uber = p;
return
c;
}
②要实现对象的浅复制,可以使用Object.assign方法
let target = {a: 123};
let source1 = {b: 456};
let source2 = {c: 789};
let obj = Object.assign(target, source1, source2);
console.log(obj);
2.深拷贝
①
function
deepCopy(p, c) {
var
c = c || {};
for
(
var
i
in
p) {
if
(
typeof
p[i] ===
'object'
) {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
}
else
{
c[i] = p[i];
}
}
return
c;
}
②使用JSON.parse()与JSON.stringify()对对象进行拷贝
通常情况下,我们可以使用JSON.parse()与 JSON.stringify()实现对象的深克隆,如下:
var clone = function (obj) {
return JSON.parse(JSON.stringify(obj));
}
这种方法只适用于纯数据json对象的深度克隆
③jQuery.extend()方法
http://www.runoob.com/jquery/misc-extend.html
https://www.cnblogs.com/yuqingfamily/p/5813650.html
$.extend(true,{}, objects);
上述代码就能直接的将objects深拷贝到{}里面去