判断原始值和引用值 及深度克隆
时间:2019-02-11
本文章向大家介绍判断原始值和引用值 及深度克隆,主要包括判断原始值和引用值 及深度克隆使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
-
判断属性是原始值还是引用值
原始值:String Number fucntion Boolean undefined
引用值:Object Array Null
判断方法 typeOf //引用值 object -
如果是引用值判断是对象还是数组
判断方法:
2.1 construct
[].construct == Array / Object
弊端此方法容易被改写
let arr = [];
arr.construct = Object
arr.construct == Array // false
arr.construct == Object // true
2.2 instanceOf 运算符可以用来判断某个构造函数的prototype属性所指向的對象是否存在于另外一个要检测对象的原型链上。
[] instanceOf Array // true
[] instanceOf Object // true
{} instanceOf Array // false
{} instanceOf Object // true
2.3 Object.prototype.toString.call() 建议
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call({}) //"[object Object]"
Object.prototype.toString.call(null) //"[object Null]"
注意,这里的call改变this的指向是必不可少的,如果缺少
Object.prototype.toString([]) //"[object Object]"
Object.prototype.toString({}) //"[object Object]"
Object.prototype.toString(null) //"[object Object]"
深度克隆
function deepClone(origin, target) {
let toString = Object.prototype.toString,
isArr = '[object Array]'
//遍历orign
for (let prop in origin) {
//判断是否是其私有属性
if (origin.hasOwnProperty(prop)) {
//判断引用值和原始值
if (typeof origin == 'object') {
//判断是Array or Object
//--------
//if (toString.call(prop) == isArr) {
// target[prop] = []
// } else {
// target[prop] = {}
// }
//-----
target[prop] = toString.call(prop) == isArr ? []:{}
//递归复制内部
deepClone(origin[prop], target[prop])
} else {
target[prop] = origin[prop]
}
}
}
}
- 共享单车运维“朋友圈”越来越宽,乱停乱放现象有望改善吗?
- 【Spring实战】—— 15 Spring JDBC模板使用
- 前端开发总览
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- 基于AngularJS的过滤与排序
- 【Spring实战】—— 5 设值注入
- 科学家预测:未来100万年人类将变成半机械人类
- 【Spring实战】—— 8 自动装配
- 【Spring实战】—— 7 复杂集合类型的注入
- 【Spring实战】—— 6 内部Bean
- 几款可替代Dreamweaver的HTML5开发工具
- Linux下的Telnet设置方法介绍
- 2017年11月互联网和相关服务业保持快速增长
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java集成JWT
- Computer Graphics note(3):视口变换&光栅化
- Mac安装mysql
- 剑指Offer题解
- nginx 常见问题记录
- ReturnSingleDatabase为True报错的解决办法
- 【Vim】vim配置的选择
- 关于HashMap的一些理解
- SpringBoot2.x系列教程(六十一)Spring Boot集成FastDFS实现文件上传
- 解决对接华为kafka 进行Kerberos认证时的sun.security.krb5.KrbException
- Newbe.Claptrap 框架如何实现多级生命周期控制?
- Kafka linux(centos7)安装配置kerberos并在另一台机器上使用Java服务接收消息
- SpringCloud bus 手动post可用 使用webhooks自动更新配置失效的解决小记
- 处理Storm1.2.2 日志报错 与spring boot冲突
- Java 中的 ==, equals 与 hashCode 的区别与联系