wepApi第九天

78 阅读7分钟
  1. 本地存储

  2. 元素属性

  3. 高阶函数(了解)

  4. 重绘和回流(了解)

  5. 事件绑定和取消绑定

  6. 事件流动(三个阶段)

  7. 字符串转换

  8. 正则表达式

本地存储

1、本地存储特性

  • 数据存储在用户浏览器中
  • 设置、读取方便、甚至页面刷新不丢失数据
  • 容量较大,sessionStorage和localStorage约 5M 左右

2、 localStorage

  • 生命周期永久生效,除非手动删除 否则关闭页面也会存在
  • 可以多窗口(页面)共享(同一浏览器可以共享)
  • 以键值对的形式存储使用

存储数据:

localStorage.setItem(key, value)

获取数据:

localStorage.getItem(key)

删除数据:

localStorage.removeItem(key)

清空数据:

localStorage.clear();

①存储复杂数据类型存储

  • 本地只能存储字符串,无法存储复杂数据类型.需要将复杂数据类型转换成JSON字符串,在存储到本地

  • JSON.stringify(复杂数据类型)

    将复杂数据转换成JSON字符串 存储 本地存储中

  • JSON.parse(JSON字符串)

    将JSON对象 时候使用

    <script>
      // 1 还是正常定义对象
         const obj = {
         name: '路飞',
         height: 100,
         weight: 200,
       };

       // 2 有好用的代码 ,可以帮我们快速把一个对象转成字符串
        const objStr = JSON.stringify(obj);

       // 3 本地存储 可以存储字符串类型的数据
        localStorage.setItem("obj",objStr);

      // 4 把本地存储的数据重新读取出来
        const newObjStr =  localStorage.getItem("obj");
        console.log(newObjStr);

       // 5 你能不能帮 我 重新把 这个 字符串 解析成原来的对象 
        const newObj = JSON.parse(newObjStr);
        console.log(newObj);
    </script>

3、 sessionStorage(了解)

  • 生命周期为关闭浏览器窗口(关闭页面后 数据就丢失)
  • 在同一个窗口(页面)下数据可以共享
  • 以键值对的形式存储使用
  • 用法跟localStorage 基本相同
<script>
      //本地存储的技术 sessionStorage  会话(打开页面到关闭页面之间过程 一次会话  ajax node)存储

      //  存数据
      sessionStorage.setItem("ss",123);
      //  取数据
      console.log(sessionStorage.getItem("ss"));
      // 删除一个
      sessionStorage.removeItem("ss")
      // 清空
      sessionStorage.clear();
    </script>

元素属性

1、固有属性:

标签天生自带的属性 比如class id title href src 等, 可以直接使用点语法操作

<body>
    <a id="nav" href="http://www.baidu.com">跳转</a >
    <script>
      // 获取 dom元素的固有属性  通过点语法来获取
      const a = document.querySelector('a');
      // 获取固有属性
       console.log(a.href);
       console.log(a.id);
      // 直接修改
       a.href="http://www.qq.com";
       a.id="top";
    </script>
  </body>

2、自定义属性:

  • 由程序员自己添加的属性,在DOM对象中找不到, 无法使用点语法操作,必须使用专门的API
  • getAttribute('属性名') // 获取自定义属性
  • setAttribute('属性名', '属性值') // 设置自定义属性
  • removeAttribute('属性名') // 删除自定义属性
<body>
    <a id="nav" hello="no" aa="bb" >跳转</a >

    <script>
      // 自定义属性 不能直接通过点语法来获取和设置
       console.log(a.hello);//错误的
       console.log( a.getAttribute("hello") );//正确
       console.log( a.getAttribute("aa") );//正确

      // 设置 setAttribute(key,value)
       a.setAttribute("hello","123");

      // 删除掉属性 removeAttribute(key)
       a.removeAttribute("hello");
    </script>
  </body>

3、 h5 建议的自定义属性

  • data-自定义属性 :

    传统的自定义属性没有专门的定义规则,开发者随意定值,不够规范,所以在html5中推出来了专门的data-自定义属性 在标签上一律以data-开头

    在DOM对象上一律以dataset对象方式获取

<body>
    <a data-index="0" id="nav" aa="bb" >跳转</a >

    <script>
      // 属性的时候 data-xxx 开头
      //  获取的时候  a.dataset.xxx
      //  设置  a.dataset.index = 3;

       console.log(a.dataset.index);//获取
       a.dataset.index = 3;//设置
    </script>
  </body>

注意:最强大是 (getAttribute) setAttribute removeAttribute ,这个方式,可以获取到任意的属性(固有属性和h5建议的自定义属性)

<a data-index="0" id="nav" href="http://www.baidu.com" hello="no" aa="bb" >跳转</a >
<script>
      console.log( a.getAttribute("data-index") );
      console.log( a.getAttribute("id") );
      console.log( a.getAttribute("href") );
      console.log( a.getAttribute("hello") );
      console.log( a.getAttribute("aa") );
</script>

高阶函数(了解)

  • 高阶函数可以被简单理解为函数的高级应用,JavaScript 中函数可以被当成【值】来对待,基于这个特性实现函数的高级应用。
  • 【值】就是 JavaScript 中的数据,如数值、字符串、布尔、对象等。
  • 高阶函数的应用 在react阶段(培训过程最后一个阶段) 大量的应用

①函数表达式

  • 函数也是【数据】

  • 把函数赋值给变量

  • 函数表达式和普通函数并无本质上的区别:

    ​ 普通函数的声明与调用无顺序限制,推荐做法先声明再调用

    ​ 函数表达式必须要先声明再调用

//函数表达式与普通函数本质上是一样的
let counter = function (x, y) {
    return x + y
}
//调用函数
let result = counter(5, 10)
console.log(result)
<body>
    <button>按钮</button>
    <script>
      //把一个函数 看成是个普通数据,应用在 参数 或者返回值  技术  
        function f1(callback) {
          callback();
        };
        function f2() {
          console.log("我就是高阶函数");
        };
        f1(f2);// f2 当成是一个普通的参数来使用(形参来使用)
       setInterval(f2,1000);// 把f2 当成是一个普通参数  传递给别人使用

        const btn=document.querySelector("button");
        btn.addEventListener("click",f2);// f2 也是高阶函数
    </script>
  </body>

②回调函数

  • 如果将函数 A 做为参数传递给函数 B 时,我们称函数 A 为回调函数
  • 简单理解: 当一个函数当做参数来传递给另外一个函数的时候,这个函数就是回调函数
  • 把函数当做另外一个函数的参数传递,这个函数就叫回调函数
  • 回调函数本质还是函数,只不过把它当成参数使用
  • 使用匿名函数做为回调函数比较常见

常见的使用场景:

function fn() {
    console.log('我是回调函数...')
}
//fn 传递给了setInterval , fn就是回调函数
setInterval(fn, 1000)
box.addEventListener('click', funnction(){
  coonsole.log('我也是回调函数')
 })

重绘和回流 -了解

1、浏览器是如何进行界面渲染的

  • 解析(Parser)HTML,生成DOM树(DOM Tree)
  • 同时解析(Parser) CSS,生成样式规则 (Style Rules)
  • 根据DOM树和样式规则,生成渲染树(Render Tree)
  • 进行布局 Layout(回流/重排):根据生成的渲染树,得到节点的几何信息(位置,大小)
  • 进行绘制 Painting(重绘): 根据计算和获取的信息进行整个页面的绘制
  • Display: 展示在页面上

1650117825216.png

2、重绘和回流(重排)

①回流(重排)

  • 当 Render Tree 中部分或者全部元素的尺寸、结构、布局等发生改变时,浏览器就会重新渲染部分或全部文档的过程称为 回流。

②重绘:

  • 由于节点(元素)的样式的改变并不影响它在文档流中的位置和文档布局时(比如:color、background-color、outline等), 称为重绘。

③重绘不一定引起回流,而回流一定会引起重绘。

④会导致回流(重排)的操作:简单理解影响到布局了,就会有回流

  • 页面的首次刷新
  • 浏览器的窗口大小发生改变
  • 元素的大小或位置发生改变
  • 改变字体的大小
  • 内容的变化(如:input框的输入,图片的大小)
  • 激活css伪类 (如::hover)
  • 脚本操作DOM(添加或者删除可见的DOM元素)

事件绑定和取消绑定

  • addEventListener 可以绑定多个同名事件
  • removeEventListener 可以取消对应的事件类型和事件处理函数
  • 无法取消 addEventListener 事件 对应的匿名函数
<body>
    <button>点击我 输出时间</button>
    <script>
       const btn = document.querySelector('button');

       // 普通函数
       function func() {
         console.log('2022-04-15 14:32:26');
       }
       function func2() {
         console.log("func2");
       }

       // 绑定事件
       btn.addEventListener('click', func);

       // addEventListener 可以绑定多个同名事件
       btn.addEventListener('click', func2);

       setTimeout(function () {
         // 取消这个事件绑定
         btn.removeEventListener('click', func);
       }, 5000);

		
       //无法取消 addEventListener 事件 对应的匿名函数 
       const btn=document.querySelector("button");
       btn.addEventListener("click",function () {
         console.log("你好");
       })
      //  想要取消 这个 输出你好的行为
      btn.removeEventListener("click",???);

    </script>
  </body>

事件流动(3个阶段)

  • 冒泡阶段(最重要)
  • 捕获阶段(addEventListener 第三个参数 true|false 来进行切换)
  • 目标阶段(了解)

1650119908857.png

<body>
    <div class="a">爷爷
      <div class="b">爸爸
        <div class="c">儿子</div>
      </div>
    </div>
    <script>
      const a=document.querySelector(".a");
      const b=document.querySelector(".b");
      const c=document.querySelector(".c");
      a.addEventListener("click",function () {
        console.log("爷爷");
      })
      b.addEventListener("click",function () {
        // 这个c 是最底层的元素 
        console.log("爸爸");
      })
      c.addEventListener("click",function () {
        // 这个c 是最底层的元素 
        console.log("儿子 目标阶段");
      })
    </script>
  </body>

字符串转换

1、转大写 toUpperCase()

let sm = 'afsmdkkl'
//  sm 大写
console.log(msg.toUpperCase());

2、转小写 toLowerCase()

let msg = 'HELLODFDFDFDFDFD';
// msg 转小写
console.log(msg.toLowerCase()); //转成小写

3、字符串转数组 str.split('')

str.split('') 按照什么来分割你的字符串变成数组

       // 字符串 转数组  // split("")   分割
       const str="abcdefg"; //=> ["a","b","c","d","e","f","g"]
       console.log(str.split(""));

       const str = 'a-b-c-d-e-f-g'; // ["a","b","c","d","e","f","g"]
       console.log(str.split('-'));

4、数组转字符串 join () concat()

concat()可以转字符,也可以合并(少用)

<script>
      // 数组 补充 常用
      // const arr = ['a', 'b', 'c', 'd'];

      // console.log(arr.join('')); // join 数组转字符串
      // console.log(arr.join('-')); // a-b-c-d 数组转字符串

      // 连接  数组和数组之间连接
       const arr1 = ['1', '2', '3'];
       const arr2 = ['a', 'b', 'c'];
      // 将两个数组合并成一个数组
       console.log(arr1.concat(arr2));

      //字符串也有一个 concat 也是表示合并
      const str1 = '123';
      const str2 = 'abc';
      // console.log(str1.concat(str2));// 很少用  有什么用? 当你的键盘 + 键坏  使用它 
      console.log(str1 + str2); // 更加简单好理解
    </script>

正则表达式

1、介绍

正则表达式在 JavaScript中的使用场景:

  • 例如验证表单:用户名表单只能输入英文字母、数字或者下划线, 昵称输入框中可以输入中文(匹配)
  • 比如用户名: /^[a-z0-9_-]{3,16}$/
  • 过滤掉页面内容中的一些敏感词(替换),或从字符串中获取我们想要的特定部分(提取)等 。

2、语法

JavaScript 中定义正则表达式的语法有两种,我们先学习其中比较简单的方法:

①定义正则表达式语法: / / 是正则表达式字面量

let 变量名 = /表达式/

let reg = /前端/

②判断是否有符合规则的字符串:

  • test() 方法 用来查看正则表达式与指定的字符串是否匹配

  • 如果正则表达式与指定的字符串匹配 ,返回true,否则false

regObj.test(被检测的字符串)

<script>
        //正则的作用 :寻找字符串 检测 这个字符串有没有我想要的文字
        const str = `金钱对你意味着什么?你有梦想吗?等等等等。一下子都让我陷入了沉思。真的需要好好的想想,然后写下来`;

        //判断这个字符串有没有梦想两个字
        //定义规则
        const reg = /梦想/   //两个反斜杠固定写法

        //规则和字符串 匹配 test
        console.log(reg.test(str));  //有就返回true  ,没有就返回 false
    </script>

3、 元字符

①边界符

  • 正则表达式中的边界符(位置符)用来提示字符所处的位置,主要有两个字符
  • 如果 ^ 和 $ 在一起,表示必须是精确匹配。
边界符说明
^表示匹配行首的文本(以谁开始)
$表示匹配行尾的文本(以谁结束)
<script>
    const str = `12金来`;
    // 你检测的字符串 必须要以 “梦” 开头  以 “想” 结尾
    // const reg = /^金来$/; // 只能匹配 "金来"
    // const reg = /^金来/; // `金来123`;  以'金来'为开头true
    const reg = /金来$/; //  `1234323金来`; 以'金来'为结尾true
    console.log(reg.test(str));
  </script>

②量词(修饰符)

  • 量词用来 设定某个模式出现的次数
  • 注意: 逗号左右两侧千万不要出现空格
量词说明
*重复0次或更多次
+重复1次或更多次
?重复0次或1次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n次到m次
<script>
      // const str="路飞";
      // const reg=/路飞/;
      // console.log(reg.test(str));

      //  *  表示 放在它前面那一个字符 可以出现0次或者多次
      // /^路*$/   => "",  路,路路,路路路
      // console.log(/^路*$/.test('')); // true
      // console.log(/^路*$/.test('路')); // true
      // console.log(/^路*$/.test('路路')); // true
      // console.log(/^路*$/.test('路路路')); // true

      // + 表示 放在它前面那一个字符 可以出现1次或者多次
      // console.log(/^路+$/.test(''));
      // console.log(/^路+$/.test('路'));
      // console.log(/^路+$/.test('路路'));
      // console.log(/^路+$/.test('路路路'));

      // ? 表示出现0次或者1次
      // console.log(/^路?$/.test(''));// true
      // console.log(/^路?$/.test('路')); // true
      // console.log(/^路?$/.test('路路')); // false
      // console.log(/^路?$/.test('路路路')); // false

      // {n} 放在它前面的那一个字符 出现n次
      // console.log(/^路{2}$/.test('')); // false
      // console.log(/^路{2}$/.test('路')); // false
      // console.log(/^路{2}$/.test('路路')); // true
      // console.log(/^路{2}$/.test('路路路')); // false

      // {n,} 放在它前面的字符 最少出现n次
      // console.log(/^路{2,}$/.test('')); // true
      // console.log(/^路{2,}$/.test('路')); // true
      // console.log(/^路{2,}$/.test('路路'));// true
      // console.log(/^路{2,}$/.test('路路路')); // true

      // {n,m} 放在它前面的字符 最少出现n次,最大是m次
      console.log(/^路{0,2}$/.test('')); // true
      console.log(/^路{0,2}$/.test('路'));  // true
      console.log(/^路{0,2}$/.test('路路')); // true
      console.log(/^路{0,2}$/.test('路路路'));  // false 

    </script>

③字符类(占位符)

Ⅰ、预定义:指的是某些常见模式的简写方式。

预定类说明
\d匹配0-9之间的任一数字,相当于[0-9]
\D匹配所有0-9以外的字符,相当于[ ^0-9]
\w匹配任意的字母、数字、下划线、相当于[A_Za-z0-9_]
\W除所有的字母、数字、下划线以外的字符、相当于[ ^A_Za-z0-9_]
\s匹配空格(包括换行符、制表符、空格符等),相当于[\t\r\n\v\f]
\S匹配非空格的字符,相当于[ ^\t\r\n\v\f]
<script>
      //  . 表示除了(换行符之外)任意字符
      // console.log(/路/.test('飞')); // false
      // console.log(/./.test('飞')); // true
      // console.log(/路.飞/.test('路大飞')); // true
      // console.log(/路.飞/.test('路小飞')); // true
      // console.log(/路.飞/.test('路中飞')); // true
      // console.log(/路.飞/.test('路不飞')); // true
      // console.log(/路.飞/.test('路飞')); // false
      // console.log(/路.飞/.test('路 飞')); // false

      // \d 表示数字
      // console.log(/\d/.test("路飞"));// false

      // console.log(/\d/.test("1路飞"));// true
      // console.log(/\d/.test("路3飞"));// true

      // \D 不是数字之外的任意1个字符
      // console.log(/\D/.test("123"));// false
      // console.log(/\D/.test("12a3"));// true
      // console.log(/\D/.test("12a3"));// true

      // \w  字母、数字、下划线
      // console.log(/\w/.test("123"));//  true
      // console.log(/\w/.test("%%"));//  false
      // console.log(/\w/.test("%1%"));//  true
      // console.log(/\w/.test("%a%"));//  true
      // console.log(/\w/.test("%_%"));//  true

      // \W  除去了 字母 、数字、下划线 之外字符
      // console.log(/\W/.test("123"));// false
      // console.log(/\W/.test("1%23"));// true

      // \s  匹配空格
      // console.log(/\s/.test("123"));// false
      // console.log(/\s/.test("1 23"));// true

      // \S 除了空格之外的字符
      // console.log(/\S/.test('123'));// true
      // console.log(/\S/.test(' '));// false
      // console.log(/\S/.test('   '));// false
    </script>

Ⅱ、[ ] 匹配字符集合

  • 后面的字符串只要包含 abc 中任意一个字符,都返回 true
  • 里面加上 ^ 取反符号 比如[^a-z] 匹配除了小写字母以外的字符
 <script>
      // [ab]  => 可以匹配 a  或者 b
      // console.log(/[ab]/.test('a'));// true
      // console.log(/[ab]/.test('b'));// true
      // console.log(/[abc]/.test('c'));// true

      // 表示 a-z 任意的一个字母
      // console.log(/[a-z]/.test('c'));// true
      // console.log(/[a-z]/.test('d'));// true
      // console.log(/[a-z]/.test('123'));// false
      // console.log(/[a-d]/.test('a'));// true
      // console.log(/[a-d]/.test('g'));// false

      // 0-9 任意的一个数字
      // console.log( /[0-9]/.test("1") );// true
      // console.log( /[0-9]/.test("2") );// true
      // console.log( /[0-9]/.test("0") );// true

      // A-Z
      // console.log(/[A-Z]/.test("a"));// false
      // console.log(/[A-Z]/.test("B"));// true

      // 同时满足 0-9a-zA-Z
      console.log(/[0-9a-zA-Z]/.test('1'));// true
      console.log(/[0-9a-zA-Z]/.test('a'));// true
      console.log(/[0-9a-zA-Z]/.test('A'));// true
      console.log(/[0-9a-zA-Z]/.test(' '));// false
    </script>

4、修饰符

  • 修饰符约束正则执行的某些细节行为,如是否区分大小写、是否支持多行匹配等

①替换 replace

字符串.replace(/正则表达式/, '替换的文本')

	<script>
      let str = '天文 今天请吃饭';

      // 吃饭 -> 上天台
      // "字符串".replace("待替换文字","替换什么样")    返回一个新的字符串
      let newStr = str.replace('吃饭', '上天台');
      console.log(newStr);
    </script>

②global 和 ignore

  • i 是单词 ignore 的缩写,正则匹配时字母不区分大小写
  • g 是单词 global 的缩写,匹配所有满足正则表达式的结果
	<script>
      let str = '天文 HEIGHT 180 ';

      // 将数字 替换成 *
      // str.replace("支持正则的方式来匹配文字","要替换成什么样");
      // str = str.replace(/\d+/, '*');// 找到一个或者多个数字,然后只替换成一个 * 
      // str = str.replace(/\d/g, '*');// g 属于正则中的 修饰符 表示 全局 global 
      // console.log(str);

      //  把英文字母替换成 * 
      // str=str.replace(/[a-zA-Z]/g,"*")
      str=str.replace(/[a-z]/gi,"*") // i ignore忽略  忽略大小写 
      console.log(str);
    </script>