大学生涯 vue Vue学习笔记(七) Jie 2024-10-29 2024-11-20 1 let 与 const、块级作用域 在 ES6 之前 JS 是没有块级作用域的,const 与 let 填补了这方面的空白,分别使用 let、const 声明变量和常量,const 与 let 都是块级作用域。 使用 var 定义的变量为函数级作用域: 使用 let 与 const 定义的变量为块级作用域
1 2 3 4 5 6 7 8 9 { var i = 0 ; var i = 1 ; let j = 0 ; const k = 1 ; } console .log ("i:" + i);
2 函数参数默认值 ES6 支持在定义函数的时候为其设置默认值:传值覆盖,空值默认 格式:function 函数名称(参数名称 1=值 1,参数名称 2=值 2, ……){}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function method (name, age ) { name = name || "XXX" ; age = age || 1 ; console .log (name + ":" + age); } method (); method ("小明" , 16 ); method ("小明" , 0 ); function method1 (name = "YYY" , age = 1 ) { console .log (name + ":" + age); } method1 (); method1 ("小张" , 16 ); method1 ("小张" , 0 );
3 箭头函数 箭头函数=>不只是关键字 function 的简写,类似于部分强类型语言中的 lambda 表达式 箭头函数用 => 符号来定义。 箭头函数相当于匿名函数,所以采用函数表达式的写法。 基本结构 匿名函数:function(参数){} 箭头函数:(参数)=>{} 箭头函数的箭头=>之前是一个空括号、单个的参数名、或用括号括起的多个参数名,而箭头之后可 以是一个表达式(作为函数的返回值),或者是用花括号括起的函数体(需要自行通过 return 来返 回值,否则返回的是 undefined)。
1 2 3 4 5 6 7 8 let sum0 = function (x, y ) { return x + y; }; let sum1 = (x, y ) => { return x + y; };
箭头函数例子:某些情况进一步简写 (1)当要执行的代码块只有一条语句时,可省略大括号和 return 关键字: (2)当传入的参数只有一个时,可以省略小括号: (3)当不需要参数时,使用空的圆括号:
1 2 3 4 5 6 7 8 9 10 11 12 13 let sum2 = (x, y ) => x + y;let sum3 = function (x ) { return x + x; }; let sum4 = (x ) => x + x;let sum5 = function ( ) { return 100 + 100 ; }; let sum6 = ( ) => 100 + 100 ;
4 对象属性缩写 在 ES6 中允许我们在设置一个对象的属性(函数)的时候不指定属性名(函数名)。 当对象属性(函数)名称和外部变量(函数)名称,同名的情况下,可以省略属性名的重复书写以 及冒号。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 const name = "小明" ;const age = 16 ;const city = "上海" ;const student = { name : name, age : age, city : city, show : function ( ) { console .log ("show~~" ); }, }; console .log (student); student.show (); const student1 = { name, age, city, show ( ) { console .log ("show~~" ); }, }; console .log (student1); student1.show ();
5 模板字符串 ES6 支持模板字符串,使得字符串的拼接更加的简洁、直观。 不使用模板字符串: 在 ES5 中字符串拼接通过【+】实现
1 2 3 let first = "张" ;let last = "四" ;let name = 'Your name is ' + first + ' ' + last + '.' '
使用模板字符串: ES6 中使用反引号【``】来拼接字符串,使用【${}】来包含变量
1 2 3 let first = "张" ;let last = "四" ;let name = `Your name is ${first} ${last} .` ;
6 模块化(Module) export 和 import 1 2 3 4 5 <!--使用 type="module" 属性告诉浏览器,这个 <script> 标签中的 JavaScript 代码是一个模块。 域,模块内部的变量和函数不会污染全局作用域,也不会受到其他模块的影响--> <script type ="module" > </script >
6.1 export 模块是独立的文件,该文件内部的所有的变量外部都无法获取。如果希望获取某个变量,必须通过 export 输出
1 2 3 4 export let firstName = "Michael" ;export let lastName = "Jackson" ;export let year = 1958 ;
或者用更好的方式:用大括号指定要输出的一组变量
1 2 3 4 5 let firstName = "Michael" ;let lastName = "Jackson" ;let year = 1958 ;export { firstName, lastName, year };
除了输出变量,还可以输出函数或者类(class),
1 2 3 export function multiply (x, y ) { return x * y; }
还可以批量输出,同样是要包含在大括号里,也可以用 as 重命名
1 2 3 4 5 6 7 function v1 ( ) { ... }function v2 ( ) { ... }export {v1 as streamV1, v2 as streamV2, v2 as streamLatestVersion };
export 命令规定的是对外接口,必须与模块内部变量建立一一对应的关系 main.js import profile.js 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 export let m = 1 ;let m = 1 ;export {m};let n = 1 ;export {n as m};export 1 ;let m = 1 ;export m;
6.2 import export 定义了模块的对外接口后,其他 JS 文件就可以通过 import 来加载这个模块, import 命令接受一对大括号,里面指定要从其他模块导入的变量名,必须与被导入模块 ( profile.js )对外接口的名称相同。 如果想重新给导入的变量一个名字,可以用 as 关键字, import 后的 from 可以指定需要导入模块的路径名,可以是绝对路径,也可以是相对路径, .js 路径可以 省略,如果只有模块名,不带有路径,需要有配置文件指定。 注意, import 命令具有提升效果,会提升到整个模块的头部,首先执行。(是在编译阶段执行的) module 的整体加载 除了指定加载某个输出值,还可以用(*)指定一个对象,所有的变量都会加载在这个对象上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 export 1 ;let m = 1 ;export m;import {firstName, lastName, year} from './profile' ; function setName (element ) {element.textContent = firstName + ' ' + lastName; } import { lastName as surname } from './profile' export function area (radius ) {return Math .PI * radius * radius;} export function circumference (radius ) {return 2 * Math .PI * radius;} import { area, circumference } from './circle' ;console .log ('圆面积:' + area (4 ));console .log ('圆周长:' + circumference (14 ));import * as circle from './circle' ;console .log ('圆面积:' + circle.area (4 ));
注意,模块整体加载所在的那个对象(上例是 circle ),应该是可以静态分析的,所以不允许运行时 改变。 export default 之前的例子中,使用 import 导入时,都需要知道模块中所要加载的变量名或函数名,用户可能不想阅读 源码,只想直接使用接口,就可以用 export default 命令,为模块指定输出 其他模块加载该模块时, import 命令可以为该匿名函数指定任意名字。 export default 也可以用于非匿名函数前。 下面比较一下默认输出和正常输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 console .log ('圆周长:' + circle.circumference (14 ));import * as circle from './circle' ;circle.foo = 'hello' ; circle.area = function ( ) {}; export default function ( ) {console .log ('foo' );} import customName from './export-default' ;customName (); export default function crc32 ( ) { } import crc32 from 'crc32' ; export function crc32 ( ) { }; import {crc32} from 'crc32' ;
7 解构语法 7.1 数组的解构 7.1.1 数组解构的基本用法 1 2 3 4 const names = ["abc" , "cba" , "ccc" ];console .log (names); const [item1, item2, item3] = names;console .log (item1, item2, item3);
7.1.2 顺序解构 1 2 3 4 const [, , itemz] = names;console .log (itemz);
1 2 3 4 5 6 ### 7.1 .3 解构出数组 const [itema,...newNames] = names console .log (itema); console .log (newNames);
7.1.4 解构的默认值 1 2 3 const [itema, itemb, itemc, itemd = "aaa" ] = names;console .log (itemd);
7.2 对象的解构 7.2.1 任意顺序 1 2 3 4 5 6 7 8 const obj = { name : "harry" , age : 21 , height : 1.98 , }; let { age, height, name } = obj;console .log (name, age, height);
7.2.2 重命名 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 const names = ["abc" , "cba" , "ccc" ];console .log (names); const [item1, item2, item3] = names;console .log (item1, item2, item3); const [, , itemz] = names;console .log (itemz); const [itema, ...newNames] = names; console .log (itema); console .log (newNames); const [itema, itemb, itemc, itemd = "aaa" ] = names;console .log (itemd); const obj = { name : "harry" , age : 21 , height : 1.98 , }; let { age, height, name } = obj;console .log (name, age, height); let { name : newName } = obj;console .log (newName);
7.2.3 默认值 1 2 3 4 5 const { address = "南京市" } = obj;console .log (address); const { sex : manOrWoman = "男" } = obj;console .log (manOrWoman);