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

 /*
* @Author: guojufeng@
* @Date: 2017-12-20 15:07:06
* @purpose 获取一个值的类型
* @param {variateName} target: 要获取类型的变量名或对象
* @output {string} result || "null": 返回的参数 - result或者null,为字符串形式的
*/
getType: function (target) {
if (target === null) {
console.log("getType类型判断为: " + target)
return "null";
}
let result = typeof (target);
if (result == "object") {
if (target instanceof Array) {
result = "array";
} else if (target instanceof Object) {
let target = Object.prototype.toString.call(target);
if (target == "[object Object]") {
result = "object";
} else {
result = target;
}
}
}
console.log("getType类型判断为: " + result)
return result; //返回类型值的字符串形式
}

应用:

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

二、深拷贝

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

/* 思路 */
查值的类型
  三种方法:1、instanceof 2、Object.prototype.toString.call(target) 3、target.constuctor

如果是原始值
  就直接复制
如果是引用值,
  则进行遍历,查看每一项的具体类型
    如果是数组,新建一个数组,forEach时把每一项抛进新数组
    如果是对象,新建一个对象,for in时让新旧对象的键值一一对应
      遍历过程中,再次判断引用类型值的每一项
        如果是原始值,就直接复制
        如果是引用值,就继续看具体类型、新建对应类型、一一遍历
          遍历过程中,再次判断引用类型值的每一项,
            如果是原始值,就直接复制
            如果是引用值,就继续看具体类型、新建对应类型、一一遍历
              遍历~~~【->-> 递归】
 
 /*
* @Author: guojufeng@
* @Date: 2018-10-30 20:48:44
* @purpose 深度克隆
* @param {variateName} origin: 要克隆的对象变量名
* @output {对应值} 根据origin的类型返回的具体值
*/
function deepClone(origin) {
let type = getType(origin),
target;
if (type == "array") {
target = [];
/* 数组 */
origin.forEach(el = >{
console.log("ele", el) target.push(deepClone(el));
});
} else if (type == "object") {
/* 对象 */
target = {};
for (const key in origin) {
if (origin.hasOwnProperty(key)) {
/* 注意,只拷贝元素身上的,而不拷贝其原型上的值 */
const el = origin[key];
target[key] = deepClone(el);
}
}
} else if (type == "function") {
/* 函数 */
target = function() {};
target = origin;
} else {
/* 原始值 */
target = origin;
}
return target;
}

应用:

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 都没有任何影响。

三、纯数字数组的排序

升序、降序、乱序(主要是对sort方法的简单应用与封装)。

 /*
* @Author: guojufeng@
* @Date: 2018-10-30 20:48:44
* @params {array}: 要排序的数组
* @params {type}: 数字,表示期望排序的顺序:1升序,2降序,3乱序
*/
function getSort(array, type) {
if (xingorg1Utils.getType(array) == "object") {
/* 伪数组转换为数组 */
array = Array.prototype.slice.call(array);
}
array.sort((a, b) = >{
/*
原理:返回值比较
当返回值为负数时,两个参数中前面的数放在前边
当返回值为正数时,两个参数中后面的数放在前边
当返回值为0时,参数位置不动
a,b代表当时比较的两位数,前边大于后边的,相减自然得正数。前边小于后边得,
*/
if (type == 1) {
return a - b;
// return 1;这样直接返回一个正数是不行额。
} else if (type == 2) {
return - a + b;
// return -1;这样直接返回一个负数是不行额。
} else if (type == 3) {
/* 原理就是,math randow返回得时0-1得开区间,拿返回得数减去0.5的话,则会随机返回正数或者负数。正数就前边得放前边,负数就后边的放前边。总之就是乱来。 */
let nowNum = Math.random();
// console.log(nowNum,nowNum-0.5)
return nowNum - 0.5;
}
}) return array;
}

应用:

 var arr = [12,61,7,21,357,215357,923,9723,53,1];
console.log(getSort(arr,1))
console.log(getSort(arr,2))
console.log(getSort(arr,3))
 

四、数组去重

/* 思路 */
准备一个对象和一个新数组,
循环原数组时,将数组的值当做对象的键,且对应值为true(/1皆可),
然后每次拿原数组的下一个值都去判断一下对象中是否有这个值,
没有再push到新数组中去,最后返回新数组。
 /*
* @Author: guojufeng@
* @Date: 2018-11-05 09:35:14
* 数组去重
* @params {arr}: 要去重的原数组
* @return {newArr}: 返回去重后的数组
*/
uniqArr: function (arr) {
var obj = {},
newArr = [];
obj[arr[0]] = true;
newArr.push(arr[0]);
arr.forEach((element) => {
if (!obj[element]) {
obj[element] = true;
newArr.push(element);
}
});
return newArr;
}
}

应用:

console.log(uniqArr([1, 2, 23, 1, 35, 1, 6, 34]))
console.log(uniqArr([1, 2, 23, 1, "gjf", 1, 6, "gjf","gfj"]))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

js - 常用功能方法汇总(updating...)的更多相关文章

  1. js常用字符串方法汇总

    concat()将两个或多个字符的文本组合起来,返回一个新的字符串. var a = "hello"; var b = ",world"; var c = a. ...

  2. js如何操作表格(常用属性方法汇总)

    js如何操作表格(常用属性方法汇总) 一.总结 一句话总结: 二.表格相关的属性和方法 1.1 Table 对象集合 cells[] 返回包含表格中所有单元格的一个数组. 语法:tableObject ...

  3. python-Redis模块常用的方法汇总

    Redes模块常用的方法汇总 一.创建建Redis对象 1.直接使用 import redis r = redis.Redis(host='127.0.0.1', port=6379) 2.连接池使用 ...

  4. JS常用校验方法(判断输入框是否为空,数字,电话,邮件,四舍五入等)

    JS常用校验方法: 1.判断输入框是否为空,为空时弹出提示框 2.关闭窗口 3.检查输入字符串是否为数字 4.强制把大写转换成小写 5.手机号码校验,长度为11位数字. 6.电子邮件校验 7.电话号码 ...

  5. ROS(indigo)机器人操作系统学习资料和常用功能包汇总整理(ubuntu14.04LTS)

    ROS(indigo)机器人操作系统学习资料和常用功能包汇总整理(ubuntu14.04LTS) 1. 网站资源: ROSwiki官网:http://wiki.ros.org/cn GitHub    ...

  6. 前端Js跨域方法汇总—剪不断,理还乱,是跨域

    1.通过jsonp跨域2.通过修改document.domain来跨子域(iframe)3.隐藏的iframe+window.name跨域4.iframe+跨文档消息传递(XDM)5.跨域资源共享 C ...

  7. (转)Android之常用功能方法大集合

    这些,都是Andorid中比较常用的方法和功能,在网上搜集整理一下记录之,以备不时之需.由于经过多次转载,源文作者不确凿,在此申明,敬请见谅.不得不赞,非常实用. 1.判断sd卡是否存在 boolea ...

  8. 【js常用DOM方法】

    介绍几个js DOM的常用方法 获取元素节点 getElementById  getElementsByTagName  getElementsByClassName 先写一个简单的网页做测试: /* ...

  9. js 常用功能实现(函数)

    1.10 个短小实用的代码片段 :https://www.jianshu.com/p/3ef822ec5a63 2.js常用函数  : https://www.cnblogs.com/wangyuyu ...

随机推荐

  1. Knockout.Js官网学习(加载或保存JSON数据)

    前言 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多数的Ajax应用程 ...

  2. 递归与迭代的联系以及优缺点(以c++为例)

    1.递归的定义: 程序直接或间接的调用自身的方法. 递归算法的特点:(1) 递归就是在过程或函数里调用自身.(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口.(3) 递归算法解题通 ...

  3. 04-树5 Root of AVL Tree + AVL树操作集

    平衡二叉树-课程视频 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the tw ...

  4. Java多线程学习(吐血超详细总结)(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但 ...

  5. Mac下安装Mysql以及修改Mysql密码

    1.安装Mysql 安装有2种办法,一种是下载mysql安装文件,慢慢安装,另一种就是下载xmpp,里面自带mysql,就像是安装普通的mac软件一样,安装完毕,就有了mysql了. 方法一,官网下载 ...

  6. Spark实现K-Means算法

    K-Means算法是一种基于距离的聚类算法,采用迭代的方法,计算出K个聚类中心,把若干个点聚成K类. MLlib实现K-Means算法的原理是,运行多个K-Means算法,每个称为run,返回最好的那 ...

  7. NeoFinder for Mac(增强型文件管理工具)破解版安装

    1.软件简介    NeoFinder 是 macOS 系统上一款帮助用户管理磁盘的 Mac 工具,NeoFinder for mac 能迅速组织您的数据,无论是在外部或内部磁盘,或任何其他卷.它能记 ...

  8. linux ssh

    SSH 是建立在应用层和传输层基础上的一种安全协议. SSH传输数据是加密的,可以有效防止传输过程被截取数据保障安全. SSH的数据是经过压缩的,所以可以加快传输的速度 1. 首先查看一下当前linu ...

  9. nodeJs--模块module.exports与实例化方法

    在nodejs中,提供了exports 和 require 两个对象,其中 exports 是模块公开的接口,require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象.而在e ...

  10. 【Java虚拟机】浅谈Java虚拟机

    跨平台 Java的一大特性是跨平台,而Java是如何做到跨平台的呢? 主要依赖Java虚拟机,具体来说,是Java虚拟机在各平台上的实现. Java虚拟机在不同的平台有不同的实现.同一份字节码,通过运 ...