记录一些js使用技巧

记录平时工作中常用的一些js小技巧。

判断对象是否为数组

function isArray(o) {
    return Object.prototype.toString.call(o) === '[object Array]';
}

将类数组对象转为数组

方法一:
Array.prototype.slice.call(arrayLike);

方法二:
Array.from(arrayLike)

方法三:
[...arrayLike]

数组去重

[...new Set([1, "1", 2, 1, 1, 3])]  // [1,'1',2,3]

取出一个数组中的最大值和最小值

var numbers = [5, 62 , 129 , -21 , 152 , 600 , 18555, -155];
var maxInNumbers = Math.max.apply(Math, numbers);
var minInNumbers = Math.min.apply(Math, numbers);

判断是否是在微信环境

function isWxEnv(){
    return (navigator.userAgent.toLowerCase().indexOf('micromessenger') > -1) ? true : false;
}

交换俩对象的值

let a = 1, b = 2;
[a, b] = [b, a];

金钱格式化

var test1 = '1234567890'
var format = test1.replace(/\B(?=(\d{3})+(?!\d))/g, ',')

多维数组拍平成一维数组

var a=[1, [[2], 3, 4], 5];
a.toString().split(',');  //["1", "2", "3", "4", "5"]

数组浅拷贝

浅拷贝是拷贝引用,只是将拷贝后的引用指向同一个对象实例,彼此间的操作还会互相影响

方法一:
var a=['old', 1, true, null, undefined];
var b=a.slice();

方法二:
var a=[{a:3}, 1, true, null, undefined];
var b=a.concat();
a[0].a=5;
console.log(b[0].a); //5

方法三:
var shallowCopy = function(obj) {
    if (typeof obj !== 'object') return;
    var newObj = obj instanceof Array ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = obj[key];
        }
    }
    return newObj;
}

对象浅拷贝

方法一:
let a = { b: {c:4} , d: { e: {f:1}} }
let g = Object.assign({},a)

深拷贝数组

深拷贝,在堆中重新分配内存,并且把源对象所有属性都进行新建拷贝,拷贝后的对象与原来的对象完全隔离,互不影响。

方法一:      

let arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]
let new_arr = JSON.parse( JSON.stringify(arr) );

(问题:不能拷贝函数)
该方法同样适用于对象,问题也是一样,不能拷贝函数

let a = { b: {c:4} , d: { e: {f:1}} }   
let h = JSON.parse(JSON.stringify(a));

方法二:
var deepCopy = function(obj) {
    if (typeof obj !== 'object') return;
    var newObj = obj instanceof Array ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
        }
    }
    return newObj;
}
显示 Gitment 评论