【js】ES6进阶学习

JS进阶学习之ES5-ES6 ES5补充拓展 20200429 ECMA介绍 ECMA (欧洲计算机制造商协会) 这个组织的目标是评估、开发和认可计算机标准 ECMA 发布 262 号标准文件(ECMA-262),规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript ECMAScript5简介 ECMAScript5, 就是ECMAScript的第五代标准, 也加ES5, 或者叫ESMAScrip... 阅读详情

1.Symbol

Symbol是ES6引入的,继undefind,null,String,Number,Boolean,Object之后的第七种原始数据类型。Symbol变量通过Symbol函数生成,可以传入一个字符串用于描述(主要是方便在控制台打印和遍历识别)symbol.Symbol表示独一无二的值。

//由于 Symbol 表示独一无二的值,则使用Symbol()生成的值不存在和别的值相等
const s1 = Symbol('s1');
const s2 = Symbol('s2');
console.log('s1:',s1);
console.log('s2:',s2);
console.log('s1 === s2', s1 === s2);//false

1.Symbol作为属性存在

Symbol独一无二的特性很适合将其用作标识符,比如作为对象的属性名存在。 

const sy = Symbol();

let a = {};
a[sy] = '你好';
a['name'] = '名称';

// let a = {
//     // []代表用sy这个变量作为key值,否则key值为字符串
//     [sy]: '你好'
// };

// let a = {};
// Object.defineProperty(a, sy, { value: '你好defineProperty'} );

console.log('a:',a);

// 通过Object.getOwnPropertySymbols方法来遍历Symbol,且只可以遍历出其中的Symbol
const arr = Object.getOwnPropertySymbols(a);
console.log('symbol arr:', arr);

 tips:

Symbol只可以通过Object.getOwnPropertySymbols()方法遍历出来,且只可以遍历出其中的Symbol.

for...in,for...of,Object.keys(),Object.getOwnPropertyNames(),JSON.stringify()等方法均不可以用于获取到Symbol.其实这点已经表示了Symbol不会在日常开发中被常用

2.Symbol.for

当希望使用同一个Symbol值的时候,可以使用Symbol.for(str) 方法查找到已全局注册的Symbol值进行使用.

当Symbol.for(str)查找不到时则新建str标识的Symbol并全局注册,否则返回str标识的Symbol.

// 没有时则新建
// const s1 = Symbol.for('foo');

// // 查找到之前新建的(s1用for时则表示已在全局注册,s2通过字符串描述查找到上s1)
// const s2 = Symbol.for('foo');

// console.log('s1',s1);
// console.log('s2',s2);
// console.log('s1 === s2', s1 === s2);// true

// 新建symbol,但未在全局注册,下面s2查找不到则新建了symbol
const s1 = Symbol('你好');

const s2 = Symbol.for('你好');
console.log('s1 === s2', s1 === s2);// false

总结起来就是Symbol.for(str)可以生成Symbol,并依赖str标识进行查找. 

tips:ES6提供了11个内置的Symbol值,指向语言内部使用的方法。例如Symbol.iterator。

3.Symbol日常开发中的一些用途

当Symbol表示独一无二的值时,就意味着它并不接地气。我们通常会对它的获取,使用场景,及用途感到疑问。

用于消除魔术字符串

const shapeOption = {
// 不需要关心value值
    triangle: Symbol(),
    rectangle: Symbol()
;

function getArea(shape, options){
    let area = 0;

     switch(shape){
     // 直接使用字符串会和代码形成强耦合,不利于维护
     case shapeOption.triangle:
             area = .5 * options.width * options.height;
             break;
     }
     return area;
}

   getArea(shapeOption.triangle, { width: 100, height: 100 });

 用于实现私有属性

 但依然可以获取,通过Object.getOwnPropertySymbols()方法。前端的私有属性属实难以界定。

var Person = (function(){
     var nameSy = Symbol('name');

     function Person(name){
          this[nameSy] = name
     }

     Person.prototype.getName = function(){
          return this[nameSy];
     }
            
     return Person;
}());

2.Set和WeakSet

1.Set 

ES6提供新的数据结构Set,类似于数组,成员唯一,无法重复,利用这一特性常用于数组去重。

通过new构造函数生成Set 

let set = new Set();

操作

通过 new Set().size 属性获取set的长度

共有四个操作方法

  • add(value)  添加元素,可链式调用
  • delete(value)  删除元素,返回boolean值
  • has(value)   判断元素是否存在,返回boolean值
  • clear()  清空Set
let s = new Set();
console.log('s.size:', s.size);// 0
s.add(1);
s.add('a').add(1);//add可以链式调用
console.log('变更后s.size:',s.size);// 2
s.delete(1);
console.log('变更后s.size:',s.size);// 1
console.log(s.has(1));
s.clear();
console.log('s.size:',s.size);// 0

遍历

共有四个遍历方法

  • keys()  遍历键名
  • values()  遍历键值
  • entries() 遍历键值对

  • forEach((key,value) => {})

tips:Set 键名同时也是键值,则keys也是values,确实有些鬼畜.  set去重很常见,这里不赘叙

let s = new Set().add(1).add(2);

// 键名遍历
// for(let key of s.keys()){
//     console.log(key);
// }

// 键值遍历
// for(let value of s.values()){
//     console.log(value);
// }

// 键值对遍历
// for(let entry of s.entries()){
//     console.log(entry);//[1,1] 每次打印结果是数组,第一个元素是key,第二个元素是value
// }

s.forEach((key, value) => console.log(key, value));

2.WeakSet

WeakSet与Set,成员也是唯一不重复,它和Set有以下区别

  • WeakSet成员只能是对象
  • WeakSet中的对象是弱引用  
  • WeakSet由于弱引用,不能遍历

 tips:当一个对象无任何引用时,会尽快被垃圾回收机制回收. 弱引用是垃圾回收机制不考虑WeakSet对该对象的引用。所以当一个对象是有弱引用且无其他对象引用该对象时,此时垃圾回收机制依然会尽快回收。

操作

  • add(value)  添加元素
  • delete(value)  删除元素
  • has(value) 判断元素是否存在,返回boolean值
<div>我是一个div</div>
    <script>
        let div = document.querySelector('div');
        // let s = new Set();
        let s = new WeakSet();//弱引用,无需删除,内存自会回收
        s.add(div);
        document.body.removeChild(div);
        // dom对象依然在内存中,因为Set中依然引用此对象
        div = null;
     </script>

3.Map和WeakMap

1.Map

ES6提供Map数据结构,类似于对象,是键值对的集合。键和值可以是任何类型。通过new构造函数来创建。 

操作

通过 new Map().size 属性获取set的长度

共有五个操作方法

  • set(key, value)  设置键值对
  • get(key)  根据键获取对应值
  • delete(key)  删除键值对
  • has(key)   判断键值对是否存在,返回boolean值
  • clear()  清空Map
// 初始化
// let m = new Map();

let m = new Map([['name', 'jack'],['age',18]]);

m.set('name','rose');
m.set('birth','1998');

m.set({},1);
m.set(undefined,1);
m.set(1,1);
m.set('1',1);
m.set(['jack','rose'],1);

console.log(m);
console.log(m.size);

console.log('name:',m.get('name'));
console.log('has age:',m.has('age'));

m.delete('name');
console.log(m);
        
m.clear();
console.log('清空后size:',m.size);

 遍历

共有四个遍历方法

  • keys()  遍历键名
  • values()  遍历键值
  • entries() 遍历键值对

  • forEach((key,value) => {})

tips:和Set遍历方法一致 

let m = new Map([['name', 'jack'],['age',18]]);

m.set('name','rose');
m.set('birth','1998');

m.set({},1);
m.set(undefined,1);
m.set(1,1);
m.set('1',1);
m.set(['jack','rose'],1);

// keys()
// for(let key of m.keys()){
//     console.log(key);
// }

// values()
// for(let value of m.values()){
//     console.log(value);
// }

//entries()
// for(let entry of m.entries()){
//     console.log(entry); //为数组,其中只包含key,value 二个元素
// } 

// forEach
m.forEach((key, value) => {
     console.log(key, value);
});

使用Map实现私有属性

在闭包的基础上使用Map来保存私有字段,但有弊端,使用该类new出来的实例必须全部清除,才不会导致Map占用内存

var Person = (function(){
      var map = new Map();

      function Person(name){
          var privateProperty = {
                name
          };

          // 示例对应私有属性
            map.set(this, privateProperty);
          }

          Person.prototype.getName = function(){
                return map.get(this).name;
          }

        return Person;
}());

2.WeakMap

WeakMap和Map有以下区别

  • WeakMap的键只能是对象
  • WeakMap的键是弱引用
  • WeakMap不能遍历 
  • WeakMap只有四个操作方法:get(),set(),has(),delete()
const map = new WeakMap();
let key = {};
let obj = { foo: 1 };

map.set(key, obj);
// obj置为空时
obj = null;
// 依然能通过key获取到
console.log(map.get(key));

 WeakMap实现私有属性

使用WeakMap解决了需要清除所有实例才能去除内存占用的问题

var Person = (function(){
      var map = new WeakMap();

      function Person(name){
          var privateProperty = {
                name
          };

          // 示例对应私有属性
            map.set(this, privateProperty);
          }

          Person.prototype.getName = function(){
                return map.get(this).name;
          }

        return Person;
}());

4.Proxy

Proxy一词意为 `代理` ,它用于代理对代理对象的一些增删改操作。Proxy在目标对象之前架设一层`拦截`,外界对该Proxy对象的访问,都必须先通过这层拦截,其实就是Proxy提供了一种机制来对外界的访问进行过滤和改写。Proxy并不对原对象进行拦截操作,而是对原对象代理后所生成的Proxy示例来进行拦截操作。

而Object.defineProperty()是拦截对象属性的读取和修改操作。两者不同的地方是:Proxy拦截的是原对象,而Object.defineProperty()拦截的是原对象的属性。

//target: 被代理对象
//handler: 拦截函数(操作)的集合
let proxy = new Proxy(target, handler)

tips:handler为空时则代表不拦截任何操作

let obj = {};
        
// handler为空对象
// let proxy = new Proxy(obj, {});
// // proxy代理需要直接操作proxy对象
// proxy.a = 1;
// proxy.b = 2;

// console.log('obj:', obj);

let proxy = new Proxy(obj, {
    // get拦截
    get(target, key, receiver){
         //get中直接修改返回值
         return target.a + 1;
    }
});

proxy.a = 1;
console.log('proxy:',proxy.a);//35

Proxy可以拦截的13种操作

  • get(target, key, receiver)  拦截对象属性的读取,比如proxy.foo和proxy['foo']
  • set(target, key, value, receiver)  拦截对象属性的设置,比如proxy.foo = v或者proxy['foo'] = v,返回boolean值

  • has(target, propKey)  拦截 propKey in proxy的操作,返回boolean值

  • deleteProperty(target, propKey)  拦截 delete proxy[propKey]的操作,返回boolean值

  • ownKeys(target)  拦截Object.getOwnPropertyNames(proxy),Object.getOwnPropertySymbols(proxy),Object.keys(proxy),for...in,返回一个数组,该方法返回目标对象所有自身属性的属性名,而Object.keys()的返回结果仅包括墓表对象自身的可遍历属性.

  • getOwnPropertyDescriptor(target, propKey)  拦截Object.getOwnPropertyDescriptor(proxy,propKey),返回属性的描述对象

  • defineProperty(target, propKey, propDesc)  拦截Object.defineProperty(proxy,propKey,propDesc),Object.defineProperties(proxy,propDesc),返回boolean值

  • getPrototypeOf(target)  拦截Object.getPrototypeOf(proxy),返回对象

  • setPrototypeOf(target, proto)  拦截Object.setPrototypeOf(proxy, proto) ,返回boolean值

  • apply(target, object, args)  拦截Proxy实例作为函数调用的操作,比如proxy(...args),proxy.call(object,...args),proxy.apply(...).

  • construct(target, args)  拦截Proxy实例作为构造函数调用的操作,比如new proxy(...args).

  • isExtensible(target)  拦截Object.isExtensible(proxy),返回boolean值

  • preventExtensions(target)  拦截Object.preventExtensions(proxy),返回boolean值 

Proxy给了开发者拦截语言默认行为的权限,可以不改变原有对象或函数的情况下,轻松运用在很多场景。例如:统计函数调用次数,实现响应式数据观测(Vue3.0),实现不可变数据(Immutable)等等.

let obj = {};
        let func = function(){

        }

        let proxy = new Proxy(obj, {
            get(target, key, receiver){
                console.log(`get拦截 ${key}`);
            },
            set(target, key, value, receiver){
                console.log(`set拦截 ${key}`);
            },
            has(target, propKey){
                console.log(`has拦截`);
            },
            deleteProperty(target, propKey){
                console.log(`deleteProperty拦截`);
            },
            ownKeys(target){
                console.log('ownKeys拦截');
            },
            getOwnPropertyDescriptor(target, propKey){
                console.log('getOwnPropertyDescriptor拦截');
            },
            defineProperty(target, propKey, propDesc){
                console.log('defineProperty拦截');
            },
            getPrototypeOf(target){
                console.log('target拦截');
            },
            setPrototypeOf(target, proto){
                console.log('setPrototypeOf拦截');
            },
            apply(target, object, args){
                console.log('apply拦截');
            },
            construct(target, args){
                console.log('construct拦截');
            },
            isExtensible(target){
                console.log('isExtensible拦截');
            },
            preventExtensions(target){
                console.log('preventExtensions拦截');
            }

        });

tips:面试常问,Proxy和Object.defineProperty()有什么区别及优势?

5.Reflect

反射机制指的是程序在运行时能够获取自身的信息

 ES6提供了Reflect,把原先版本中很多语言层面的API,比如Object.defineProperty(), delete in

等几种放在Reflect的静态方法上。

将Object对象的一些明显属于语言内部的方法(如Object.defineProperty()),放到Reflect对象上。现阶段,某些对象上同时在Object和Reflect对象上部署,未来的新方法则只在Reflect对象上,也就是说,从Reflect对象上可以拿到语言内部的方法。

Reflect较之前方法使用的一些好处:

  • 修改某些Object方法的返回结果,让其更合理
    let target = {};
            let property = 'a';
    
            Object.defineProperty(target, property, {
                configurable: false,
                value: 1
            });
            
            // 旧写法
            // try {
            //     Object.defineProperty(target, property, {
            //         configurable: true
            //     });
            // } catch (error) {
            //     console.log('异常:', error);
            // }
    
            // 新写法
            Reflect.defineProperty(target, property,{ configurable: true }) ? '' : console.log('reflect失败');

  • 将命令式操作转变为函数调用,避免更多保留字占用
    // 老写法
    'assign' in Object
    
    // 新写法
    Reflect.has(Object, 'assign');

  • Reflect对象的方法与Proxy对象的方法一一对应,想要调用默认行为,直接在Reflect上调用方法,省去人工写默认行为的代码

 tips:关于Reflect的背景,使用场景,用途查了一些资料,但是和我上述这段描述相差无几。找不到更多的资料去描述,以下提供一些用于参考:

JS的Reflect学习和应用 - 知乎

JS 反射机制及 Reflect 详解 - Leophen - 博客园

Reflect - JavaScript | MDN

JS 中的 Reflect 和 Proxy - 掘金

6.Iterator

Iterator(迭代器)是一个对象. Iterator对象需要包含一个next方法,该方法返回一个包含两个属性(value表示当前结果,done表示是否继续迭代)的对象. ES6规定:如果数据结构的`Symbol.iterator`是一个返回iterator的对象的方法,是认为该数据结构是`可遍历的`.

tips:ES6提供的11个内置Symbol值,指向语言内部使用的方法. Symbol.iterator是其中之一,对象的Symbol.iterator属性,指向该对象的默认生成遍历器的方法

let it = makeIterator();

// 返回遍历器对象
function makeIterator(){
    var nextIndex = 0;
    return {
        // 闭包
        next: function (){
              return nextIndex < 5 ? 
              { value: nextIndex++, done: false } : { value: undefined, done: true };
              }
       };
}
        
        
let obj = {
    [Symbol.iterator]: makeIterator
};

// for...of循环
// for(let value of obj){
//   console.log('value:',value);
// }

ES6中以下场景默认调用Iterator接口(Symbol.iterator方法)

  • for...of循环
  • 数组解构
  • 扩展运算符
  • yield*
    let arr = [];
    arr[Symbol.iterator] = makeIterator;
    // yield
    function* f(){
         // 相当于把arr展开
         yield* arr
    }
    for(let value of f()){
         console.log(value);
    }
  • 其他隐式调用,如new Set([a, b]),Promise.all()等

ES6以下数据结构默认为可遍历对象,即默认部署了Symbol.iterator方法

  • Array
  • Map
  • Set
  • String
  • 函数的arguments对象
    function f1(){
       console.log('arguments:',arguments[Symbol.iterator]);
    }
    f1()
  • NodeList对象
    // divs  NodeList对象
    let divs = document.querySelectorAll('div');
    console.log(divs[Symbol.iterator]);

7.Generator 

8.async await  

async函数是Generator函数的语法糖

1.async

执行async函数相当于执行了一个自动运行的Generator函数,async函数的结果返回如果不是promise,会将其包装为一个promise返回

// 单独 async
// async function f(){
//     // 控制台执f()会发现返回一个包裹undefined的Promise
//     console.log(1);
// }
        
// f()返回Promise对象,后面可以接then()
// f().then(() => {
//     console.log(2);
// });

async function f(){
      console.log(1);
      return 'done';
      // 相当于返回Promise.resolve('done');
}

2.await

async函数中使用await关键字。await关键字后面一般会跟一个Promise实例,async函数执行过程中,每次遇到await关键字,会将控制权转回外部环境。 

  1. 如果await后面是Promise实例,则会等到该Promise实例被resolve后,才会把本次await到下次await之间的代码推到MircoTask(微任务)中等候执行,且await的返回值是该Promise实例resolve的值
  2. 如果await后面不是Promise实例,则会立即将本次await到下次await之间的代码推到mircoTask(微任务)中等候执行,且await的返回值就是await后面表达式的值
// await Promise实例
// async function f(){
//     let data = await new Promise((resolve, reject) => {
//         setTimeout(() => {
//             resolve('a');
//         }, 2000);
//     });
//     console.log(data);
// }

//await 非Promise实例
async function f(){
      let data = await 'a';
       console.log(data);
}

f();
console.log('end');

 

3.async函数的错误处理

若Promise被reject或抛出异常,await之后的代码不会被执行,那么就通过try...catch对await进行异常捕获

// 未捕获异常
        // async function f(){
        //     let data = await new Promise((resolve, reject) => {
        //         setTimeout(() => {
        //             reject('123');
        //         }, 2000);
        //     });

        //     // reject后,后续代码无法执行
        //     console.log('done');
        // }

        // 捕获异常
        async function f(){
            try {
                let data = await new Promise((resolve, reject) => {
                    // setTimeout(() => {
                    //     reject('123');
                    // }, 2000);
                    throw new Error('1234');
                });

                // reject后,后续代码无法执行
                console.log('done');
            } catch (error) {
                console.log('异常:', error);
            }
        }

tips:实际上,try...catch并不能完美处理async函数的异常抛出,那么如何优雅的处理async函数的异常抛出呢?

4.async函数处理并发异步任务

 因为async函数中的每一个await都是等到前面await resolve后才会执行,如果想并发执行,可以使用Promise.all.但此情况仅限于多个异步任务之间无数据关联

        // 不并发的情况
        // async function f(){
        //     let time1 = new Date();
        //     let data1 = await new Promise((resolve, reject) => {
        //         setTimeout(() => {
        //             resolve('123')
        //         }, 2000);
        //     });
        //     let data2 = await new Promise((resolve, reject) => {
        //         setTimeout(() => {
        //             resolve('1234')
        //         }, 3000);
        //     });
        //     // 123 1234 用时:5002  该用时处理无法接受
        //     console.log(data1, data2, '用时:' + (new Date() - time1));
        // }

        // 并发处理异步  Promise.all  但该情况限于两个异步任务无数据关联的情况下使用
        async function f(){
            let time1 = new Date();
            let [data1, data2] = await Promise.all([
                new Promise((resolve, reject) => {
                    setTimeout(() => {
                        resolve('123')
                    }, 2000);
                }),
                new Promise((resolve, reject) => {
                    setTimeout(() => {
                        resolve('1234')
                    }, 3000)
                })    
            ]);

            // 123 1234 用时:3000
            console.log(data1, data2, '用时:' + (new Date() - time1));
        }

 tips:当多个异步任务之间有数据关联时,如何处理?

Javascript Symbol原理及使用方法解析 Symbol是ES6中新引入的一种基本数据类型,在此之前JavaScript中已有几种基本数据类型: Numberg String Boolean Null Undefined Object 不同于其他基本类型的通俗易懂,Symbol 是什么和有什么用一直有些让人困惑。 什么是Symbol JavaScript标准中规定对象的key只能是 String 或 Symbol 类型,区别在于 String 类型的key可以重复而 Symbol 类型的key是唯一的。Symbol 的本质是表示一个唯一标识。每次创建一个Symbol,它所代表的值都不可能重复,该值的内部实现可以 立即下载

相关推荐

湿敏电阻HR202的两种驱动方案实测:IO充放电法 vs. 交流方波ADC法,哪个更适合你?

本文深入评测湿敏电阻HR202的两种驱动方案:IO充放电法和交流方波ADC法。通过原理图分析、精度实测和资源占用对比,揭示交流方波ADC法在精度和稳定性上的优势,特别适合长期监测场景。同时提供IO充放电法在资源受限情况下的应用建议,帮助工程师根据项目需求做出最优选择。

weixin_30421809的博客 467

JavaScript Set

ES6 提供了 新的数据结构 Set。Set 类似于数组,但成员的值都是唯一的,没有重复的值。 Set 的应用有很多。比如,在 H5 页面的搜索功能里,用户可能会多次搜索重复的关键字;但是在数据存储上,不需要存储重复的关键字。此时,我们就可以用 Set 来存储用户的搜索记录,Set 内部会自动判断值是否重复,如果重复,则不会进行存储,十分方便。 生成 Set 数据结构 Set 本身就是一个构造函数,可通过 new Set() 生成一个 Set 的实例。 举例 1: const set1 = new Set(

ximingx 2496

无人机蜂群作战设计技术详解

构建防御网络,拦截敌方无人机或导弹;无人机蜂群作战设计技术是一种创新的军事应用概念,它基于生物仿生学原理,通过先进的通信技术、自主导航与决策算法,将大量小型、低成本、功能各异的无人机组织成一个高度协同的群体,以执行复杂多样的军事任务。无人机蜂群作战的概念源于自然界中蜜蜂、蚂蚁等生物群体的行为模式,这些生物群体通过简单的个体间的信息交互和分工协作,能够完成远远超出单一个体能力的复杂任务。其中,无人机群体是执行任务的主体,指挥控制系统负责任务分配和决策,通信数据链则保障无人机群体与指挥控制系统之间的信息交换。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 2217

关于JavaScript中Set的操作和应用

Set的基本操作 创建Set 添加元素 删除元素 判断元素是否存在 获取Set的长度 清空Set Set的遍历 for...of循环 forEach方法 转换成数组后遍历 使用Set的entries方法遍历 Set的应用 数组去重 判断两个数组是否有重复元素 实现并集、交集和差集

小墨蛇的博客 1174

UCD9081EVM电源时序管理:硬件配置与GUI操作全解析

电源时序管理是复杂电子系统设计的核心环节,它通过精确控制多路电源的上电/下电顺序,确保核心芯片免受浪涌电流或电压倒灌的损害。其原理基于状态机逻辑与电压监控,技术价值在于将硬连线时序转化为可编程配置,极大提升了系统可靠性与设计灵活性。在服务器、通信设备、工控系统等高可靠性应用场景中,时序控制器是实现稳定启动与故障保护的关键。本文以德州仪器UCD9081评估模块为例,深入剖析其硬件跳线配置与图形用户界面操作,涵盖I2C地址设置、电压监控分压计算、时序条件与故障响应策略等工程实践要点,帮助工程师快速掌握这一电源时

weixin_42696271的博客 303

手把手教你用CODESYS将旧笔记本改造成软PLC(含证书配置避坑指南)

本文提供了一份详尽的指南,教你如何利用CODESYS平台将闲置旧笔记本改造为一台功能完整的软PLC。内容涵盖从硬件评估、系统实时性优化、软件安装与驱动配置,到关键的证书授权管理避坑指南,旨在帮助自动化工程师和爱好者低成本搭建稳定可靠的学习与开发平台。

weixin_29190573的博客 280

Js-ES6-Set和Map

0- 零 - 前言 一 数组和对象对比 数组的优点 1、有顺序 2、紧密型 3、有关联 缺点 1、速度慢,查询,添加,删除 2、有重复 3、判断值时,必须遍历数组 对象的优点 1、有键值对,查询快,插入和删除也很快 2、键唯一 3、多重集合 缺点 1、没有关联 2、按照添加顺序遍历(顺序无法改变) 3、 如果需要查询属性时,需要遍历 Ⅰ- 壹 - Set set列表,插入、添加、删除速度快,无重复,只要值得列表(不能有键), 没有索引, 不能使用for循环,也不能用下标直接修改或者获取。 没有重

三季雨 534

树莓派+STM32+激光雷达:大学生工训赛智能物流小车全栈开发实录(附避坑指南)

本文详细记录了基于树莓派、STM32和激光雷达的智能物流小车全栈开发过程。文章从系统架构设计、硬件集成、软件框架搭建到机械臂控制与视觉辅助定位,系统阐述了如何构建一个完整的机器人系统,并分享了在电源管理、通信延迟、里程计误差等关键环节的实战避坑指南,为嵌入式与机器人开发提供了宝贵经验。

kotlin6android的博客 748

JS ES6新增Set类型的基本用法

首先,我们要知道Set类型是什么呢?可以理解为是一个值永不重复的数组。 let set = new Set(["name", "Joker"]); console.log(set.size); //2 通过.size的方式获取到Set的长度,这里就跟数组的length属性比较相似。 console.log(set.has("Joker")); //true 判断Set中是否含有Joker这个字符串。 console.log(set.delete("Joker")); //true 用于删除Set

LttleJoker的博客 1621

大模型选型实战:为OpenClaw匹配最优“大脑”的全维度考量

大模型不是越贵越好,也不是参数越高越好,适合自己的使用场景才是最好的。按照我的方法,先明确自己的需求,再选对应的模型,配置多模型自动路由,既能保证体验,又能最大限度降低成本。我自己用这套配置用了半年多,不管是写文章、写代码还是处理复杂问题,都完全够用,成本也很低,大家可以参考一下。如果不知道选什么模型,可以在评论区说一下你的使用场景。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 343

工业级4~20mA转0~3V信号调理电路原理图设计,已量产(电流传感器)

在工业现场,4~20mA 电流信号是模拟量传输的 “老熟人”—— 抗干扰强、能跑长距离,但嵌入式 MCU 的 ADC 一般只认电压信号。最近做项目时,我设计了一款能覆盖 0~25mA(含超量程冗余)、线性输出 0~3V 的调理电路,经过现场调试挺稳定,分享下细节。

不脱发的程序猿 528

学习笔记 JavaScript ES6 Set

学习内容: 常用方法 遍历 应用场景 WeakSet

白鸽同学的博客 2080

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 605

ES6+新特性完整解析:awesome-javascript-learning进阶学习路径

想要掌握现代JavaScript开发的核心技能?ES6+新特性是每个开发者必须攻克的难关!😊 awesome-javascript-learning项目为你精选了最优质的JavaScript学习资源,助你从基础迈向高级开发之路。 ## 为什么ES6+如此重要? ES6(ECMAScript 2015)是JavaScript语言发展史上的里程碑,引入了众多革命性的新特性。这些特性不仅让代码更简

gitblog_00520的博客 1040

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

前端进阶学习——js高级之es6

ES6 1.ES6 介绍 ECMAScript 6,简称ES6 ,目标是使JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 ES6与javascript的关系:ECMAScript是一种语言标准,Javascript实现了这个标准。 ES6 与 ECMAScript2015的关系 ECMAScript2015 是具体到2015年6月发布的那一版。 ES6有两层含义 特指ECMAScript2015 泛指ES2015及之后的新增特性,虽然之后的版本应当称为ES2018,ES2

jyn15159的博客 1303

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

前端学习路线【本科还在迷茫的宝子们抓紧收藏起来跟着学习吧】

通过以上学习路径,你将逐步成为一名熟练的前端开发者。记得在实际项目中不断实践,参与开源项目,保持对新技术的敏感性,前端领域的知识更新速度快,持续学习是成为优秀前端工程师的关键。祝你前端路上顺利!

qq_62660798的博客 1114

前端学习者应该知道的前端学习方向

大家好 我叫小杨。今天我给大家介绍一下如果你是一个前端学习者,你应该怎么学,学什么! 一、前端基础 1.HTML、2.CSS、3.JavaScript(DOM、BOM) 什么是HTML? HTML就是一个网站的骨架 什么是CSS? CSS就像是人穿的衣服,你使用CSS就像再给HTML穿衣服,这样才能让我们网页更加好看 什么是JavaScript? JavaScript就像是人在运动,如果我们的网页你使用了JavaScript的话,你的网页就能让和用户体验更加的舒服 首先你得有一个好的基础才

m0_59553217的博客 1645

前端Web开发学习,入门到进阶,推荐几本很不错的书籍

大脑渴望新奇,它不断寻找、扫描和等待不同寻常的东西。它天生如此,助你永葆活力。横向发展的同时,纵向发展也很重要。

upgrade_bro的博客 2010

JavaScript语言的学习路线

学习JavaScript的过程是一个不断探索和积累的过程,从基础到高阶技术,你需要不断实践和更新知识。在这个过程中,不要害怕犯错,通过解决问题来不断提高自己的技术水平。同时,参与开源项目、加入技术社区也是学习的重要途径。希望这条JavaScript学习路线能帮助你更好地掌握这门语言,开启你的开发之旅!

2501_90770591的博客 701

【ES6】进阶语法-----知识脑图

一些ES6进阶知识,供学习总结使用

Primary_Insist的博客 398

javascript进阶面向对象ES6(ECMAScript 6.0) 学习笔记

Day01 1、面向对象编程介绍 1.1 两大编程思想 面向过程 面向对象 1.2 面向过程编程 POP 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 面向过程,就是按照我们分析好了的步骤,按照步骤解决问题。 1.3 面向对象编程 OOP 面向对象是把事务分解成为一个个对象,然后由对象之间分工与合作; 面向对象是以对象功能来划分问题,而不是步骤。 在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工。 面向对象编程具有灵活、代码

qq_45192089的博客 595

从入门到进阶:JavaScript 学习之路与实战技巧

JavaScript 看似简单,实则博大精深。从基础语法到异步编程,从 ES6+ 特性到实战技巧,每一步学习都需要结合实践巩固。不要害怕踩坑,多写代码、多阅读优秀开源项目(如 Vue、React 源码),才能真正掌握这门语言的精髓。愿你在 JS 的世界里不断探索,写出优雅高效的代码!

imlsp12356的博客 851

《黑马程序员2023前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程》学习笔记总目录

本文是对《黑马程序员2023前端JavaScript入门到精通全套视频教程,javascript核心进阶ES6语法、API、js高级等基础知识和实战教程》所有知识点的笔记进行总结分类。 学习时总结的目录笔记以及思维导图和实训,将在后续更新。

放下华子我只抽RuiKe5的博客 802

ES7、ES8、ES9、ES10、ES11、ES12都增加了哪些新特性?

大厂技术高级前端Node进阶点击上方程序员成长指北,关注公众号回复1,加入高级Node交流群作者:南殇原文:https://juejin.cn/post/7243677232827891773ES7ES2016(ES7)中新增了如下特性????Array.prototype.includesExponentiation Operator一、Array.prototype.includes1.1...

程序员成长指北 143

JavaScript进阶学习笔记(七)--- ES6相关

一、ES6的概念 ​ ES 的全称是 ECMAScript ,6 是指 版本 ,是由 ECMA 国际标准化组织制定的一项脚本语言的标准化规范。ES6 的出现修改了 JavaScript 一些不足之处,使其更加完善。 二、ES6新增语法 1、let ​ ES6 中新增了 let 关键字用来声明变量。用 let 关键字声明的变量和用 var 声明的变量具有很大的不同,有了很多独特的特性。 ① let 声明的变量具有块级作用域 ​ let声明的变量,只在所处的块级作用域有效,一对大括号之间就是一个块级作用

weixin_45092437的博客 600
上一篇: 【vue】配置cdn加速
下一篇: vxe-table使用碰到的问题
谭CV
博客等级 码龄9年 73粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值