JS 技巧

 1:代码复用 - 适用于多表单验证 

/* 代码复用:适用于多表单验证 */

        // 验证规则配置
        const scheme = {
            first: {
                required: true,
            },
            second: {
                required: true,
            },
            last: {
                required: false
            }
        }

        // 验证函数
        const validate = (scheme, values) => {
            for (field in scheme) {
                if (scheme[field].required) {
                    if (!values[field]) {
                        return false;
                    }
                }
            }
            return true;
        };

        console.log(validate(scheme, { first: 'Bruce' }));   // false

        console.log(validate(scheme, { first: 'Bruce', second: 'Wayne' }));   // true

2:函数参数中解构嵌套对象

/* 函数参数中解构嵌套对象 */

        const car = {
            model: 'bmw 2020',
            engine: {
                v6: true,
                turbo: true,
                vin: 123456
            }
        };

        const modelAndVin = ({ model, engine: { vin } }) => {
            console.log(`model: ${model} vin: ${vin}`);
        };

3:使用解构删除不必要的属性

有时候你不希望保留某些对象属性,也许是因为它们包含敏感信息或仅仅是太大了(just too big)。你可能会枚举整个对象然后删除它们,但实际上只需要简单的将这些无用属性赋值给变量,然后把想要保留的有用部分作为剩余参数就可以了。

下面的代码里,我们希望删除_internal和tooBig参数。我们可以把它们赋值给internal和tooBig变量,然后在cleanObject中存储剩下的属性以备后用。

/* 3: 使用解构删除不必要的属性 */

        let { _internal, tooBig, ...cleanObject } = { el1: 1, _internal: "secret", tooBig: {}, el2: 2, el3: 3 };

        console.log(cleanObject); // {el1:  1 , el2:  2 , el3:  3 }

4:数组对象解构

数组也可以对象解构,可以方便的获取数组的第n个值

/* 4:数组对象解构 */

        const csvFileLine = "1997,John Doe,US,john@doe.com,New York";
        const { 2: country, 4: state } = csvFileLine.split(',');

        console.log(country, state); // US, New York

5: 数组平铺到指定深度

const flatten = (arr, depth = 1) => {
            return depth != 1 ?
                arr.reduce((a, v) =>
                    a.concat(Array.isArray(v) ? flatten(v, depth - 1) : v), []) :
                arr.reduce((a, v) => a.concat(v), []);
        };

        console.log(flatten([1, [2], 3, 4])); // [1, 2, 3, 4]

        console.log(flatten([1, [2, [3, [4, 5], 6], 7], 8], 2)); // [1, 2, 3, [4, 5], 6, 7, 8]

6:使用解构来交换参数值

        let param1 = 1;
        let param2 = 2;
        [param1, param2] = [param2, param1];

        console.log(param1); // 2
        console.log(param2);  // 1

7:统计数组中相同项的个数

const cars = ['BMW', 'Benz', 'Benz', 'Tesla', 'BMW', 'Toyota'];

        const carsObj = cars.reduce((obj, name) => {
            obj[name] = obj[name] ? ++obj[name] : 1;
            return obj;
        }, {});

        console.log(carsObj);  // {BMW: 2, Benz: 2, Tesla: 1, Toyota: 1}

8:数值补0操作

const addZero1 = (num, len = 2) => (`0${num}`).slice(-len);

const addZero2 = (num, len = 2) => (`${num}`).padStart(len, 0);

console.log(addZero1(3));   // 03
console.log(addZero2(32, 4));   // 0032

9:将数值精确到指定位数

const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`);

console.log(round(1.345, 2));    // 1.35
console.log(round(1.345, 1));    // 1.3

10:一次性函数(适用于那些只需要执行一次的初始化代码)

var sca = function () {
    console.log('msg');
    sca = function () {
        console.log('foo');
    }
}

sca()  // msg
sca()  // foo
sca()  // foo

11: 隐士返回值

/** 返回值使我们通常用来返回函数最终结果的关键字。只有一个语句的箭头函数, 可以隐士返回结果(函数必须省略{},以便省略返回关键字) **/

/** 要返回多行语句(例如对象文本),需要使用() 而不是{}来包裹函数体。这样可以确保代码以单个语句的形式进行求值 **/

function calcCircumFerence(diameter) {
            return Math.PI * diameter;
        }

        // 简写为

        calcCircumFerence = diameter => (Math.PI * diameter);

12:函数参数默认值 

const func = (l, m = 3, n = 4) => (l * m * n);

        console.log(func(2)); // 24

13: 判断奇数偶数(!! (num & 1))

        console.log(!!(5 & 1));     // true
        console.log(!!(-5 & 1));    // true

        console.log(!!(6 & 1));     // false
        console.log(!!(-6 & 1));    // false

14: 取整

        console.log(1.3 | 0);   // 1
        console.log(-1.9 | 0);  // -1

15: 双位运算符

/** 可以使用双位操作符来代替整数的 Math.floor(), 代替负数的 Math.ceil()。双否定位操作符的优势在于它执行相同的操作运行速度更快 **/

        console.log(~~4.5); // 4
        console.log(Math.floor(4.5));   // 4
        console.log(Math.ceil(4.5));    // 5

        console.log(~~-4.5);    // -4
        console.log(Math.floor(-4.5));  // -5
        console.log(Math.ceil(-4.5));   // -4

16:数据类型判断

Object.prototype.toString.call() 返回的数据格式为[object Object]类型,然后再用slice截取第8位到倒数一位,

得到结果为 Object 

        /* Object.prototype.toString.call() 返回的数据格式为[object Object]类型,然后再用slice截取第8位到倒数一位,得到结果为 Object */
        const _toString = Object.prototype.toString;

        function toRawType(value) {
            return _toString.call(value).slice(8, -1);
        }

        console.log(toRawType({}));                 // Object
        console.log(toRawType([]));                 // Array
        console.log(toRawType(true));               // Boolean
        console.log(toRawType(undefined));          //  Undefined
        console.log(toRawType(null));               //  Null
        console.log(toRawType(function () { }));    // Function

17:数据求和

        /** 数组求和 **/
        const arr = [1, 2, 3, 4, 5]
        // const sum = arr.reduce((pre, item) => {
        //     return pre + item
        // }, 0)
        // 简写
        const sum = arr.reduce((pre, item) => pre + item, 0);
        console.log(sum) // 15

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值