学习笔记整理





1、let声明

es5变量声明方式var存在两个问题:①变量提升,即变量不需要先声明后使用,亦可先使用后声明。②变量的作用域只有两种:全局作用域和局部作用域。

let声明的变量作用域为块级作用域,且必须先声明后使用,使代码更加严谨。

看下面这题,输出结果应为多少?


     
     
  1. var a = 10;
  2. ( function(){
  3. console.log(a);
  4. var a = 100;
  5. })();

答案是undefined,因为var声明变量的提升效果,这里相当于:


     
     
  1. var a = 10;
  2. ( function(){
  3. var a;
  4. console.log(a);
  5. a = 100;
  6. })();

另外,值得注意的是,JavaScript永远是先解析声明函数,再解析变量。


     
     
  1. var a = 1;
  2. function a(x){
  3. return 2*x;
  4. }
  5. console.log(a); //1

此时,还有一种情况需要注意:


     
     
  1. var a;
  2. function a(x){
  3. return 2*x;
  4. }
  5. console.log(a); //function a

这里是由于a没有被赋值,还是指向回原来的function a();

不管条件成立不成立,函数里的a都进行变量提升,因为条件不成立,所以a = undefined


     
     
  1. var a= 1;
  2. function foo(){
  3. if( false){
  4. var a= 2;
  5. }
  6. console.log(a);
  7. }
  8. foo();
  9. //执行结果:undefined

2、const声明

定义后必须赋值,且赋值后不可改变。

3、变量的解构赋值(数组法)


     
     
  1. var [a,b,c]=[ 1, 2, 3];
  2. //相当于 var a=1,b=2,c=3;

     
     
  1. var [a,[b,c]]=[ 1,[ 2, 3]];
  2. //相当于 var a=1,b=2,c=3;

     
     
  1. var [a,b= 'default',c= 'default']=[ 1, 2];
  2. //a=1,b=2,c='default'

     
     
  1. var [a,b,c]=[ 1, 2];
  2. //a=1,b=2,c=undefined

     
     
  1. var [a,...c]=[ 1, 2, 3];
  2. //a=1,c=[2,3]

4、变量的解构赋值(对象法)


      
      
  1. var obj = { a: 1, b: 2};
  2. var {a,b}=obj; //相当于var a=1,b=2;

      
      
  1. var obj = { a: 1, b: 2};
  2. var { a:A,b}=obj;
  3. //a被替换成A,相当于var A=1,b=2;

      
      
  1. //亦可设置默认值
  2. var obj = { a: 1};
  3. var { a:A= 3,b= 4}=obj; //A=1,b=4

      
      
  1. var a,b;
  2. var obj = { a: 1, b: 2};
  3. ({a,b}=obj);
  4. //注意这里要加上括号,因为若不加上括号,js解析器会认为“{”后面是代码块

复杂点的解构赋值:


      
      
  1. var obj = {
  2. arr:[ ‘Yo’,{ a: 1}]
  3. }
  4. var { arr:[greet,{a}]}=obj;
  5. //greet=’Yo’,a=1

5、解构赋值的一些其他用法(字符串,传参)

①读取字符串长度
let {length}="hello"; //变量length=5  {}里面必须是length
      
      

②字符串赋值


      
      
  1. let [a,b,c]= "ion";
  2. //a='i', b='o', c='n'
③函数传参解构

      
      
  1. var arr=[ 1, 2];
  2. function test([a,b]){
  3. console.log(a+ ” “+b);
  4. }
  5. test(arr); //1 2

      
      
  1. var obj={ b: 2};
  2. function test({b,a=10}){
  3. console.log(a+ " "+b);
  4. }
  5. test(obj); //10 2

6、新增字符串方法

includes()        startsWith()     endsWith()     repeat()


      
      
  1. console.log( 'You'.indexOf( 'Y') !== -1); //原来判断字符串是否包含Y的方法 true
  2. console.log( 'You'.includes( 'Y'));
  3. //es6判断字符串是否包含Y true
  4. console.log( 'You'.startsWith( 'Y')); //是否以Y开始 true
  5. console.log( 'You'.endsWith( 'u')); //是否以u开始 true
  6. console.log( 'You'.repeat( '3')); //重复字符3次 YouYouYou

7、模板字符串


      
      
  1. let title= 'hello world!';
  2. let tpl1= '<div>'+ '<span>'+title+ '</span>'+ '</div>';
  3. let tpl2= </span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"> &lt;div&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"> &lt;span&gt;<span class="hljs-subst">${title}</span>&lt;/span&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"> &lt;/div&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">;
  4. console.log( "tpl1",tpl1);
  5. console.log( "tpl2",tpl2);

8、Symbol数据类型

ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。

对变量或值调用 typeof 运算符将返回下列值之一:

  • undefined - 如果变量是 Undefined 类型的
  • boolean - 如果变量是 Boolean 类型的
  • number - 如果变量是 Number 类型的
  • string - 如果变量是 String 类型的
  • object - 如果变量是一个对象或 Null或者数组 
  • function -如果变量是个函数名
  • symbol  -es6引入的数据类型

注意不要和JavaScript基本数据类型搞混,基本数据类型有7个:undefined、null、Boolean、String、Number、Object、Symbol     (根据阮一峰老师的教程,基本数据类型就这7种,不包括Array)

①每次创建Symbol,它的值都不一样


      
      
  1. let a = Symbol();
  2. let b = Symbol();
  3. console.log(a === b); //false
②Symbol里面可以传入一个参数,用于描述你创建的Symbol,传入参数对他的值没有影响
let a=Symbol('this is a Symbol');
      
      
③应用:在不同的块中,临时重写变量

      
      
  1. let name = Symbol();
  2. {
  3. var person = {};
  4. person[name] = ‘file1’;
  5. console.log( ‘person[name]’,person[name]); //file1
  6. }
  7. {
  8. let name = Symbol();
  9. person[name] = ‘file2’;
  10. console.log( ‘person[name]’,person[name]); //file2
  11. }
  12. console.log( ‘person[name]’,person[name]); //file1

④Symbol 值不能与其他类型的值进行运算,会报错。


      
      
  1. let sym = Symbol( 'My symbol');
  2. "your symbol is " + sym // TypeError: can't convert symbol to string
  3. your symbol is <span class="hljs-subst">${sym}</span> // TypeError: can't convert symbol to string
⑤Symbol 值作为对象属性名时,不能用点运算符

      
      
  1. const mySymbol = Symbol();
  2. const a = {};
  3. a.mySymbol = ‘Hello!’;
  4. a[mySymbol] // undefined
  5. a[ ‘mySymbol’] // “Hello!”

9、Proxy


      
      
  1. var user = new Proxy({},{
  2. get: function(obj,prop){
  3. if(prop == 'full_name')
  4. return obj.fname + ' ' +obj.lname;
  5. }})
  6. user.fname= 'Bob';
  7. user.lname = 'Wood';
  8. console.log( "user.full_name: ",user.full_name); //user.full_name:Bob Wood
  9. console.log( "user.age: ",user.age); //undefined


10、Set

Set里面数组值唯一,不重复


      
      
  1. var s = new Set([ 1, 2, 3, 3]);
  2. console.log( 's.size', s.size); //3
  3. console.log( 's', s); // {1,2,3}
  4. s.add( 4); //添加4
  5. console.log( 's', s); //{1,2,3,4}
  6. s.delete( 2); //删除2
  7. console.log( 's', s); //{1,3,4}
  8. console.log( 's.has(5)',s.has( 5)); //false 判断Set是否包含5
  9. s.clear(); //清空Set
  10. console.log( 's', s) //{}










1、let声明

es5变量声明方式var存在两个问题:①变量提升,即变量不需要先声明后使用,亦可先使用后声明。②变量的作用域只有两种:全局作用域和局部作用域。

let声明的变量作用域为块级作用域,且必须先声明后使用,使代码更加严谨。

看下面这题,输出结果应为多少?


  
  
  1. var a = 10;
  2. ( function(){
  3. console.log(a);
  4. var a = 100;
  5. })();

答案是undefined,因为var声明变量的提升效果,这里相当于:


  
  
  1. var a = 10;
  2. ( function(){
  3. var a;
  4. console.log(a);
  5. a = 100;
  6. })();

另外,值得注意的是,JavaScript永远是先解析声明函数,再解析变量。


  
  
  1. var a = 1;
  2. function a(x){
  3. return 2*x;
  4. }
  5. console.log(a); //1

此时,还有一种情况需要注意:


  
  
  1. var a;
  2. function a(x){
  3. return 2*x;
  4. }
  5. console.log(a); //function a

这里是由于a没有被赋值,还是指向回原来的function a();

不管条件成立不成立,函数里的a都进行变量提升,因为条件不成立,所以a = undefined


  
  
  1. var a= 1;
  2. function foo(){
  3. if( false){
  4. var a= 2;
  5. }
  6. console.log(a);
  7. }
  8. foo();
  9. //执行结果:undefined

2、const声明

定义后必须赋值,且赋值后不可改变。

3、变量的解构赋值(数组法)


  
  
  1. var [a,b,c]=[ 1, 2, 3];
  2. //相当于 var a=1,b=2,c=3;

  
  
  1. var [a,[b,c]]=[ 1,[ 2, 3]];
  2. //相当于 var a=1,b=2,c=3;

  
  
  1. var [a,b= 'default',c= 'default']=[ 1, 2];
  2. //a=1,b=2,c='default'

  
  
  1. var [a,b,c]=[ 1, 2];
  2. //a=1,b=2,c=undefined

  
  
  1. var [a,...c]=[ 1, 2, 3];
  2. //a=1,c=[2,3]

4、变量的解构赋值(对象法)


   
   
  1. var obj = { a: 1, b: 2};
  2. var {a,b}=obj; //相当于var a=1,b=2;

   
   
  1. var obj = { a: 1, b: 2};
  2. var { a:A,b}=obj;
  3. //a被替换成A,相当于var A=1,b=2;

   
   
  1. //亦可设置默认值
  2. var obj = { a: 1};
  3. var { a:A= 3,b= 4}=obj; //A=1,b=4

   
   
  1. var a,b;
  2. var obj = { a: 1, b: 2};
  3. ({a,b}=obj);
  4. //注意这里要加上括号,因为若不加上括号,js解析器会认为“{”后面是代码块

复杂点的解构赋值:


   
   
  1. var obj = {
  2. arr:[ ‘Yo’,{ a: 1}]
  3. }
  4. var { arr:[greet,{a}]}=obj;
  5. //greet=’Yo’,a=1

5、解构赋值的一些其他用法(字符串,传参)

①读取字符串长度
let {length}="hello"; //变量length=5  {}里面必须是length
   
   

②字符串赋值


   
   
  1. let [a,b,c]= "ion";
  2. //a='i', b='o', c='n'
③函数传参解构

   
   
  1. var arr=[ 1, 2];
  2. function test([a,b]){
  3. console.log(a+ ” “+b);
  4. }
  5. test(arr); //1 2

   
   
  1. var obj={ b: 2};
  2. function test({b,a=10}){
  3. console.log(a+ " "+b);
  4. }
  5. test(obj); //10 2

6、新增字符串方法

includes()        startsWith()     endsWith()     repeat()


   
   
  1. console.log( 'You'.indexOf( 'Y') !== -1); //原来判断字符串是否包含Y的方法 true
  2. console.log( 'You'.includes( 'Y'));
  3. //es6判断字符串是否包含Y true
  4. console.log( 'You'.startsWith( 'Y')); //是否以Y开始 true
  5. console.log( 'You'.endsWith( 'u')); //是否以u开始 true
  6. console.log( 'You'.repeat( '3')); //重复字符3次 YouYouYou

7、模板字符串


   
   
  1. let title= 'hello world!';
  2. let tpl1= '<div>'+ '<span>'+title+ '</span>'+ '</div>';
  3. let tpl2= </span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"> &lt;div&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"> &lt;span&gt;<span class="hljs-subst">${title}</span>&lt;/span&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"> &lt;/div&gt;</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">;
  4. console.log( "tpl1",tpl1);
  5. console.log( "tpl2",tpl2);

8、Symbol数据类型

ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol的原因。

对变量或值调用 typeof 运算符将返回下列值之一:

  • undefined - 如果变量是 Undefined 类型的
  • boolean - 如果变量是 Boolean 类型的
  • number - 如果变量是 Number 类型的
  • string - 如果变量是 String 类型的
  • object - 如果变量是一个对象或 Null或者数组 
  • function -如果变量是个函数名
  • symbol  -es6引入的数据类型

注意不要和JavaScript基本数据类型搞混,基本数据类型有7个:undefined、null、Boolean、String、Number、Object、Symbol     (根据阮一峰老师的教程,基本数据类型就这7种,不包括Array)

①每次创建Symbol,它的值都不一样


   
   
  1. let a = Symbol();
  2. let b = Symbol();
  3. console.log(a === b); //false
②Symbol里面可以传入一个参数,用于描述你创建的Symbol,传入参数对他的值没有影响
let a=Symbol('this is a Symbol');
   
   
③应用:在不同的块中,临时重写变量

   
   
  1. let name = Symbol();
  2. {
  3. var person = {};
  4. person[name] = ‘file1’;
  5. console.log( ‘person[name]’,person[name]); //file1
  6. }
  7. {
  8. let name = Symbol();
  9. person[name] = ‘file2’;
  10. console.log( ‘person[name]’,person[name]); //file2
  11. }
  12. console.log( ‘person[name]’,person[name]); //file1

④Symbol 值不能与其他类型的值进行运算,会报错。


   
   
  1. let sym = Symbol( 'My symbol');
  2. "your symbol is " + sym // TypeError: can't convert symbol to string
  3. your symbol is <span class="hljs-subst">${sym}</span> // TypeError: can't convert symbol to string
⑤Symbol 值作为对象属性名时,不能用点运算符

   
   
  1. const mySymbol = Symbol();
  2. const a = {};
  3. a.mySymbol = ‘Hello!’;
  4. a[mySymbol] // undefined
  5. a[ ‘mySymbol’] // “Hello!”

9、Proxy


   
   
  1. var user = new Proxy({},{
  2. get: function(obj,prop){
  3. if(prop == 'full_name')
  4. return obj.fname + ' ' +obj.lname;
  5. }})
  6. user.fname= 'Bob';
  7. user.lname = 'Wood';
  8. console.log( "user.full_name: ",user.full_name); //user.full_name:Bob Wood
  9. console.log( "user.age: ",user.age); //undefined


10、Set

Set里面数组值唯一,不重复


   
   
  1. var s = new Set([ 1, 2, 3, 3]);
  2. console.log( 's.size', s.size); //3
  3. console.log( 's', s); // {1,2,3}
  4. s.add( 4); //添加4
  5. console.log( 's', s); //{1,2,3,4}
  6. s.delete( 2); //删除2
  7. console.log( 's', s); //{1,3,4}
  8. console.log( 's.has(5)',s.has( 5)); //false 判断Set是否包含5
  9. s.clear(); //清空Set
  10. console.log( 's', s) //{}






猜你喜欢

转载自blog.csdn.net/lingkeyu/article/details/81414786