js - 常用功能方法汇总(updating...)

一、查值的类型(可用于拷贝)

 1 /*
 2     * @Author: guojufeng@ 
 3     * @Date: 2018-10-30 20:07:06
 4     * @purpose 获取一个值的类型
 5     * @param {variateName} target: 要获取类型的变量名或对象
 6     * @output {string} result || "null": 返回的参数 - result或者null,为字符串形式的
 7     */
 8     function getType(target) {
 9       if(target === null){
10         console.log(target)
11         return "null";
12       }
13       let result = typeof (target);
14       if (result == "object") { 
15         if (target instanceof Array) {
16           result = "array";
17         } else if (target instanceof Object) {
18           result = "object";
19         }
20       }
21       console.log(result)
22       return result;//返回类型值的字符串形式
23     }

 应用:

1 var nu= null;// null 怎么算
2 var un= undefined;
3 var c = new Array;
4 var d = {};
5 console.log(getType(c),getType(d),getType(nu),getType(un))

 二、深拷贝

接上一个方法,实现深拷贝。

/* 思路 */

查值的类型

  三种方法:1、instanceof 2、tostring.call(target) 3、target.constuctor

如果是原始值

  就直接复制

如果是引用值,

  则进行遍历,查看每一项的具体类型

    如果是数组,新建一个数组,forEach时把每一项抛进新数组

    如果是对象,新建一个对象,for in时让新旧对象的键值一一对应

      遍历过程中,再次判断引用类型值的每一项

        如果是原始值,就直接复制

        如果是引用值,就继续看具体类型、新建对应类型、一一遍历

          遍历过程中,再次判断引用类型值的每一项,

            如果是原始值,就直接复制

            如果是引用值,就继续看具体类型、新建对应类型、一一遍历

              遍历~~~【->-> 递归】

 1 /*
 2     * @Author: guojufeng@ 
 3     * @Date: 2018-10-30 20:48:44 
 4     * @purpose 深度克隆
 5     * @param {variateName} origin: 要克隆的对象变量名
 6     * @output {对应值} 根据origin的类型返回的具体值
 7 */
 8 function deepClone(origin) {
 9     let type = getType(origin),
10     target;
11     if (type == "array") {
12         target = [];
13         /* 数组 */
14         origin.forEach(el = >{
15             console.log("ele", el) target.push(deepClone(el));
16         });
17     } else if (type == "object") {
18         /* 对象 */
19         target = {};
20         for (const key in origin) {
21             if (origin.hasOwnProperty(key)) {
22                 /* 注意,只拷贝元素身上的,而不拷贝其原型上的值 */
23                 const el = origin[key];
24                 target[key] = deepClone(el);
25             }
26         }
27     } else if (type == "function") {
28         /* 函数 */
29         target = function() {};
30         target = origin;
31     } else {
32         /* 原始值 */
33         target = origin;
34     }
35     return target;
36 }

应用:

var test = [1, 2, null, undefined, false, [3, 4]];
var res = deepClone(test);
console.log(res, getType(res)) 
res.push(222);
console.log(res) 
console.log(test) 
var test1 = {
    a: 1,
    b: 2,
    c: [1, 2],
    d: function() {
        console.log(this.d)
    }
};
var res1 = deepClone(test1);
console.log(res1, getType(res1)) 
res1.b = 3;
res1.c.push('test');
console.log("res1修改值", res1);
console.log("test1原始值", test1);
res1.d = null;
console.log("res1修改值", res1);
console.log("test1原始值", test1);

简单类型的值克隆就不说了,这里举例了两个:一个克隆数组,一个克隆对象。

这个是克隆数组后,新数组增加值与元素组的比较。可以发现,新数组 res 虽然新增了值,但是对旧数组 test 没有影响。

说明这种引用类型的克隆不是简单的复制了一个指针

还有这个对象的克隆,新对象 res1 增添自己属性上数组的值【res1.c.push('test');】以及修改销毁自身的函数【res1.d = null;】,对于原对象 test1 都没有任何影响。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信公众号:Java团长

Java基础之反射(非常重要)

(使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码))

11230
来自专栏源哥的专栏

一个用来保存参数的容器类

9030
来自专栏java技术学习之道

java反射详解

24750
来自专栏二进制文集

Java 反射详解

反射(Reflection)能够让运行于 JVM 中的程序检测和修改运行时的行为。

12830
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

Java反射研究和实践

本博文中项目代码已开源下载地址:GitHub Java反射研究和实践 概述 Java的反射机制是Java语言动态性的一种体现。反射机制是通过反射API来实现的,...

36880
来自专栏java一日一条

ava enum(枚举)使用详解 + 总结

enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。

18530
来自专栏陈纪庚

javascript冷知识

  如果放在数值前的话,对数值不会产生任何影响,不过放在其他的数据类型前面的话,就等于调用number()将他转为数字,布尔值false被转为0,ture被转为...

12430
来自专栏平凡文摘

深入理解Java类型信息(Class对象)与反射机制

15830
来自专栏coding for love

JS入门难点解析12-继承的实现方式与优缺点

(注1:如果有问题欢迎留言探讨,一起学习!转载请注明出处,喜欢可以点个赞哦!) (注2:更多内容请查看我的目录。)

25030
来自专栏互扯程序

大牛:你真的懂反射吗?

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

15530

扫码关注云+社区

领取腾讯云代金券