js技巧_js技巧收集 - CSDN
精华内容
参与话题
  • 7 个有用JavaScript技巧

    千次阅读 多人点赞 2019-09-18 11:10:13
    数组去重 var arr = [1, 2, 3, 3, 4]; console.log(...new Set(arr)) >> [1, 2, 3, 4] 数组和布尔 ... 例如(0,undefined,null,false), 你可能不知道这样的技巧 var myArray = [1, 0 , und...

    数组去重

        var arr = [1, 2, 3, 3, 4];
        console.log(...new Set(arr))
        >> [1, 2, 3, 4]

    数组和布尔

    有时我们需要过滤数组中值为 false 的值. 例如(0undefinednullfalse), 你可能不知道这样的技巧

     var myArray = [1, 0 , undefined, null, false];
     myArray.filter(Boolean);
     >> [1]
    

    是不是很简单, 只需要传入一个 Boolean 函数即可.

    创建一个空对象

    有时我们需要创建一个纯净的对象, 不包含什么原型链等等. 一般创建空对象最直接方式通过字面量 {}, 但这个对象中依然存在 __proto__ 属性来指向 Object.prototype 等等.

    
        let dict = Object.create(null);
    
        dict.__proto__ === "undefined" 
    

    合并对象

    在JavaScript中合并多个对象的需求一直存在, 比如在传参时需要把表单参数和分页参数进行合并后在传递给后端

        const page = {
            current: 1,
            pageSize: 10
        }
    
        const form = {
            name: "",
            sex: ""
        }
    
        const params = {...form, ...page};
    
        /*
            {
                name: "",
                sex: "",
                current: 1,
                pageSize: 10
    
            }
        *

    利用ES6提供的扩展运算符让对象合并变得很简单.

    函数参数必须

    ES6中可以给参数指定默认值,确实带来很多便利. 如果需要检测某些参数是必传时,可以这么做

        const isRequired = () => { throw new Error('param is required'); };
    
        const hello = (name = isRequired()) => { console.log(`hello ${name}`) };
    
        // 这里将抛出一个错误,因为名字时必须
        hello();
        // 这也将抛出一个错误
        hello(undefined);
    
        // 正常
        hello(null);
        hello('David'); 
    

    解构赋值时使用别名

    解构赋值是一个非常受欢迎的JavaScript功能,但有时我们更喜欢用其他名称引用这些属性,所以我们可以利用别名来完成:

    
        const obj = { x: 1 };
    
        // Grabs obj.x as { x }
        const { x } = obj;
    
        // Grabs obj.x as { otherName }
        const { x: otherName } = obj;
    

    获取查询参数

    多年来,我们编写粗糙的正则表达式来获取查询字符串值,但那些日子已经一去不复返了; 现在我们可以通过 URLSearchParams API 来获取查询参数

    在不使用 URLSearchParams 我们通过正则的方式来完成获取查询参数的, 如下:

    
      function getQueryString(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        return r ? r[2] : null;
      }
    

    使用 URLSearchParams 之后:

    
        // 假设地址栏中查询参数是这样 "?post=1234&action=edit"
    
        var urlParams = new URLSearchParams(window.location.search);
    
        console.log(urlParams.has('post')); // true
        console.log(urlParams.get('action')); // "edit"
        console.log(urlParams.getAll('action')); // ["edit"]
        console.log(urlParams.toString()); // "?post=1234&action=edit"
        console.log(urlParams.append('active', '1')); // "?post=1234&action=edit&active=1"
    

    相比之前使用起来更加容易了.

    展开全文
  • JS开发小技巧

    2019-07-10 16:14:02
    1. 过滤唯一值 ES6 引入了 Set 对象和延展(spread)语法…,我们可以用它们来创建一个只包含唯一值的数组。 const array = [1, 1, 2, 3, 5, 5, 1] const uniqueArray = [...new Set(array)];...

     

    1. 过滤唯一值

    ES6 引入了 Set 对象和延展(spread)语法…,我们可以用它们来创建一个只包含唯一值的数组。

    const array = [1, 1, 2, 3, 5, 5, 1]
    const uniqueArray = [...new Set(array)];
    console.log(uniqueArray); // Result: [1, 2, 3, 5]
    

    在 ES6 之前,获得同样的数组需要更多的代码!

    这个技巧可以支持包含原始类型的数组:undefined、null、boolean、string 和 number。但如果你的数组包含了对象、函数或其他嵌套数组,就不能使用这种方法了。

    2. 在循环中缓存数组长度

    在我们学习使用 for 循环时,一般建议使用这种结构:

    for (let i = 0; i < array.length; i++){
      console.log(i);
    }
    

    在使用这种方式时,for 循环的每次迭代都会重复计算数组长度。

    有时候这个会很有用,但在大多数情况下,如果能够缓存数组的长度会更好,这样只需要计算一次就够了。我们可以把数组长度复制给一个叫作 length 的变量,例如:

    for (let i = 0, length = array.length; i < length; i++){
      console.log(i);
    }
    

    这段代码和上面的差不多,但从性能方面来看,即使数组变得很大,也不需要花费额外的运行时重复计算 array.length。

    3. 短路求值

    使用三元运算符可以很快地写出条件语句,例如:

    x > 100 ? 'Above 100' : 'Below 100';
    x > 100 ? (x > 200 ? 'Above 200' : 'Between 100-200') : 'Below 100';
    

    但有时候三元运算符仍然很复杂,我们可以使用逻辑运算符 && 和||来替代,让代码更简洁一些。这种技巧通常被称为“短路求值”。

    假设我们想要返回两个或多个选项中的一个,使用 && 可以返回第一个 false。如果所有操作数的值都是 true,将返回最后一个表达式的值。

    let one = 1, two = 2, three = 3;
    console.log(one && two && three); // Result: 3
    console.log(0 && null); // Result: 0
    

    使用||可以返回第一个 true。如果所有操作数的值都是 false,将返回最后一个表达式的值。

    let one = 1, two = 2, three = 3;
    console.log(one || two || three); // Result: 1
    console.log(0 || null); // Result: null
    

    示例 1

    假设我们想要返回一个变量的 length,但又不知道变量的类型。

    我们可以使用 if/else 来检查 foo 是否是一个可接受的类型,但这样会让代码变得很长。这个时候可以使用短路求值:

    return (foo || []).length;
    

    对于上述两种情况,如果变量 foo 具有 length 属性,这个属性的值将被返回,否则将返回 0。

    示例 2

    你是否曾经在访问嵌套对象属性时遇到过问题?你可能不知道对象或某个子属性是否存在,所以经常会碰到让你头疼的错误。

    假设我们想要访问 this.state 中的一个叫作 data 的属性,但 data 却是 undefined 的。在某些情况下调用 this.state.data 会导致 App 无法运行。为了解决这个问题,我们可以使用条件语句:

    if (this.state.data) {
      return this.state.data;
    } else {
      return 'Fetching Data';
    }
    

    但这样似乎有点啰嗦,而||提供了更简洁的解决方案:

    return (this.state.data || 'Fetching Data');
    

    4. 转换成布尔值

    除了标准的布尔值 true 和 false,在 JavaScript 中,所有的值要么是“真值”要么是“假值”。

    在 JavaScript 中,除了 0、“”、null、undefined、NaN 和 false 是假值之外,其他的都是真值。

    我们可以使用! 云算法来切换 true 和 false。

    > const isTrue  = !0; const isFalse = !1; const alsoFalse = !!0;
    > console.log(true); // Result: true console.log(typeof true); //
    > Result: "boolean"
    

    5. 转换成字符串

    要快速将数字转换成字符串,我们可以使用 + 运算符,然后在后面跟上一个空字符串。

    const val = 1 + "";
    console.log(val); // Result: "1"
    console.log(typeof val); // Result: "string"
    

    加粗样式 6. 转换成数字

    要把字符串转成数字,也可以使用 + 运算符。

    let int = "15";
    int = +int;
    console.log(int); // Result: 15
    console.log(typeof int); Result: "number"
    

    也可以使用这种方式将布尔值转成数字,例如:

    console.log(+true);  // Return: 1
    console.log(+false); // Return: 0
    

    在某些情况下,+ 运算符会被解析成连接操作,而不是加法操作。对于这种情况,可以使用两个波浪号:~~。

    一个波浪号表示按位取反操作,例如,~15 等于 -16。

    const int = ~~"15"
    console.log(int); // Result: 15
    console.log(typeof int); Result: "number"
    

    使用两个波浪号可以再次取反,因为 -(-n-1)=n+1-1=n,所以~-16 等于 15。

    7. 快速幂运算

    从 ES7 开始,可以使用 ** 进行幂运算,比使用 Math.power(2,3) 要快得多。

    console.log(2 ** 3); // Result: 8
    

    但要注意不要把这个运算符于 ^ 混淆在一起了,^ 通常用来表示指数运算,但在 JavaScript 中,^ 表示位异或运算。

    在 ES7 之前,可以使用位左移运算符 << 来表示以 2 为底的幂运算:

    // 以下表达式是等效的:
    Math.pow(2, n);
    2 << (n - 1);
    2**n;
    

    例如,2 << 3 = 16 等同于 2 ** 4 = 16。

    8. 快速取整

    我们可以使用 Math.floor()、Math.ceil() 或 Math.round() 将浮点数转换成整数,但有另一种更快的方式,即使用位或运算符 |。

    console.log(23.9 | 0);  // Result: 23
    console.log(-23.9 | 0); // Result: -23
    

    | 的实际行为取决于操作数是正数还是负数,所以在使用这个运算符时要确保你知道操作数是正是负。

    如果 n 是正数,那么 n|0 向下取整,否则就是向上取整。它会移除小数部分,也可以使用~~ 达到同样的效果。

    移除整数尾部数字

    | 运算符也可以用来移除整数的尾部数字,这样就不需要像下面这样:

    let str = "1553"; 
    Number(str.substring(0, str.length - 1));
    

    相反,我们可以这样:

    console.log(1553 / 10   | 0)  // Result: 155
    console.log(1553 / 100  | 0)  // Result: 15
    console.log(1553 / 1000 | 0)  // Result: 1
    

    9. 自动类绑定

    在 ES6 中,我们可以使用箭头进行隐式绑定,这样可以为类的构造器省下一些代码,并跟一些重复出现的表达式说再见,比如 this.myMethod = this.myMethod.bind(this)。

    import React, { Component } from React;
    export default class App extends Compononent {
      constructor(props) {
      super(props);
      this.state = {};
      }
    myMethod = () => {
        // This method is bound implicitly!
      }
    render() {
        return (
          <>
            <div>
              {this.myMethod()}
            </div>
          </>
        )
      }
    };
    

    10. 截取数组

    如果你想从一个数组尾部移除某些元素,可以使用一种比 splice() 更快的方法。

    例如,如果你知道初始数组的大小,可以像下面这样重新定义它的 length 属性:

    let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    array.length = 4;
    console.log(array); // Result: [0, 1, 2, 3]
    

    这显然是一种更简洁的解决方案。不过,我发现 slice() 的运行速度更快,所以,如果你更看重速度,可以像下面这样:

    let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    array = array.slice(0, 4);
    console.log(array); // Result: [0, 1, 2, 3]
    

    11. 获取数组最后的元素

    数组的 slice() 方法可以接受负整数,并从数组的尾部开始获取元素。

    let array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
    console.log(array.slice(-1)); // Result: [9]
    console.log(array.slice(-2)); // Result: [8, 9]
    console.log(array.slice(-3)); // Result: [7, 8, 9]
    

    12. 格式化 JSON

    你之前可能使用过 JSON.stringify,但你是否知道它还可以用来给 JSON 添加缩进?

    stringify() 方法可以接受两个额外的参数,一个是函数(形参为 replacer),用于过滤要显示的 JSON,另一个是空格个数(形参为 space)。

    space 可以是一个整数,表示空格的个数,也可以是一个字符串(比如’\t’表示制表符),这样得到的 JSON 更容易阅读。

    console.log(JSON.stringify({ alpha: 'A', beta: 'B' }, null, '\t'));
    // Result:
    // '{
    //     "alpha": A,
    //     "beta": B
    // }'

     原英文链接:https://medium.com/@bretcameron/12-javascript-tricks-you-wont-find-in-most-tutorials-a9c9331f169d

    展开全文
  • js技巧

    2018-10-12 08:04:00
    使用 Array.includes 来处理多重条件 举个栗子

    使用 Array.includes 来处理多重条件

    举个栗子 ?:

    // 条件语句
    function test(fruit) {
      if (fruit == 'apple' || fruit == 'strawberry') {
        console.log('red');
      }
    }
    

    乍一看,这么写似乎没什么大问题。然而,如果我们想要匹配更多的红色水果呢,比方说『樱桃』和『蔓越莓』?我们是不是得用更多的 || 来扩展这条语句?

    我们可以使用 Array.includes(Array.includes) 重写以上条件句。

    function test(fruit) {
      // 把条件提取到数组中
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      if (redFruits.includes(fruit)) {
        console.log('red');
      }
    }
    

    我们把红色的水果(条件)都提取到一个数组中,这使得我们的代码看起来更加整洁。

    少写嵌套,尽早返回

    让我们为之前的例子添加两个条件:
    - 如果没有提供水果,抛出错误。
    - 如果该水果的数量大于 10,将其打印出来。

    function test(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      // 条件 1:fruit 必须有值
      if (fruit) {
        // 条件 2:必须为红色
        if (redFruits.includes(fruit)) {
          console.log('red');
    
          // 条件 3:必须是大量存在
          if (quantity > 10) {
            console.log('big quantity');
          }
        }
      } else {
        throw new Error('No fruit!');
      }
    }
    
    // 测试结果
    test(null); // 报错:No fruits
    test('apple'); // 打印:red
    test('apple', 20); // 打印:red,big quantity
    

    让我们来仔细看看上面的代码,我们有: 1 个 if/else 语句来筛选无效的条件 3 层 if 语句嵌套(条件 1,2 & 3)

    就我个人而言,我遵循的一个总的规则是当发现无效条件时尽早返回

    /_ 当发现无效条件时尽早返回 _/
    
    function test(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      // 条件 1:尽早抛出错误
      if (!fruit) throw new Error('No fruit!');
    
      // 条件2:必须为红色
      if (redFruits.includes(fruit)) {
        console.log('red');
    
        // 条件 3:必须是大量存在
        if (quantity > 10) {
          console.log('big quantity');
        }
      }
    }
    

    如此一来,我们就少写了一层嵌套。这是种很好的代码风格,尤其是在 if 语句很长的时候(试想一下,你得滚动到底部才能知道那儿还有个 else 语句,是不是有点不爽)。

    如果反转一下条件,我们还可以进一步地减少嵌套层级。注意观察下面的条件 2 语句,看看是如何做到这点的:

    /_ 当发现无效条件时尽早返回 _/
    
    function test(fruit, quantity) {
      const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries'];
    
      if (!fruit) throw new Error('No fruit!'); // 条件 1:尽早抛出错误
      if (!redFruits.includes(fruit)) return; // 条件 2:当 fruit 不是红色的时候,直接返回
    
      console.log('red');
    
      // 条件 3:必须是大量存在
      if (quantity > 10) {
        console.log('big quantity');
      }
    }
    

    通过反转条件 2 的条件,现在我们的代码已经没有嵌套了。当我们代码的逻辑链很长,并且希望当某个条件不满足时不再执行之后流程时,这个技巧会很好用。

    然而,并没有任何硬性规则要求你这么做。这取决于你自己,对你而言,这个版本的代码(没有嵌套)是否要比之前那个版本(条件 2 有嵌套)的更好、可读性更强?

    是我的话,我会选择前一个版本(条件 2 有嵌套)。原因在于:

    • 这样的代码比较简短和直白,一个嵌套的 if 使得结构更加清晰。
    • 条件反转会导致更多的思考过程(增加认知负担)。

    因此,始终追求更少的嵌套,更早地返回,但是不要过度。

    使用函数默认参数和解构

    我猜你也许很熟悉以下的代码,在 JavaScript 中我们经常需要检查 null / undefined 并赋予默认值:

    function test(fruit, quantity) {
      if (!fruit) return;
      const q = quantity || 1; // 如果没有提供 quantity,默认为 1
    
      console.log(`We have ${q} ${fruit}!`);
    }
    
    //测试结果
    test('banana'); // We have 1 banana!
    test('apple', 2); // We have 2 apple!
    

    事实上,我们可以通过函数的默认参数来去掉变量 q。

    function test(fruit, quantity = 1) { // 如果没有提供 quantity,默认为 1
      if (!fruit) return;
      console.log(`We have ${quantity} ${fruit}!`);
    }
    
    //测试结果
    test('banana'); // We have 1 banana!
    test('apple', 2); // We have 2 apple!
    

    是不是更加简单、直白了?请注意,所有的函数参数都可以有其默认值。举例来说,我们同样可以为 fruit 赋予一个默认值:function test(fruit = ‘unknown’, quantity = 1)。

    那么如果 fruit 是一个对象(Object)呢?我们还可以使用默认参数吗?

    function test(fruit) { 
      // 如果有值,则打印出来
      if (fruit && fruit.name)  {
        console.log (fruit.name);
      } else {
        console.log('unknown');
      }
    }
    
    //测试结果
    test(undefined); // unknown
    test({ }); // unknown
    test({ name: 'apple', color: 'red' }); // apple
    

    观察上面的例子,当水果名称属性存在时,我们希望将其打印出来,否则打印『unknown』。我们可以通过默认参数和解构赋值的方法来避免写出 fruit && fruit.name 这种条件。

    // 解构 —— 只得到 name 属性
    // 默认参数为空对象 {}
    function test({name} = {}) {
      console.log (name || 'unknown');
    }
    
    //测试结果
    test(undefined); // unknown
    test({ }); // unknown
    test({ name: 'apple', color: 'red' }); // apple
    

    既然我们只需要 fruit 的 name 属性,我们可以使用 {name} 来将其解构出来,之后我们就可以在代码中使用 name 变量来取代 fruit.name

    我们还使用 {} 作为其默认值。如果我们不这么做的话,在执行 test(undefined) 时,你会得到一个错误 Cannot destructure property name of ‘undefined’ or ‘null’.,因为 undefined 上并没有 name 属性。(译者注:这里不太准确,其实因为解构只适用于对象(Object),而不是因为undefined 上并没有 name 属性(空对象上也没有)。参考解构赋值 - MDN)

    如果你不介意使用第三方库的话,有一些方法可以帮助减少空值(null)检查:

    • 使用 Lodash get 函数
    • 使用 Facebook 开源的 idx 库(需搭配 Babeljs)

    这里有一个使用 Lodash 的例子:

    //  使用 lodash 库提供的 _ 方法
    function test(fruit) {
      console.log(_.get(fruit, 'name', 'unknown'); // 获取属性 name 的值,如果没有,设为默认值 unknown
    }
    
    //测试结果
    test(undefined); // unknown
    test({ }); // unknown
    test({ name: 'apple', color: 'red' }); // apple
    

    你可以在这里运行演示代码。另外,如果你偏爱函数式编程(FP),你可以选择使用 Lodash fp——函数式版本的 Lodash(方法名变为 get 或 getOr)。

    相较于 switch,Map / Object 也许是更好的选择

    让我们看下面的例子,我们想要根据颜色打印出各种水果:

    function test(color) {
      // 使用 switch case 来找到对应颜色的水果
      switch (color) {
        case 'red':
          return ['apple', 'strawberry'];
        case 'yellow':
          return ['banana', 'pineapple'];
        case 'purple':
          return ['grape', 'plum'];
        default:
          return [];
      }
    }
    
    //测试结果
    test(null); // []
    test('yellow'); // ['banana', 'pineapple']
    

    上面的代码看上去并没有错,但是就我个人而言,它看上去很冗长。同样的结果可以通过对象字面量来实现,语法也更加简洁:

    // 使用对象字面量来找到对应颜色的水果
      const fruitColor = {
        red: ['apple', 'strawberry'],
        yellow: ['banana', 'pineapple'],
        purple: ['grape', 'plum']
      };
    
    function test(color) {
      return fruitColor[color] || [];
    }
    

    或者,你也可以使用 Map 来实现同样的效果:

    // 使用 Map 来找到对应颜色的水果
      const fruitColor = new Map()
        .set('red', ['apple', 'strawberry'])
        .set('yellow', ['banana', 'pineapple'])
        .set('purple', ['grape', 'plum']);
    
    function test(color) {
      return fruitColor.get(color) || [];
    }
    

    Map 是 ES2015 引入的新的对象类型,允许你存放键值对。

    那是不是说我们应该禁止使用 switch 语句? 别把自己限制住。我自己会在任何可能的时候使用对象字面量,但是这并不是说我就不用 switch,这得视场景而定。

    Todd Motto 有一篇文章深入讨论了 switch 语句和对象字面量,你也许会想看看。
    懒人版:重构语法

    就以上的例子,事实上我们可以通过重构我们的代码,使用 Array.filter 实现同样的效果。

    const fruits = [
        { name: 'apple', color: 'red' }, 
        { name: 'strawberry', color: 'red' }, 
        { name: 'banana', color: 'yellow' }, 
        { name: 'pineapple', color: 'yellow' }, 
        { name: 'grape', color: 'purple' }, 
        { name: 'plum', color: 'purple' }
    ];
    
    function test(color) {
      // 使用 Array filter 来找到对应颜色的水果
    
      return fruits.filter(f => f.color == color);
    }
    

    解决问题的方法永远不只一种。对于这个例子我们展示了四种实现方法。Coding is fun!

    使用 Array.every 和 Array.some 来处理全部/部分满足条件

    JavaScript 数组函数来减少代码行数。观察以下的代码,我们想要检查是否所有的水果都是红色的:

    const fruits = [
        { name: 'apple', color: 'red' },
        { name: 'banana', color: 'yellow' },
        { name: 'grape', color: 'purple' }
      ];
    
    function test() {
      let isAllRed = true;
    
      // 条件:所有的水果都必须是红色
      for (let f of fruits) {
        if (!isAllRed) break;
        isAllRed = (f.color == 'red');
      }
    
      console.log(isAllRed); // false
    }
    

    这段代码也太长了!我们可以通过 Array.every 来缩减代码:

    const fruits = [
        { name: 'apple', color: 'red' },
        { name: 'banana', color: 'yellow' },
        { name: 'grape', color: 'purple' }
      ];
    
    function test() {
      // 条件:(简短形式)所有的水果都必须是红色
      const isAllRed = fruits.every(f => f.color == 'red');
    
      console.log(isAllRed); // false
    }
    

    清晰多了对吧?类似的,如果我们想要检查是否有至少一个水果是红色的,我们可以使用 Array.some 仅用一行代码就实现出来。

    const fruits = [
        { name: 'apple', color: 'red' },
        { name: 'banana', color: 'yellow' },
        { name: 'grape', color: 'purple' }
    ];
    
    function test() {
      // 条件:至少一个水果是红色的
      const isAnyRed = fruits.some(f => f.color == 'red');
    
      console.log(isAnyRed); // true
    }
    
    展开全文
  • 点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文Perhaps the most important thing in ...

    点击上方 "程序员小乐"关注, 星标或置顶一起成长

    每天凌晨00点00分, 第一时间与你相约

    每日英文

    Perhaps the most important thing in life is not where we are now, but which direction we go for. 

    世上最重要的事,不在于我们身在何处,而在于我们朝哪个方向前行。

    每日掏心

    人无所舍,必无所成。心无所依,必无所获。自己的路只有自己去走,自己的心还须自己去度。

    来自:前端之巅 | 作者 | Zander Shirley 译者 | 王强 策划 | 小智 | 责编:乐乐

    程序员小乐(ID:study_tech)第 896 次推文  图源:百度

    往日回顾:真香!红警游戏源代码开源了!!!

         

       正文   

    我一直在寻找提高效率的新方法。而且 JavaScript 总是能给人带来惊喜。

    将 arguments 对象转换为数组

    arguments 对象是函数内部可访问的类似数组的对象,其中包含传递给该函数的参数的值。

    与其他数组不同,这里我们可以访问值并获得长度(length),但是不能在其上使用其他数组方法。

    幸运的是,我们可以将其转换为常规数组:

    var argArray = Array.prototype.slice.call(arguments);

    对数组中的所有值求和 

    我一开始想到的是使用一个循环,但是那样会很浪费。

    var numbers = [3, 5, 7, 2];
    var sum = numbers.reduce((x, y) => x + y);
    console.log(sum); // returns 17

    条件短路 

    我们有以下代码:

    if (hungry) {
        goToFridge();
    }

    我们可以进一步简化代码,同时使用变量和函数:

    hungry && goToFridge()

    对条件使用或(OR)逻辑 

    我以前在函数开始时声明变量,只是为了避免在出现意外错误时遇到 undefined。

    function doSomething(arg1){
        arg1 = arg1 || 32; // if it's not already set, arg1 will have 32 as a default value
    }

    逗号运算符 

    逗号运算符(,)用来计算其每个操作数(从左到右)并返回最后一个操作数的值。

    let x = 1;
    x = (x++, x);
    console.log(x);
    // expected output: 2
    x = (2, 3);
    console.log(x);
    // expected output: 3

    使用 length 调整数组大小 

    你可以调整大小或清空数组。

    var array = [11, 12, 13, 14, 15];
    console.log(array.length); // 5
    array.length = 3;
    console.log(array.length); // 3
    console.log(array); // [11,12,13]
    array.length = 0;
    console.log(array.length); // 0
    console.log(array); // []

    使用数组解构来交换值。 

    解构赋值语法是一种 JavaScript 表达式,可以将数组中的值或对象中的属性解包为不同的变量。

    let a = 1, b = 2
    [a, b] = [b, a]
    console.log(a) // -> 2
    console.log(b) // -> 1

    随机排列数组中的元素

    var list = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    console.log(list.sort(function() {
        return Math.random() - 0.5
    }));
    // [4, 8, 2, 9, 1, 3, 6, 5, 7]

    属性名称可以是动态的 

    你可以在声明对象之前分配一个动态属性。

    const dynamic = 'color';
    var item = {
        brand: 'Ford',
        [dynamic]: 'Blue'
    }
    console.log(item);
    // { brand: "Ford", color: "Blue" }

    过滤唯一值 

    对于所有 ES6 爱好者而言,我们可以使用带有 Spread 运算符的 Set 对象来创建一个仅包含唯一值的新数组。

    const my_array = [1, 2, 2, 3, 3, 4, 5, 5]
    const unique_array = [...new Set(my_array)];
    console.log(unique_array); // [1, 2, 3, 4, 5]

        总结     

    履行好自己的责任比提升效率要重要的多。

    你的网站需要兼容所有浏览器。

    你可以使用 Endtest或其他类似工具来确保兼容性。

    https://endtest.io/

    你还有其他 JavaScript 技巧或窍门要分享吗?欢迎留言!

    欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

    欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。

    猜你还想看

    阿里、腾讯、百度、华为、京东最新面试题汇集

    (六)手把手教你 SpringBoot+SpringCloud --集成 MyBatis

    关于微服务架构入门篇,看了都说好!

    在Redis中设置了过期时间的Key,需要注意哪些问题?

    关注订阅号「程序员小乐」,收看更多精彩内容
    

    嘿,你在看吗

    展开全文
  • 十个JS技巧

    千次阅读 2018-05-16 20:10:23
    1、定时器 setTimeout(function(num){ alert(num); },1000,123);定时器不只有两个值,123是前面函数的回调参数2、拼接字符串 document.body.innerHTML = '&lt;div&gt;div&lt;/div&...
  • js的小技巧

    2019-06-05 11:44:44
    技巧1 console.time()以及console.timeEnd();用来测试从一开始到结束这个js的脚本一共执行了多少毫秒; 使用场景,用于检验脚本的一个性能; 技巧2: let arr = []; let arr2 = [1,2,3,4]; let arr3= [5,6,7...
  • 本文实例讲述了JS中判断null的方法。分享给大家供大家参考,具体如下:以下是不正确的方法:?12345var exp = null;if (exp == null){ alert("is null");}exp 为 undefined 时,也会得到与 null 相同的...
  • JS开发中的一些小技巧和方法

    千次阅读 2019-07-05 10:09:59
    这两年前端很火,JavaScript又是前端的必会技能,在JavaScript开发中其实有一些有意思的小技巧和方法,本文记录了一些作者工作中遇到的一些技巧和方法。全文阅读:JS开发中的一些小技巧和方法 欢迎加入“CSDN前端...
  • javascript清除table表格方法

    万次阅读 2018-08-22 15:27:36
    这篇文章主要介绍了javascript清空table表格的方法,涉及javascript操作table表格的技巧,需要的朋友可以参考下 本文实例讲述了javascript清空table表格的方法。分享给大家供大家参考。具体如下: 1. 通常方法 ...
  • C#使用技巧之调用JS脚本方法一

    千次阅读 2018-08-01 19:47:44
    有时候我们需要在C#中直接调用js方法,这是完全没问题的。当然,我们也可以把js代码转化为C#,然后在C#中执行,但是这个就得花时间了~~下面我给大家介绍下一种直接在C#中调用JS文件的方法。 0、贴
  • birt javascript技巧集锦

    千次阅读 2007-03-20 15:34:00
    现在正在研究BIRT,有一些的javascript的小技巧,在这里整理一下:1.在报表运行时有一个新的sql语句要替换掉报表设计时的sql 在数据集的beforeopen方法中替换: var sql = "select * from tablename where 1=1 and ....
  • js load js

    万次阅读 2012-04-26 11:36:30
    javascript脚本加载 js load block 心细的用户,可以从上面的http瀑布图比较看出:只有等到a.js加载完了,才开始加载b.js,然后再加载图片资源。我们称a.js阻塞b.js。这种现象,称之为js load block。 //...
  • js调试技巧(通过debugger调试)

    万次阅读 2017-11-29 16:11:40
    通常我们在网站开发的过程中会用到很多JavaScript代码,js代码智能提示和检错机制又很差,这时候就需要我们自己来进行调试,调试方法有很多,以前用的是火狐浏览器的调试工具,但是后来版本等等的原因不能用了,现在...
  • 本课程将深入讲解Javascript的各种技术,让学员可以利用Javascript编写出非常复杂的程序。本课程也是React Native、Cocos2d-js、Unity3D、PhoneGap、Web等技术的前导课程。
  • 解决 js 中文乱码问题小技巧

    千次阅读 2017-05-05 23:01:15
    1.在那句引入的js里加入 charset="gbk",如下所示:
  • JavaScript导出txt文件

    千次阅读 2015-09-16 10:03:27
    JavaScript操作技巧
  • JavaScript实用小技巧

    万次阅读 2018-11-11 14:48:43
    JS打开窗口的两种方式 方式一: 使用超链接 &lt;a href="https://www.csdn.net/" title="CSDN"&gt;CSDN&lt;/a&gt; 等效于js代码 window.location.href="...
  • JavaScript返回到上一页的三种方法

    万次阅读 2018-09-11 13:59:58
    window.history.go(-1); //返回上一页 window.history.back(); //返回上一页 window.location.go(-1); //刷新上一页 window.history.back();...//如果要强行刷新的话就是:window.histo...
  • 程序员轻松应对前端分享课第一季

    千人学习 2020-01-30 16:38:49
    介绍了很多前端组件和js封装方法,帮助程序员了解什么样的业务使用什么样的前端组件,做到应对自如,没有的控件自己封装,原有的控件也能封装的更好用,更智能,自动化。
  • js文件压缩原因和压缩原理

    万次阅读 2014-05-05 10:46:52
    Javascript 压缩器是一个在线压缩和混淆 Javascript 代码的开发辅助工具,能够帮助开发人员减小 JS 文件大小、避免网站上的 Javascript 源代码被他人窥视和窃取。 压缩:删除 Javascript 代码中所有注释、跳格...
1 2 3 4 5 ... 20
收藏数 134,521
精华内容 53,808
关键字:

js技巧