1、安全的类型检测

  Object.prototype.toString.call(obj) => "[object NativeConstructorName]"

 /**
* 判断变量的类型
* @param {*} obj 需要判断的变量
* @return string "boolean/number/string/function/array/date/regExp/undefined/null/object"
*/
function getType (obj) {
const class2Type = {
'[object Boolean]': 'boolean',
'[object Number]': 'number',
'[object String]': 'string',
'[object Function]': 'function',
'[object Array]': 'array',
'[object Date]': 'date',
'[object RegExp]': 'regExp',
'[object Undefined]': 'undefined',
'[object Null]': 'null',
'[object Object]': 'object'
}
return class2Type[Object.prototype.toString.call(obj)] || 'object'
}

2、判断一个对象是否是window对象

 // 判断obj是否是window对象
function isWindow (obj) {
return obj !== null && obj === obj.window
}

3、判断一个对象是否是数组

 // 判断一个对象是否是数组
function isArray (obj) {
return Array.isArray ? Array.isArray(obj) : getType(obj) === 'array'
}

4、判断一个对象自身属性中是否具有指定的属性,非继承的属性

  Object.prototype.hasOwnProperty.call('propsName')

 o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
o.hasOwnProperty('hasOwnProperty'); // 返回 false
 // 判断一个对象是否是纯粹的对象(通过 "{}" 或者 "new Object" 创建的)
function isPlainObject (obj) {
// Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性,true表示是自身的属性
const hasOwn = Object.prototype.hasOwnProperty // 不拷贝非对象、DOM对象、window对象
if (!obj || getType(obj) !== 'object' || obj.nodeType || isWindow(obj)) {
return false
}
try {
// Not own constructor property must be Object
if (obj.constructor &&
!hasOwn.call(obj, 'constructor') &&
!hasOwn.call(obj.constructor.prototype, 'isPrototypeOf')) {
return false
}
} catch (e) {
// IE8,9 Will throw exceptions on certain host objects #9897
return false
} // Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key
for (key in obj) {} return key === undefined || hasOwn.call(obj, key)
}

5、深浅拷贝

 // 用JQ中的extend的方法来进行对象的深浅拷贝
export function merge () {
let options
let name
let src
let copy
let copyIsArray
let clone
let target = arguments[0] || {} // 获取第一个参数的值
let i = 1
let length = arguments.length // 获取传入参数的个数
let deep = false // 深浅拷贝标识,true表示深拷贝,false表示前拷贝 // 判断第一个参数是否是boolean值,如果是,那么应该从第3个参数开始进行深拷贝,否则进行浅拷贝
// merge(deep,target,source1,source2...)
if (typeof target === 'boolean') {
deep = target
i = 2
target = arguments[1] || {} // 获取目标源
} // 对目标源target进行判断
if (typeof target !== 'object' && getType(target) !== 'function') {
target = {}
} // 如果只传入两个参数,没有源数据
// merge(true,{})
if ( length === i ) {
--i;
} for (; i < length; i++) {
// 处理非空的源参数
if ((options = arguments[i]) !== null) {
// 获取源参数中的key值
for (name in options) {
// 通过key值获取目标源和源中的值
src = target[name]
copy = options[name] // 避免死循环
if (target === copy) {
continue
}
// 深拷贝,只拷贝纯粹的obj或者数组
if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
// 拷贝的是数组
if (copyIsArray) {
copyIsArray = false
clone = src && isArray(src) ? src : []
} else {
clone = src && isPlainObject(src) ? src : {}
}
target[ name ] = merge(deep, clone, copy)
} else if (copy !== undefined) {
target[ name ] = copy
}
}
}
}
return target
}

PS:使用JSON.stringify()和JSON.parse()也可以实现深拷贝,也可以使用JSON.stringify来判断两个对象是否相等。

Jquery的深浅拷贝涉及到的知识点的更多相关文章

  1. python中set(集合),深浅拷贝以及一些补充知识点

    1.set集合 特点:无序,不重复,元素必须可哈希(不可变) 作用:去重复 本身是可变的数据类型.有增删改查操作.{集合的增删改查操作应用较少,这里不做详细介绍了(这里的增有一个方法update注意这 ...

  2. 深浅拷贝, for循环小知识点 str操作 list的删除问题,类型转换

    深浅拷⻉  : lst1 = ["⾦⽑狮王", "紫衫⻰王", "⽩眉鹰王", "⻘翼蝠王"] lst2 = lst1 ...

  3. 深浅拷贝,原生和JQuery方法实现

    7-17: 1:e.target.parentNode.remove();成功,查询一下JS原生的remove方法 2:复习JS DOM的原生操作方法,比如innerHTML(),insertBefo ...

  4. 知识点补充 set 深浅拷贝

    一 对前面知识点的补充 1.str中的join()方法是将列表转换成字符串 lst = ["韩雪","赵丽颖","黄渤","李连杰 ...

  5. python学习打卡 day07 set集合,深浅拷贝以及部分知识点补充

    本节的主要内容: 基础数据类型补充 set集合 深浅拷贝 主要内容: 一.基础数据类型补充 字符串: li = ["李嘉诚", "麻花藤", "⻩海峰 ...

  6. jQuery开发插件的两个方法 js 深浅拷贝

    1.jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法.由全局函数来调用, 主要是用来拓展个全局函数 2.jQuery.fn.extend(object);为jQu ...

  7. Python-Day3知识点——深浅拷贝、函数基本定义、内置函数

    一.深浅拷贝 import copy #浅拷贝 n1={'k1':'wu','k2':123,'k3':['carl',852]} n2=n1 n3=copy.copy(n1) print(id(n1 ...

  8. set集合,深浅拷贝以及部分知识点补充

    目录: 1.基础数据类型补充 2.set集合 3.深浅拷贝 一,基础数据类型补充 字符串的基本操作 li = ["李李嘉诚", "麻花藤", "⻩黄海 ...

  9. python day- 7 进本数据类型的先关知识点 set集合 深浅拷贝

    一.基本数据类型相关知识 1.str.    join()函数 关于字符串 a = "我爱北京" b = a.join("真的")            将&q ...

随机推荐

  1. springboot2.0入门(一)----springboot 简介

    一.springboot解决了什么? 避免了繁杂的xml配置,框架自动帮我们完成了相关的配置,当我们需要进行相关插件集成的时候,只需要将相关的starter通过相关的maven依赖引进,并可以进行相关 ...

  2. 04 DRF内容回顾、用户登录 (含跨域) (vuex vue-cookie)、用户认证 (Auth认证)(拦截器)

    1.内容回顾 1.视图中常见的继承 2.频率访问控制源码 3.序列化,反序列化 2.初始化代码 1.后端代码:AuthView (1)目录结构 (2)urls (3)view (4)注释掉cors ( ...

  3. Centos创建用户并授权

    创建新用户 [root@VM ~]# adduser it为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略:[root@VM_~]# passwd itChanging passwo ...

  4. luogu P4194 矩阵

    嘟嘟嘟 先二分. 令二分的值为\(mid\),则对于每一行都要满足\(|\sum_{i = 1} ^ {n} (A_{ij} - B_{ij})|\),把绝对值去掉,就得到了\((\sum_{i = ...

  5. 记录二:tensorflow2.0写MNIST手写体

    最近学习神经网络,tensorflow,看了好多视频,查找了好多资料,感觉东西都没有融入自己的思维中.今天用tensorflow2.0写了一个MNIST手写体的版本,记录下学习的过程. 复现手写体识别 ...

  6. [转载]作为理工科学生,我们为什么要练就好的文笔?我们需要发blog来记录学习历程?

    文/JoeyChen 工程师该怎样才能突破自己的能力瓶颈?写 blog! 工程师该怎样精进自己在职涯上所需要的能力?写 blog! 工程师该怎样才能保持学习与成长的动能?写 blog! 工程师该怎样才 ...

  7. Restorator 2018 v3.90汉化注册版 含注册码汉化激活教程

    链接:https://pan.baidu.com/s/1wfh5VQfNgbDr-glezL4faQ 提取码:y507

  8. LG2467 地精部落

    题意 给出\(n\),求有几个\(W\)形的\(n\)的全排列(震荡) 思路 可以变求出第二个数比第一个数大的,再翻倍就好 设\(f[i][j]\)表示\(i\)个数中\(j\)个数不符合序列 转移时 ...

  9. npm修改源

    获取原来的镜像地址 npm get registry 修改源 npm config set registry http://registry.npm.taobao.org/

  10. 2018icpc 徐州h题

    题目大意: https://codeforces.com/gym/102012/problem/H?csrf_token=c9d0191a64a241166d54a565b1615125 区间[l , ...