es6 学习笔记-1

news2024/11/15 18:02:47

学习视频:尚硅谷Web前端ES6教程,涵盖ES6-ES11_哔哩哔哩_bilibili

一、介绍 

ES:全称为EcmaScript,是脚本语言的规范

ECMAScript: 由Ecma国际通过ECMA-262标准化的脚本程序设计语言。

es6兼容性:ECMAScript 6 compatibility table

二、ES6 - 声明变量

(一)let 

1.不能重复声明;(var可以重复声明)

2.块级作用域;

3.不存在变量提升;(变量提升解释:代码执行之前收集变量名称,最初为undefined)

        console.log(abc);  var abc = 'aaa';  ==》 输出undefined

        console.log(abc);  let abc = 'aaa';  ==》 报错

4.不影响作用域链;

举例:

<script>
			let items = document.getElementsByClassName('item');
			for (var i = 0; i < items.length; i++) {
				items[i].onclick = function() {
					this.style.background = 'pink'; //必须用this,因为i此时为3,
                                                    //items[i]会报错
				}
				
			}
</script>
<script>
			let items = document.getElementsByClassName('item');
			for (let i = 0; i < items.length; i++) {
				items[i].onclick = function() {
					items[i].style.background = 'pink'; //可以用items[i]或this
				}
				
			}
</script>

(二) const 声明常量

1. 一定要赋初始值

 2.一般常量使用大写

3.常量的值不能修改


			const SCHOOL = '测试';
			SCHOOL = 'ABC';
//报错:Uncaught SyntaxError: Missing initializer in const declaration

4.块儿级作用域

{
	const SCHOOL1 = '测试';
}
console.log(SCHOOL1);
//报错:Uncaught ReferenceError: SCHOOL1 is not defined at 2-const.html:23

5.对于数组和对象的元素修改,不算做对常量的修改,不会报错

const TEAM = ['ABC','MING','ADF'];
TEAM.push('AD'); //地址不变,所以不报错
TEAM = 100; //会报错

三、ES6 - 变量的解构赋值

允许按照一定模式从数组和对象中提取值,对变量进行赋值,被称为解构赋值。

<script>
			//1.数组的解构
            const F4 = ["言承旭","周渝民","没组","西门"];
            let [yan,zhou,mei,xi] = F4;
            console.log(mei,zhou,yan,xi);
            //2.对象的解构
            const zhao={
                name:'赵本山',
                age:55,
                xiaopin:function(){
                    console.log("我可以演小品");
                }
            };
            let {name,age,xiaopin}=zhao;
            console.log(age,name,xiaopin);
            xiaopin();

		</script>

四、ES6 - 模板字符串

<script>
			//ES6引入新的声明字符串的方式[``] '' ""
            //1.声明
            let str = '我也是一个字符串';
            console.log(str, typeof str); //输出:我也是一个字符串 string
            //2.内容中可以直接出现换行符
            str = `<ul>
                <li>aa</li>
                <li>bb</li>
                </ul>`;
            //3.变量拼接
            let lovest = '天才樱木';
            let out = `${lovest}不是傻瓜`;
            console.log(out);  //输出:天才樱木不是傻瓜
		</script>

五、ES6 - 对象的简化写法

ES6允许在大括号里,直接写入变量和函数,作为对象的属性和方法。

<script>
			//ES6允许在大括号里,直接写入变量和函数,作为对象的属性和方法。
            let name = '加油';
            let change = function(){
                console.log('我们可以改变');
            }
            const school1 = {  // 完整写法
                name:name,
                change:change,
                inporove: function(){
                    console.log('我们要努力学习');
                }
            };
            const school = {  //简略写法,只写变量
                name,
                change,
                improve(){
                    console.log('我们要努力学习');
                }
            };
            console.log(school); //输出:{name: '加油', change: ƒ, improve: ƒ}
		</script>

输出:

六、ES6 - 箭头函数以及声明特点

(一)、允许使用箭头 (=>) 定义函数

	<script>
			//允许使用箭头 (=>) 定义函数
            //声明函数
            let fn = function(){ //旧写法
                
            }
            let fn1 = (a,b)=>{
                return a+b;
            }
            //调用函数
            let result = fn1(1,2);
            console.log(result);
            //1.this是静态的,this始终指向函数声明时所在作用域下的this的值
            function getName(){
                console.log(this.name);
            }
            let getName2 = () => {
                console.log(this.name);
            }
            //设置window的name属性
            window.name='test';
            const school = {
                name:"TEST"
            }
            //直接调用
            getName(); //out:test //this指向window
            getName2(); //out:test //this指向window

            //call方法调用
            getName.call(school); //TEST
            getName2.call(school); //test

            //2.不能作为构造函数实例化对象
            // let Person = (name, age) => {
            //     this.name = name;
            //     this.age = age;
            // }
            // let me = new Person('xiao',30);
            // console.log(me); //error : Uncaught TypeError: Person is not a constructor
	
            //3.不能使用arguments变量
            // let fn2 = ()=>{
            //     console.log(arguments); //error:Uncaught ReferenceError: arguments is not defined
            // }
            // fn2(1,2);

            //4.箭头函数的简写
            //  a.省略小括号:当形参有且只有一个
            // let add1 = (n) => {
            //     return n+n;
            // }
            let add = n => {
                return n+n;
            }
            console.log(add(9));
            //  b.省略花括号:当代码体只有一条语句: return必须省略
            // 而且语句的执行结果时函数的返回值
            // let pow = (n) => {
            //     return n*n;
            // }
            let pow = n => n*n;
            console.log(pow(8));
    </script>

call方法扩展说明:call() 方法是预定义的 JavaScript 方法,它可以用来调用所有者对象作为参数的方法。通过 call(),您能够使用属于另一个对象的方法。

var person = {
    fullName: function() {
        return this.firstName + " " + this.lastName;
    }
}
var person1 = {
    firstName:"Bill",
    lastName: "Gates",
}
var person2 = {
    firstName:"Steve",
    lastName: "Jobs",
}
person.fullName.call(person1);  // 将返回 "Bill Gates"

call() 方法可接受参数:

var person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + "," + city + "," + country;
  }
}
var person1 = {
  firstName:"Bill",
  lastName: "Gates"
}
person.fullName.call(person1, "Seattle", "USA"); //out:Bill Gates,Seatle,USA

arguments扩展说明:arguments 是一个对应于传递给函数的参数的类数组对象。arguments 实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。

arguments展示形式是一个伪数组:具有 length 属性,按索引方式储存数据,不具有数组的 push , pop 等方法。

函数参数(argument)指的是传递到函数或由函数接收到的真实

如果调用参数时省略了参数(少于被声明的数量),则丢失的值被设置为:undefined

function sumAll() {
  var i;
  var sum = 0;
  for(i = 0; i < arguments.length; i++) {
    sum += arguments[i];
  }
  return sum;
}
console.log(sumAll(1,2,4)); // out:7

(二)、箭头函数举例

1. 点击div 2s后变色

<script>
			//需求:1-点击div 2s 后颜色变了
            let ad = document.getElementById('ad');
            //绑定事件
            ad.addEventListener("click", function(){
                // a.this报错 
                // setTimeout(function(){
                //     console.log(this); //out: window
                //     this.style.background = 'pink'; //error:Uncaught TypeError: Cannot set properties of undefined (setting 'background')
                // },2000);

                // b.老的正确写法: 保存this的值
                // let _this = this;
                // setTimeout(function(){
                //     console.log(this); 
                //     _this.style.background = 'pink'; 
                // },2000);

                //c. 箭头函数写法:this是静态的,指向声明的函数的作用域的值
                setTimeout(()=>{
                    this.style.background = 'pink';
                },2000);
                
            })
        </script>

2. 从数组中返回偶数元素

// 2.需求-2 从数组中返回偶数的元素
            const arr = [1,6,9,10,100,25];
            //a. 老方法
            const result = arr.filter(function(item){
                if(item % 2 === 0) {
                    return true;
                }else {
                    return false;
                }
            });
            console.log(result); //out:(3) [6, 10, 100]
            //b. 箭头函数
            const result1 = arr.filter(item => item % 2 === 0);
            console.log(result1); //out:(3) [6, 10, 100]

总结:箭头函数适合于this无关的回调,如定时器,数组的方法回调

           不适合与this有关的回调,如事件回调,对象的方法

            let a={
                name:'abc',
                getName : function(){  
                    return this.name;  //this 指向本对象
                }
            };
            var name = 'cccc'; //或window.name可以输出 //当let name='xx'时无法输出,为什么?
            let b ={
                name:'abc',
                getName : ()=> {
                    console.log(this); //window
                    return this.name;
                } //指向外层this
            };
            console.log(a.getName()); // out: abc
            console.log(b.getName()); // out: cccc                       

七、ES6 - 函数参数的默认值

es6允许给函数参数赋初始值

        <script>
			//es6允许给函数参数赋初始值
            //1.形参初始值
            //具有默认值的参数,一般位置要靠后
            function add(a,b,c=10) {
                return a+b+c;
            }
            console.log(add(1,2),add(1,2,3)); //out: 13 6
            //2. 与解构赋值结合
            function connect(options) { //传统写法
                let host = options.host;
                let username = options.username;
                console.log(host,username);//out:localhost root
            }
            function connect({host,username,password,port}){ //解构写法
                console.log(host,username,password,port);
            }
            connect({
                host:'localhost',
                username:'root',
                password:'root',
                port:3306
            }) //out:localhost root root 3306

            //解构写法+赋初始值
            function connect1({host='127.0.0.1',username,password,port}){
                console.log(host,username,password,port);//out:localhost root root 3306
            }
            connect1({
                username:'root',
                password:'root',
                port:3306
            }) //out:127.0.0.1 root root 3306
		</script>

八、ES6 - rest参数

        <script>
			//es6 引入 rest参数,用于获取函数的实参,用来代替arguments
            //es5 获取实参的方式
            function date(){
                console.log(arguments);
            }
            date('abc','23','adf'); //out:Arguments(3)对象 0: "abc" 1: "23" 2: "adf"
            //es6 rest参数
            function date1(...args){
               console.log(args);     
            }
            date1('abc','23','adf'); //out: (3) ['abc', '23', 'adf'] //是数组
            //rest参数必须放到参数最后
            function fn(a,b,...args){
                console.log(a,b,args);
            }
            fn(1,2,3,4,5); //out:1 2 (3) [3, 4, 5] //3,4,5属于一个数组,给了args
        </script>

九、ES6 - 扩展运算符

(一)、扩展运算符介绍

      <script>
		// ... 扩展运算符能将 数组 转换为逗号分隔的 参数序列
        //声明一个数组
        const boys = ['ab','cd','ef']; //=>'ab','cd','ef'
        //声明一个函数
        function chunwan(){
            console.log(arguments);
        }
        chunwan(boys); //out:Arguments(1) // 0: (3) ['ab', 'cd', 'ef'] //只有一个数组参数
        chunwan(...boys);// out:Arguments(3) // 0: "ab" 1: "cd" 2: "ef" //变成三个参数
                         // 等同于chunwan('ab','cd','ef')
       </script>

(二)、扩展运算符的应用

<html>
	<head>
		<meta charset="UTF-8">
		<title>let</title>
	</head>
	<body>
        <div></div>
        <div></div>
        <div></div>
		<script>
        //应用:1. s数组的合并
        const str1 = ['a1','a2'];
        const str2 = ['b1','b2'];
        const unit = str1.concat(str2);
        console.log(unit); //out:(4) ['a1', 'a2', 'b1', 'b2'] //数组
        //扩展运算符
        const unit2 = [...str1, ...str2];
        console.log(unit2);//out:(4) ['a1', 'a2', 'b1', 'b2'] //数组
        //2. 数组的克隆
        const sanzhihua = ['e','g','m'];
        const sanyecao = [...sanzhihua];
        console.log(sanyecao);//out : (3) ['e', 'g', 'm'] //如果元素包含引用类型,则是浅拷贝
        //3. 将伪数组转为真正的数组
        const divs = document.querySelectorAll('div');
        console.log(divs); //out : NodeList(3) [div, div, div] //对象
        const divArr = [...divs];
        console.log(divArr);//out:(3) [div, div, div]
       </script>
	</body>
	
</html>

十、 ES6 - Symbol

(一)、介绍和创建

   Symbol是新引入的数据类型,表示独一无二的值,类似于字符串的数据类型。

特点:1.Symbol值是唯一的,解决命名冲突的问题。2.Symbol值不能与其他数据进行运。                         3.Symbol定义的对象属性不能使用for...in循环遍历,可以用Reflect.ownKeys来获取对象的所有键名

 //创建Symbol
        let s = Symbol();
        console.log(s,typeof s); //out: Symbol() 'symbol'
        
        let s2 = Symbol('abc');//传入描述字符串
        let s3 = Symbol('abc');
        console.log(s2 === s3); // out : false

        let s4 = Symbol.for('abc');
        console.log(s4,typeof s4); // out: Symbol(abc) 'symbol'

        let s5 = Symbol.for('abc');
        console.log(s4 === s5); // out: true
       
        //不能与其他数据进行运算
        // let result = s + 100; //error: Uncaught TypeError: Cannot convert a Symbol value to a number
        // let result = s + s; //error: Uncaught TypeError: Cannot convert a Symbol value to a number

      

     七种数据类型口诀USONB  you are so niubility 
        //u undefined
        //s string symbol
        //o object
        //n null number
        //b boolean    

(二)symbol使用场景

        //2 - 使用场景: 向对象中添加方法 up down
        let game = {
            name:'abc',
            up:function(){},
            down:function(){}
        }
        // game.up = function(){}
        //声明一个对象
        let methods = {
            up:Symbol(),
            down:Symbol()
        };
        game[methods.up] = function(){
            console.log('我可以改变形状');
        }
        game[methods.down] = function(){
            console.log('我可以快速下降');
        }
        console.log(game);//out : {name: 'abc', up: ƒ, down: ƒ, Symbol(): ƒ, Symbol(): ƒ}

        let youxi = {
            name:'狼人杀',
            [Symbol('say')]:function(){
                console.log('abc');
            },
            [Symbol('zibao')]:function(){
                console.log('efg');
            },
        }
        console.log(youxi);//out:{name: '狼人杀', Symbol(say): ƒ, Symbol(zibao): ƒ}

输出:

  1. {name: '狼人杀', Symbol(say): ƒ, Symbol(zibao): ƒ}
    1. name: "狼人杀"
    2. Symbol(say): ƒ ()
      1. arguments: null
      2. caller: null
      3. length: 0
      4. name: "[say]"
      5. prototype: {constructor: ƒ}
      6. [[FunctionLocation]]: 10-symbol.html:63
      7. [[Prototype]]: ƒ ()
      8. [[Scopes]]: Scopes[2]
    3. Symbol(zibao): ƒ ()
    4. [[Prototype]]: Object

(三)Symbol-内置值

除了定义自己使用的Symbol值以外,es6还提供了11个内置的Symbol值,指向语言内部使用的方法

Symbol其他扩展介绍可以参考:

2.3 ES6 Symbol | 菜鸟教程

Symbol - JavaScript | MDN

//当其他对象使用instanseof运算符,判断是否为该对象的实例时,会调用这个方法
      class Person{
        static [Symbol.hasInstance](param){
            console.log(param); // out: {}
            console.log('检测类型');
        }
      }
      let o = {};
      console.log(o instanceof Person);//out:false


      //对象的Symbol.isConcatSpreadable属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,
      //是否可以展开。
      const arr = [1,2,3];
      const arr2 = [4,5,6];
      console.log(arr.concat(arr2));//out: (6) [1, 2, 3, 4, 5, 6]

      arr2[Symbol.isConcatSpreadable] = false;
      console.log(arr.concat(arr2));//out:(4) [1, 2, 3, Array(3)]

十一、迭代器

(一)迭代器介绍

迭代器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,九可以完成遍历操作。

1)es6创造了一种新的遍历命令for..of循环,iterator接口主要供for..of消费

2)原生具备iterator接口 数据(可用for of遍历)

Array, Arguments, Set, Map, String, TypedArray, NodeList

3) 工作原理

a)创建一个指针对象,指向当前数据结构的起始位置

b)第一次调用对象的 next方法,指针自动指向数据结构的第一个成员

c)接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员

d)每调用next方法返回一个包含value和done属性对象

 //声明一个数组
       const arr = ['a','b','c','d'];
       for (let v in arr) {
        console.log(v+"-"+arr[v]); // out: 0-a 1-b 2-c 3-d
       }
       //使用for...of遍历数组
       for (let v of arr) {
        console.log(v); // out: a b c d
       }
       console.log(arr);
       let iterator = arr[Symbol.iterator]();
       console.log(iterator);//out:Array Iterator {}

       //调用对象的next方法
       console.log(iterator.next());//out:{value: 'a', done: false}
       console.log(iterator.next());//out:{value: 'b', done: false}
       console.log(iterator.next());//out:{value: 'c', done: false}
       console.log(iterator.next());//out:{value: 'c', done: false}
       console.log(iterator.next());//out:{value: undefined, done: true}

(二)迭代器应用

注意:需要自定义遍历数据的时候,需要想到迭代器。

  //2 -应用
       //注意:需要自定义遍历数据的时候,需要想到迭代器。
       const banji = {
        name:"终极一班",
        stus:[
            'marry',
            'summer',
            'rukawa',
            'sakuragi',
            'lucy'
        ],
        [Symbol.iterator](){
            let index = 0;
            let _this = this;
            return {
                next:function(){
                    if(index < _this.stus.length) {
                        const result =  {value:_this.stus[index],done:false};
                        //下标自增
                        index++;
                        return result;
                     }else {
                        return {value:undefined, done:true};
                     }
                }
            };
        }
       }
       //遍历对象,每一次返回的结果是数组里的成员
       for (let v of banji) {
        console.log(v);//marry summer rukawa sakuragi lucy
       }

十二、生成器

生成器函数是ES6提供的一种异步编程解决方案,语法行为与传统函数不同

(一)声明和调用

//异步编程 纯回调函数:node fs ajax mongodb

       //加一个星号
       function * gen(){
        console.log('hello');
       }
       let iterator = gen();
       console.log(iterator);
       /**
        * out:
        * gen
            [[GeneratorLocation]]: 12-生成器.html:13
            [[Prototype]]: Generator
                [[Prototype]]: Generator
                    constructor: GeneratorFunction {prototype: Generator, Symbol(Symbol.toStringTag): 'GeneratorFunction', constructor: ƒ}
                    next: ƒ next()
                    return: ƒ return()
                    throw: ƒ throw()
                    Symbol(Symbol.toStringTag): "Generator"
                    [[Prototype]]: Object
            [[GeneratorState]]: "suspended"
            [[GeneratorFunction]]: ƒ * gen()
            [[GeneratorReceiver]]: Window
            [[Scopes]]: Scopes[3]
        * 
       */
      iterator.next(); //out: hello

      //yidld函数代码的分隔符
      function * gen1(){
        console.log(111);
        yield '一个';
        console.log(222);
        yield '二个';
        console.log(333);
        yield '好的吧';
        console.log(444);
      }
      let it = gen1();
      console.log(it.next());//out:111 {value: '一个', done: false}
      console.log(it.next());//out:222 {value: '二个', done: false}
      console.log(it.next());//out:333 {value: '好的吧', done: false}
      console.log(it.next());//out:444 {value: undefined, done: true}

      //遍历
      for(let v of gen1()){
        console.log(v); 
      }
      /**
       * out:
            111
            一个
            222
            二个
            333
            好的吧
            444
       * 
      */

(二)生成器的参数传递

  //2-生成器的参数传递
     function * abc(arg){
        console.log(arg);
        let one = yield 111;
        console.log(one);
        let two = yield 222;
        console.log(two);
        let three = yield 333;
        console.log(three);
     }
     //执行获取迭代器对象
     let iterator1 = abc('aaa');
     console.log(iterator1.next()); // aaa  {value: 111, done: false}
     //next 方法可以传入实参
     console.log(iterator1.next('bbb'));//bbb  {value: 222, done: false}
     console.log(iterator1.next('ccc'));//ccc  {value: 333, done: false}
     console.log(iterator1.next('ddd'));//ddd  {value: undefined, done: true}
   

(三)生成器函数实例

 //3-实例1
    //异步编程:文件操作 网络操作(ajax,request) 数据库操作
    //1s 后控制台输出 111  2s后输出222  3s后输出333
        //老代码:回调地狱
        setTimeout(() => {
            console.log(111);
            setTimeout(() => {
                 console.log(222);
                 setTimeout(() => {
                      console.log(333);
                 }, 1000);
              }, 1000);
        }, 1000);
        console.log("---------------------------");
        //改进
        function one(){
            setTimeout(()=>{
                console.log(111);
                it1.next();
            },1000)
        }
        function two(){
            setTimeout(()=>{
                console.log(222);
                it1.next();
            },1000)
        }
        function three(){
            setTimeout(()=>{
                console.log(333);
                it1.next();
            },1000)
        }
        function * create1(){
            yield one();
            yield two();
            yield three();
        }
        //调用生成器函数
        let it1 = create1();
        it1.next();
 //3-实例2
    //模拟获取 用户数据 订单数据 商品数据
    function getUsers(){
        setTimeout(() => {
            let data1 = '用户数据';
            //调用next方法,并且将数据传入
            it2.next(data1);
        }, 1000);
    }
    function getOrders(){
        setTimeout(() => {
            let data = '订单数据';
            it2.next(data);
        }, 1000);
    }
    function getGoods(){
        setTimeout(() => {
            let data = '商品数据';
            it2.next(data);
        }, 1000);
    }
    function * create2(){
        let users = yield getUsers();
        console.log(users);
        let orders = yield getOrders();
        console.log(orders);
        let goods =  yield getGoods();
        console.log(goods);
    }
    //调用生成器函数
    let it2 = create2();
    it2.next();

十三、Promise

(一)介绍

Promise是es6引入的异步编程的新解决方案,语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。

构造函数:Promise(excutor){}

Promise.prototype.then方法

Promise.prototype.catch方法

//实例化promise对象
        //初始化 成功 失败
        const p = new Promise(function(resolve,reject){
            setTimeout(function(){
                
                // let data = '数据库中的用户数据';
                // //resolve
                // resolve(data);  //成功时调用

                let err = '数据读取失败';
                reject(err);      //失败时调用
            },
            1000);
        });
        //调用promise 对象的 then方法
        p.then(function(value){ //成功
            console.log(value);  // out: 数据库中的用户数据
        },function(reason){//失败
            console.log(reason); // out: 数据读取失败
        })

(二) 封装读取文件

// //1.引入fs模块
const fs = require('fs');
// //2. 调用方法读取文件
// fs.readFile('../resources/1.txt',(err,data)=>{
//     //如果失败,抛出错误
//     if(err) throw err;
//     //如果正确,则输出
//     console.log(data.toString());
// });
//3.使用promise封装
const p = new Promise(function(resolve, reject){
    fs.readFile('../resources/1.txt',(err,data)=>{
        //如果失败
        if(err) reject(err);//改变状态为失败
        //如果正确,改变状态为成功,并传值
       resolve(data);
    });
});

p.then(function(value){
    console.log(value.toString());
},function(reason){
    console.log('读取失败');
});

控制台输入:node .\13-promise读取文件.js

打印出文件内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

adb logcat 保存日志文件到本地

指令 adb logcat > logcat.log例如&#xff1a;例如&#xff1a;adb logcat > D:\logcat.log 注意window中直接输入可能会出现log文件打开显示乱码问题&#xff1b; 请打开cmd检查 输入 chcp 如图 查看结果 如果不是65001 则 执行 chcp 65001 之后执行 例如&#x…

antd 中日期组件添加左侧日期范围选择

一、产品需求 产品有这样一个需求&#xff0c; 在实时的日期组件左侧添加一个快捷时间范围选择&#xff0c;并且选择后&#xff0c;窗口不会自动关闭。 大致样式长这样&#xff1a; 二、需求拆解 拆解一下这个需求&#xff0c;需要满足三个要点&#xff1a; ① 快捷时间范围…

Linux学习之Shell(一)

Shell概述 1&#xff09;Linux提供的Shell解析器有 [xiaominghadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh2&#xff09;bash和sh的关系 [xiaominghadoop101 bin]$ ll | grep bash -rwxr…

LinkFlow CDP洞察能力升级,结合订单开启营销新趋势

4月26日&#xff0c;悠易科技LinkFlow在春季产品发布会上对其洞察产品能力进行了升级。 在技术赋能以人为本的营销5.0阶段&#xff0c;伴随技术的发展&#xff0c;消费者很容易接触到不同的产品和服务&#xff0c;也可以很方便的通过社交网络以及各种社群找到跟自己有相同兴趣…

第四十一章 Unity 输入框 (Input Field) UI

本章节我们学习输入框 (Input Field)&#xff0c;它可以帮助我们获取用户的输入。我们点击菜单栏“GameObject”->“UI”->“Input Field”&#xff0c;我们调整一下它的位置&#xff0c;效果如下 我们在层次面板中发现&#xff0c;这个InputField UI元素包含两个子元素&…

PMP项目管理-[第十章]沟通管理

沟通管理知识体系&#xff1a; 规划沟通管理&#xff1a; 10.1 沟通维度划分 10.2 核心概念 定义&#xff1a;通过沟通活动(如会议和演讲)&#xff0c;或以工件的方式(如电子邮件、社交媒体、项目报告或项目文档)等各种可能的方式来发送或接受消息 在项目沟通中&#xff0c;需要…

聊聊并发编程的12种业务场景

前言 并发编程是一项非常重要的技术&#xff0c;无论在面试&#xff0c;还是工作中出现的频率非常高。 并发编程说白了就是多线程编程&#xff0c;但多线程一定比单线程效率更高&#xff1f; 答&#xff1a;不一定&#xff0c;要看具体业务场景。 毕竟如果使用了多线程&…

用DevExpress WinForms富文本编辑器,集成高级文本编辑功能(一)

DevExpress WinForm富文本编辑器&#xff08;RTF编辑器&#xff09;控件允许用户将高级文本编辑功能集成到下一个WinForms项目中&#xff0c;它包括全面的文本格式选项、支持邮件合并&#xff0c;并附带了丰富的终端用户选项集&#xff0c;因此可以轻松交付受Microsoft word启发…

Linux本地套接字通信

1. 本地套接字 socket API原本为网络通信而设计&#xff0c;后来在其基础上扩展出本地套接字机制用于本地进程间通信。 本地套接字为全双工通信方式。 2. 本地套接字的使用 本地套接字通信步骤 &#xff08;1&#xff09;创建本地socket 本地套接字使用文件来标识&#xff0c;…

【JUC基础】04. Lock锁

1、前言 java.util.concurrent.locks为锁定和等待条件提供一个框架的接口和类&#xff0c;说白了就是锁所在的包。 2、什么是Lock Lock是一种锁机制&#xff0c;比同步块&#xff08;synchronized block&#xff09;更加灵活&#xff0c;同时也更加复杂的线程同步机制。在JDK…

Node.js,多环境配置

目录 1、多环境简介 2、多环境配置 3、命令运行 1、多环境简介 在前端项目的开发过程中&#xff0c;我们需要把项目发布到不同服务器环境中&#xff0c;例如&#xff0c;测试&#xff0c;生产&#xff0c;开发&#xff0c;预生产等环境。在这个我们需要对不同的环境设置不同…

函数的运用

函数的运用 一、函数的定义二、简单函数实验两个数字的运算&#xff1a;调用位置变量函数变量的作用范围 三、函数的递归阶乘递归目录 四、函数库 一、函数的定义 shell函数是经常使用的&#xff0c;因为有些命令序列是需要反复调用执行的&#xff0c;将命令序列按格式写在一起…

三分钟教你Mac下安装VmWare虚拟机

大数据课程课前环境准备&#xff1a;mac中安装三台linux服务器 一、课前准备 准备一台内存最少8G&#xff08;建议16G&#xff09;、cpu i7 4核的电脑 二、课堂主题 安装虚拟化软件VMware准备3台linux虚拟机 三、课堂目标 完成mac下3个虚拟机的安装 四、知识要点 文档说…

洗稿用什么软件-洗稿软件免费

洗稿文章的主要优势 洗稿文章的主要优势在于提高文章的质量和效率。以下是洗稿文章的几个主要优势&#xff1a; 优化结构和语言 洗稿可以删除冗余、无用和重复的内容&#xff0c;同时对文章的结构和语言进行优化&#xff0c;提高文章的可读性和吸引力。这可以使文章更加专业…

探索自然语言处理领域的最新进展与挑战

自然语言处理&#xff08;NLP&#xff09;是人工智能领域中最受关注的领域之一&#xff0c;它涉及计算机和人类语言之间的交互。NLP的应用范围非常广泛&#xff0c;包括机器翻译、语音识别、文本分类、情感分析等等。本文将介绍NLP的基本概念和入门知识&#xff0c;以帮助初学者…

一键安装k8s脚本

服务器配置 节点(华为云服务器)配置master 2vCPUs | 4GiB | s6.large.2 CentOS 7.8 64bit node1 2vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit node2 2vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit 1.master节点安装脚本&#xff1a;install_k8s_master.sh。 sh文件上传到…

Windows基于Docker安装Elasticsearch和 kibana笔记

Windows基于Docker安装Elasticsearch和 kibana笔记 一、Windows安装Docker1、Windows安装Docker要求2、Docker安装 二、基于Docker安装Elasticsearch1、安装Elasticsearch2、Elasticsearch的XPACK验证2.1、什么是Xpack2.2、Xpack相关安全配置介绍2.2.1、xpack.security.enabled…

系统分析师之系统测试与维护(十六)

目录 一、 测试与评审 1.1 测试类型 1.2 测试阶段 1.3 面向对象的测试 1.4 测试自动化 1.5 软件调试 1.6 软件评审 1.7 验收与确认 二、软件质量管理 2.1 软件过程改进-CMMI 2.2 软件开发环境与工具 三、系统运行与评价 3.1 系统转换计划 3.1.1 遗留系统演化策略…

C++——C/C++内存管理

0.关注博主有更多知识 C知识合集 目录 1.C/C内存分布 2.C内存管理方式 2.1new和delete操作内置类型 2.2new和delete对自定义类型操作 2.3new和delete一定要配套使用 2.4new和malloc对错误的处理方式 3.operator new和operator delete函数 3.1new和delete的实现原理 …

如何实现PLC为主站的开关量自组网无线通信?

本方案是基于Modbus RTU协议下实现的1主多从自组网无线通信形式&#xff0c;主站为S7-1200 PLC&#xff0c;DTD433H作为从站。DTD433H具备输入和输出开关量信号功能&#xff0c;信号传输方向由用户原系统主从设备所实现的功能决定。方案中采用无线开关量信号测控终端DTD433H与欧…