学习目录



课件地址: ES6核心技术课件

1、let关键字

1.1 let与var的区别

①let不能重复定义

②块作用域的区别

③变量声明之前let不能使用,var可以

课件代码

  1. <html lang="en">
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>01_let关键字</title>
  5. </head>
  6. <body>
  7. <button>测试1</button>
  8. <br>
  9. <button>测试2</button>
  10. <br>
  11. <button>测试3</button>
  12. <br>
  13. <!--
  14. ***let
  15. 1. 作用:
  16. * 与var类似, 用于声明一个变量
  17. 2. 特点:
  18. * 在块作用域内有效
  19. * 不能重复声明
  20. * 不会预处理, 不存在提升
  21. 3. 应用:
  22. * 循环遍历加监听
  23. * 使用let取代var是趋势
  24. -->
  25. <script type="text/javascript">
  26. /*var a = 100;
  27. console.log(a);
  28. var a = 1000;
  29. console.log(a);*/
  30. // let a = 100;
  31. // let a = 1000;
  32. // console.log(a);
  33. //在JavaScript中作用域分全局作用域和函数作用域。不存在块级作用域。
  34. //ES6中提出了块级作用域。块级作用域比如:条件体、循环体。
  35. /*{
  36. var b = 100;
  37. let c = 200;
  38. }
  39. console.log(b);
  40. console.log(c);*/
  41. /*function test() {
  42. a = 100;
  43. let a = 200;
  44. console.log(a)
  45. }*/
  46. //test();
  47. var btns = document.getElementsByTagName("button");
  48. for(let i=0;i<btns.length;i++) {
  49. btns[i].onclick = function() {
  50. alert(i);
  51. }
  52. }
  53. </script>
  54. </body>
  55. </html>

2、const关键字

课件代码

  1. <html lang="en">
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>02_const关键字</title>
  5. </head>
  6. <body>
  7. <!--
  8. 1. 作用:
  9. * 定义一个常量
  10. 2. 特点:
  11. * 不能修改
  12. * 其它特点同let
  13. 3. 应用:
  14. * 保存不用改变的数据
  15. -->
  16. <script type="text/javascript">
  17. const pi = 3.14;
  18. //pi = 3;
  19. </script>
  20. </body>
  21. </html>

3、变量的结构赋值

3.1 对象



3.2 数组

应用:给多个形参赋值

课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>03_变量的解构赋值</title>
  6. </head>
  7. <body>
  8. <!--
  9. 1. 理解:
  10. * 从对象或数组中提取数据, 并赋值给变量(多个)
  11. 2. 对象的解构赋值
  12. let {n, a} = {n:'tom', a:12}
  13. 3. 数组的解构赋值
  14. let [a,b] = [1, 'atguigu'];
  15. 4. 用途
  16. * 给多个形参赋值
  17. -->
  18. <script type="text/javascript">
  19. let obj = {
  20. username: "tom",
  21. age: 20
  22. }
  23. //let username = obj.username;
  24. //let age = obj.age;
  25. //let {username,age} = obj;
  26. //声明变量的名字必须与对象的属性名相同。
  27. //let {age,username} = obj;
  28. /*let {username,sex,age} = obj;
  29. console.log(username);
  30. console.log(age);
  31. console.log(sex);*/
  32. /*let [a,b,c] = [1,2,3];
  33. console.log(a,b,c)*/
  34. /*let [a,b,c,d,e] = "hello"
  35. console.log(a,b,c,d,e);*/
  36. //作用:
  37. function test({username,age}) {//{username,age} = obj
  38. console.log(username);
  39. }
  40. test(obj)
  41. </script>
  42. </body>
  43. </html>

4、模板字符串

传统的字符串输出用起来麻烦

模板字符串

课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>04_模板字符串</title>
  6. </head>
  7. <body>
  8. <!--
  9. 1. 模板字符串 : 简化字符串的拼接
  10. * 模板字符串必须用 `` 包含
  11. * 变化的部分使用${xxx}定义
  12. -->
  13. <script type="text/javascript">
  14. let stu = {
  15. stuname: "tom",
  16. age: 10
  17. }
  18. //let msg = "您好"+stu.stuname+",今年你已经"+stu.age+"岁了!"
  19. let msg = `您好${stu.stuname},今年你已经${stu.age}岁了!`;
  20. console.log(msg)
  21. </script>
  22. </body>
  23. </html>

5、简化的对象写法

注意this的作用区域

输出为tom

简化如下:

同名的省略,function函数省略

课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>05_简化的对象写法</title>
  6. </head>
  7. <body>
  8. <!--
  9. 简化的对象写法
  10. * 省略同名的属性值
  11. * 省略方法的function
  12. * 例如:
  13. let x = 1;
  14. let y = 2;
  15. let point = {
  16. x,
  17. y,
  18. setX (x) {this.x = x}
  19. };
  20. -->
  21. <script type="text/javascript">
  22. let username = "jerry";
  23. let age = 15;
  24. let obj = {
  25. username,
  26. age,
  27. showName() {
  28. console.log(this.username);
  29. }
  30. }
  31. obj.showName();
  32. </script>
  33. </body>
  34. </html>

6、箭头函数

快捷地址 箭头函数

6.1 形式

完整写法:

forEach用箭头函数

filter用箭头函数

6.2 箭头函数特点

6.3 箭头函数的this

这个this属于window

例子:



sort函数



课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>06_箭头函数</title>
  6. </head>
  7. <body>
  8. <button id="btn1">测试箭头函数this_1</button>
  9. <button id="btn2">测试箭头函数this_2</button>
  10. <!--
  11. * 作用: 定义匿名函数
  12. * 基本语法:
  13. * 没有参数: () => console.log('xxxx')
  14. * 一个参数: i => i+2
  15. * 大于一个参数: (i,j) => i+j
  16. * 函数体不用大括号: 默认返回结果
  17. * 函数体如果有多个语句, 需要用{}包围,若有需要返回的内容,需要手动返回
  18. * 使用场景: 多用来定义回调函数
  19. * 箭头函数的特点:
  20. 1、简洁
  21. 2、箭头函数没有自己的this,箭头函数的this不是调用的时候决定的,
  22. 而是在定义的时候处在的对象就是它的this
  23. 3、扩展理解: 箭头函数的this看外层的是否有函数,
  24. 如果有,外层函数的this就是内部箭头函数的this,
  25. 如果没有,则this是window。
  26. -->
  27. <script type="text/javascript">
  28. /*let fn = function(val) {
  29. return val;
  30. }*/
  31. //箭头的左侧是函数的参数列表,箭头的右侧是函数体
  32. //let fn = val => val;
  33. // 规定: 如果函数只包含一个形参,那么小括号可以省略。如果没有形参或有多个形参,小括号不能省略。
  34. // 如果函数体只有一行代码,{}可以省略。如果这行代码是return语句,return关键字也必须省略。
  35. //console.log(fn(100));
  36. //let arr = [3,5,3,2,5,7];
  37. /*arr.forEach(function(item) {
  38. console.log(item)
  39. })*/
  40. // arr.forEach(item => console.log(item))
  41. // let newArr = arr.filter(item => item>3)
  42. // console.log(newArr);
  43. // let showObj = () => ({username:"tom",age:20})
  44. //
  45. // console.log(showObj());
  46. /*let btn1 = document.getElementById("btn1");
  47. let btn2 = document.getElementById("btn2");
  48. btn1.onclick = function() {
  49. console.log(this.innerText);
  50. console.log(this);
  51. }*/
  52. /*btn2.onclick = () => {
  53. window.setInterval(() => {
  54. console.log(this)
  55. },1000);
  56. }*/
  57. let arr = [5,3,2,6,8,1,9]
  58. //降序
  59. //arr.sort((a,b) => b-a);
  60. arr.sort(function(a,b) {
  61. return b-a;
  62. })
  63. console.log(arr)
  64. </script>
  65. </body>
  66. </html>

7、点点点运算符



扩展用法

箭头函数与可变函数结合

课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>07_3点运算符</title>
  6. </head>
  7. <body>
  8. <!--
  9. * 用途
  10. 1. rest(可变)参数
  11. * 用来取代arguments 但比 arguments 灵活,只能是最后部分形参参数
  12. function fun(...values) {
  13. console.log(arguments);
  14. arguments.forEach(function (item, index) {
  15. console.log(item, index);
  16. });
  17. console.log(values);
  18. values.forEach(function (item, index) {
  19. console.log(item, index);
  20. })
  21. }
  22. fun(1,2,3);
  23. 2. 扩展运算符
  24. let arr1 = [1,3,5];
  25. let arr2 = [2,...arr1,6];
  26. arr2.push(...arr1);
  27. -->
  28. <script type="text/javascript">
  29. /*function test(...val) {
  30. //val rest参数 可变参数
  31. val.forEach(item => console.log(item))
  32. }*/
  33. //可变参数只能使用在参数列表的最后。
  34. // function test(a,...val) {
  35. // val.forEach(item => console.log(item))
  36. // }
  37. //
  38. // test(1,2,3,"aa","bb")
  39. // let arr1 = [2,3,4]
  40. // let arr2 = [1, ...arr1, 5]
  41. // console.log(arr2);
  42. let fn = (...val) => val;
  43. console.log(fn(5,6,4));
  44. </script>
  45. </body>
  46. </html>

8、形参默认值

课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>08_形参默认值</title>
  6. </head>
  7. <body>
  8. <!--
  9. * 形参的默认值----当不传入参数的时候默认使用形参里的默认值
  10. function Point(x = 1,y = 2) {
  11. this.x = x;
  12. this.y = y;
  13. }
  14. -->
  15. <script type="text/javascript">
  16. let showInfo = function(username="无名氏", age=0) {
  17. console.log(username,age);
  18. }
  19. showInfo("tom",20)
  20. //showInfo();
  21. </script>
  22. </body>
  23. </html>

9、数组扩展

Array.of例子

find例子

findIndex例子

课件代码

  1. <html lang="en">
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>03_数组扩展</title>
  5. </head>
  6. <body>
  7. <button>测试1</button>
  8. <br>
  9. <button>测试2</button>
  10. <br>
  11. <button>测试3</button>
  12. <br>
  13. <!--
  14. 1. Array.from(v) : 将伪数组对象或可遍历对象转换为真数组
  15. 2. Array.of(v1, v2, v3) : 将一系列值转换成数组
  16. 3. find(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素
  17. //在数组中找到第一个大于5的元素
  18. 4. findIndex(function(value, index, arr){return true}) : 找出第一个满足条件返回true的元素下标
  19. //在数组中找到第一个大于5的元素的位置
  20. -->
  21. <script type="text/javascript">
  22. // let arr = Array.of("aa",23,"bb",3.5);
  23. // console.log(arr)
  24. //在数组中找到第一个大于5的元素
  25. let arr = [4,3,5,6,3,7,9,2];
  26. // let result = arr.find((item,index) => item>5);
  27. // console.log(result)
  28. let result = arr.findIndex((item) => item>5);
  29. console.log(result)
  30. </script>
  31. </body>
  32. </html>

10、字符串扩展

例子

课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>01_字符串扩展</title>
  6. </head>
  7. <body>
  8. <!--
  9. 1. includes(str) : 判断是否包含指定的字符串
  10. 2. startsWith(str) : 判断是否以指定字符串开头
  11. 3. endsWith(str) : 判断是否以指定字符串结尾
  12. 4. repeat(count) : 重复指定次数
  13. -->
  14. <script type="text/javascript">
  15. let str = "hello world";
  16. console.log(str.includes("lla")) ;
  17. console.log(str.startsWith("he"));
  18. console.log(str.endsWith("ld"));
  19. console.log(str.repeat(3));
  20. </script>
  21. </body>
  22. </html>

11、数值扩展

例子





课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>02_数值扩展</title>
  6. </head>
  7. <body>
  8. <!--
  9. 1. 二进制与八进制数值表示法: 二进制用0b, 八进制用0o
  10. 2. Number.isFinite(i) : 判断是否是有限大的数
  11. 3. Number.isNaN(i) : 判断是否是NaN
  12. 4. Number.isInteger(i) : 判断是否是整数
  13. 5. Number.parseInt(str) : 将字符串转换为对应的数值
  14. 6. Math.trunc(i) : 直接去除小数部分 截断
  15. -->
  16. <script type="text/javascript">
  17. console.log(Number.isFinite(100000000000));
  18. console.log(Number.isFinite(Infinity));
  19. console.log(Number.isInteger(3.13));
  20. console.log(Number.isInteger(3.0));
  21. console.log(Math.trunc(3.9999999));
  22. //二进制
  23. console.log(0b1010)
  24. //八进制
  25. console.log(0o56);//46
  26. console.log(Number.parseInt("123abc"));
  27. </script>
  28. </body>
  29. </html>

12、class

快捷地址 ES6中的类

创建对象

用extends继承



super继承父类的,this为子类的
子类可以对父类的函数进行重写,以此来传递子类独有的参数,如Student的sex属性
如果在父类的toString函数中加入this.sex会报错,因为父类中没有sex属性

class拓展



给P1挂载一个sex属性,可以输出

P2没有,输出P2.sex显示undefined



若要使P1和P2都有这个属性,则在原型对象上挂载属性,如address



address被所有对象共享



单个对象改变不了原型属性↑



可以看出只是添加了一个属性,只是与原型属性重名

静态成员

课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>12_class</title>
  6. </head>
  7. <body>
  8. </body>
  9. <!--
  10. 1. 通过class定义类/实现类的继承
  11. 2. 在类中通过constructor定义构造方法
  12. 3. 通过new来创建类的实例
  13. 4. 通过extends来实现类的继承
  14. 5. 通过super调用父类的构造方法
  15. 6. 重写从父类中继承的一般方法
  16. -->
  17. <script type="text/javascript">
  18. class Person {
  19. constructor(username, age) {
  20. this.username = username;
  21. this.age = age;
  22. }
  23. toString() {
  24. console.log(this.username,this.age);
  25. }
  26. }
  27. class Student extends Person{
  28. constructor(username, age, sex) {
  29. super(username, age);
  30. this.sex = sex;
  31. }
  32. toString() {
  33. console.log(this.username,this.age, this.sex);
  34. }
  35. }
  36. //创建对象时,必须使用关键字new来调用构造方法。
  37. let p1 = new Person("tom",20);
  38. let p2 = new Person("jerry",15);
  39. p1.toString()
  40. p2.toString();
  41. let stu = new Student("张三",18,"男");
  42. stu.toString();
  43. </script>
  44. </html>
  45. <script type="text/javascript">
  46. class Person {
  47. constructor(username, age) {
  48. this.username = username;
  49. this.age = age;
  50. }
  51. toString() {
  52. console.log(this.username,this.age);
  53. }
  54. }
  55. //创建对象时,必须使用关键字new来调用构造方法。
  56. let p1 = new Person("tom",20);
  57. p1.sex = "男";
  58. p1.test = function() {
  59. this.toString();
  60. }
  61. let p2 = new Person("jerry",15);
  62. console.log(p1.sex);
  63. p1.test();
  64. console.log(p2.sex);
  65. //在原型对象上挂载属性
  66. Person.prototype.address="中国";
  67. //不能通过对象,修改原型属性
  68. p1.address = "地球";
  69. Person.city = "大连";
  70. console.log(p1);
  71. console.log(p2);
  72. console.log(Person.city);
  73. </script>

13、set和map数据结构

13.1 Set

去除重复元素

存放到数组中



13.2 Map





课件代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>05_Set和Map数据结构</title>
  6. </head>
  7. <body>
  8. <!--
  9. 1. Set容器 : 无序不可重复的多个value的集合
  10. * Set()
  11. * Set(array)
  12. * add(value)
  13. * delete(value)
  14. * has(value)
  15. * clear()
  16. * size
  17. 2. Map容器 : 无序的 key不重复的多个key-value的集合
  18. * Map()
  19. * Map(二维array)var map = new Map([['userName','aaa'],['age',20]])
  20. * set(key, value)//添加
  21. * get(key)
  22. * delete(key)
  23. * has(key)
  24. * clear()
  25. * size
  26. -->
  27. <script type="text/javascript">
  28. //思考: 去除数组中所有重复元素
  29. //练习:去除数组中的重复元素[2,4,3,5,3,2,4,2,6,7] [2,4,3,5,6,7]
  30. let arr = [2,4,3,5,3,2,4,2,6,7];
  31. let newArr = [];
  32. let set = new Set(arr);
  33. /*set.forEach(item => {
  34. newArr.push(item);
  35. })*/
  36. // newArr = Array.from(set);
  37. // console.log(newArr);
  38. set.add("aa");
  39. set.delete(3);
  40. console.log(set.has(5)) ;
  41. console.log(set.size);
  42. let map = new Map([["username","tom"],["age",20]]);
  43. map.set("sex","男")
  44. console.log(map.get("age"))
  45. console.log(map.size);
  46. console.log(map)
  47. </script>
  48. </body>
  49. </html>

14、模块化









export default只能出现一次

课件代码

模块化.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script type="module" src="../js/app.js"></script>
  7. </head>
  8. <body>
  9. </body>
  10. </html>

app.js

  1. //导入模块时,模块的名字必须要与导出的名字相同。
  2. test();
  3. import { firstName as name,lastName,test } from './one.js';
  4. console.log(name);
  5. //导入
  6. import aaa from './one.js';
  7. aaa();

one.js

  1. export let firstName = 'Michael';
  2. export let lastName = 'Jackson';
  3. export let year = 1958;
  4. export function test() {
  5. console.log("导出一个方法");
  6. }
  7. export default function() {
  8. console.log("这是一个export default导出的方法")
  9. }
  10. export default function() {
  11. console.log("这是第二个export default导出的方法")
  12. }

记录21.07.21 —— ES6基础的更多相关文章

  1. 2018-10-15 21:07:38 c language

    2018-10-15 21:07:38 c language C语言编译器,神奇的魔法师 在类 UNIX 系统(Linux.Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判断 ...

  2. Murano Weekly Meeting 2015.07.21

    会议时间: 2015.07.21 主持人: Kirill Zaitsev, core from Mirantis 会议摘要:  1.murano client和murano dashboard升级到y ...

  3. Django 07 Django模型基础2 (常用查询和多表关联)

    Django 07 Django模型基础2 (常用查询和多表关联) 一.常用查询 #查找数据 def search_user(request): #获取 rs = User.objects.first ...

  4. ES6 基础

    转载自:ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来 ...

  5. 新手必看ES6基础

    ES6 基础 一.新的变量声明方式 let/const 与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升. 通过2个简单的例子来说明这两 ...

  6. 十二星座 英文名:Aries 金牛座 (4/21 - 5/20)的英文名: Taurus 双子座 (5/21 - 6/21)的英文名: Gemini 巨蟹座 (6/22 - 7/22)的英文名: Cancer 狮子座 (7/23 - 8/22)的英文名: Leo 处女座/室女座 (8/23 - 9/22)的英文名: Virgo 天秤座 (9/2

    十二星座的具体顺序是:白羊座(Aries).金牛座(Taurus).双子座(Gemini).巨蟹座(Cancer).狮子座(Leo).处女座(Virgo).天秤座(Libra).天蝎座(Scorpio ...

  7. 【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉

    机器视觉 machine vision机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人完 ...

  8. 记录21.07.23 —— Vue.js基础(二)

    Vue基础(二) 过滤器 过滤器作用 全局过滤器 输出结果 私有过滤器 输出结果 把其中一个做点修改 错误信息 自定义指令 全局自定义指令 私有自定义指令 钩子函数 注意:fond-weight是粗细 ...

  9. 记录21.07.22 —— Vue.js基础(一)

    VUE基础 语雀课件地址 Vue.js框架 Vue中文文档 Vue.js 创建vue项目 ①在一个空项目中引入vue的js文件 <script src="https://cdn.jsd ...

随机推荐

  1. 看CarbonData如何用四招助力Apache Spark

    摘要:CarbonData 在 Apache Spark 和存储系统之间起到中介服务的作用,为 Spark 提供的4个重要功能. 本文分享自华为云社区<Make Apache Spark bet ...

  2. 『无为则无心』Python序列 — 19、Python列表的其他操作(切片和遍历)

    目录 1.通过切片对列表的操作 (1)通过切片对列表进行修改 (2)通过切片对列表进行删除 (3)注意 2.列表的循环遍历 (1)while循环遍历 (2)for循环遍历 3.列表嵌套 4.综合示例 ...

  3. 02 jumpserver系统设置

    2.系统设置: (1)基本设置: (2)邮件设置: 1)163邮箱设置: 2)在jumpserver上填写邮箱信息: 3)邮件测试信息如下: (3)邮件内容设置: (4)终端设置: (5)安全设置:

  4. 一小时搞懂Mysql锁机制

    内容概述: 我们知道,数据也是一种供许多用户共享访问的资源.如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素.从这一角度来说,锁对 ...

  5. 消息队列——kafka

    原文:再过半小时,你就能明白kafka的工作原理了 会出现什么情况呢? 1.为了这个女朋友,我请假回去拿(老板不批). 2.小哥一直在你楼下等(小哥还有其他的快递要送). 3.周末再送(显然等不及). ...

  6. AOP面向切面的实现

    AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等等. AOP ...

  7. base64文件解码

    $str = str_replace(' ', '+', $str); //替换空字符串为+$str = str_replace('\n', '',$str); //置空换行符$str = str_r ...

  8. 剑指offer 37-42

    37. 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 思路: 1.平衡二叉树的定义为,当为空树或左右子树高度小于等于1,同时左右子树都要为平衡二叉树. 2.先分别求出左右子树的高度,比较高度差,如果 ...

  9. Exception 和Error异常大部分人都犯过的错。

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员. 我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 1,简介 Exception ...

  10. git使用---安装,提交,回退,修改,分支,标签等

    下面是对git的各种使用及命令的基础使用,来自廖雪峰老师的git教程,这个收录下,作为git的使用总结. github上面地址为:https://github.com/Zhangguoliu/lear ...