断断续续看了十来天,终于看完了,还是学到些东西,这本书还是不错的,各方面都有涉及。

补充了下之前不完善的JS 知识

笔记一般只记必要的东西。‎

Table of Contents

1 JavaScript 基础

 

1.1 JavaScript 简介

 

1.1.1 Web 脚本编程基础

 
  1. 服务器端和客户端编程
  2. JavaScript 简介
  3. JavaScript 起源
  4. 浏览器的竞争
  5. <script> 标签
    • html5 script 标签不用指定属性
  6. DOM 简介
  7. W3C 和标准兼容
  8. window 和 document 对象
  9. 对象表示法
  10. 与用户交互
  11. document.write()
  12. 读取 document 对象的属性

1.2 创建简单的脚本

 

1.2.1 在 Web 页面里添加 JavaScript

  1. 把代码放在 script 标签内
  2. 通过 src 引用外部 js 文件

1.2.2 编写 JavaScript 语句

 
  1. 代码注释

    • 一般文件名后缀 .min.js 是去掉了空白和注释

1.2.3 变量

1.2.4 操作符

 
  1. 算术操作符
  2. 操作符优先级
  3. 对字符串使用操作符+

1.2.5 捕获鼠标事件

 
  1. onClick 事件处理器

    • HTML 里不区分大小写,所以属性名 onclick 小写也可以
  2. onMouseOver 和 onMouseOut 事件处理器
    • 使用 this 引用 HTML 元素

      <img src="1.png" onmouseover="this.src='2.png';">
      

1.3 使用函数

 

1.3.1 基本语法

1.3.2 调用函数

 
  1. 把 JavaScript 代码放置到页面的<head>区域

    • 函数放到文档开头,确保在调用前已经被定义
    • 函数如果多次定义,会使用最后的定义
  2. 给函数传递参数
  3. 多参数
  4. 从函数返回值
    • 如果没有 return, 会返回 undefined
  5. 匿名函数
    function sayHello() {
    alert("hello");
    } var sayHello = function() {
    alert("hello");
    }

1.4 函数的更多知识

 

1.4.1 变量作用域

 
  1. 使用 this 关键字
  2. 使用 let 和 const
    • 块级作用域 let
  3. 用 const 关键字声明变量

1.4.2 箭头函数

var sayHello = function() { alert("hello"); };

var sayHello = () => alert('hello');

var myFunc = x => alert(x);

myFunc = (x, y) => alert(x + y);

myFunc = (x, y, z) => {
let area = x*y + 5;
let boxes = area / z;
return boxes;
}

1.4.3 设置默认参数

1.5 DOM 对象和内置对象

 

1.5.1 与用户交互

 
  1. alert()

    • 术语“模态”的含义
    • confirm()

      var answer = confirm("are you ok?");
      
  2. prompt()
    var answer = prompt("what is your full name?");
    var answer = prompt("what is your full name?", "cai ji");

1.5.2 根据 id 选择元素

var myDiv = document.getElementById("div1");
  1. innerHTML 属性

    var myDivContents = document.getElementById("div1").innerHTML;
    document.getElementById("div1").innerHTML = "heheda";

1.5.3 访问浏览器历史记录

alert(history.length);
history.forward();
history.backward();
history.go(-3);
history.go(2);
history.go("baidu.com");

1.5.4 使用 location 对象

  • location 的属性 .href .protocol .host .hostnmae .port .pathname .search .hash
  1. 用 location 对象导航

    • 两种导航到新页面的方式
      location.href = “www.baidu.com”;
      location.replace(“www.baidu.com”);
      前者会保留旧页面在历史记录里
  2. 刷新页面
    • location.reload();
      避免使用缓存
      location.reload(true);
  3. 获取浏览器信息: navigator 对象
    • navigator 保留浏览器本身的数据
    • navigator 的属性
      .appName
      .appCodeName
      .appVersion
      .language
      .cookieEnabled
      .cpuClass
      .onLine
      .platform
      .plugins.length
    • navigator 返回的信息并不准确

1.5.5 日期和时间

 
  1. 创建具有当前日期和时间的 Date 对象

    var mydate = new Date();
    var year = mydate.getFullYear();
    var month = mydate.getMonth();
    var date = mydate.getDate();
    var day = mydate.getDay(); // 星期
    var hours = mydate.getHours();
    var minutes = mydate.getMinutes();
    var seconds = mydate.getSeconds();
  2. 创建具有指定日期和时间的 Date 对象
    var d1 = new Date("October 22, 1995 10:57:22");
    var d2 = new Date(95, 9, 22);
    var d3 = new Date(95, 9, 22, 10, 57, 0);
  3. 设置和编辑日期与时间
    var mydate = new Date();
    document.write(mydate.getDay());
    mydate.setDate(15);
    document.write(mydate.getDat());
    document.write(mydate.toDateString() + mydate.toTimeString());
  4. 利用 Math 对象简化运算
    • Math 的一些常见方法
      .ceil(n)
      .floor(n)
      .max(a, b, c, …)
      .min(a, b, c, …)
      .round(n) 四舍五入
      .random() 返回一个 0 到 1 的随机数
  5. 取整
  6. 获得最大值和最小值
  7. 生成随机数
    function myRand(range) {
    return Math.round(Math.random() * range);
    }
  8. 数字常数

    .E 自然常数,约为 2.718
    .LN2 2 的自然对数,约为 0.693
    .LN10 10 的自然对数,约为 2.302
    .LOG2E 以 2 为底 e 的对数,约为 1.442
    .LOG10E 以 10 为底 e 的对数,约为 0.434
    .PI 圆周率,约为 3.14159
    .SQRT12 2 的平方根的倒数,约为 0.707
    .SQRT2 2 的平方根,约为 1.414

  9. 关键字 with
    with (Math) {
    var myRand = random();
    var biggest = max(2, 3, 5);
    var height = round(11.22);
    }

2 JavaScript 编程

 

2.1 数字和字符串

 

2.1.1 数值

 
  1. 整数
  2. 浮点数
  3. 十六进制数,二进制数和八进制数

2.1.2 全局方法

 
  1. toString()

    var x = 13;
    alert(x.toString());
    alert(x.toString(16));
    (11).toString();
  2. toFixed()
    x.toFixed(0); // "13"
    x.toFixed(3); // "13.000"
  3. toExponential()
    var num = 666;
    num.toExponential(4); // "6.6600e+2"
    num.toExponential(6); // "6.660000e+2"

2.1.3 Number 对象

 
  1. Number.isNaN()

    • 当试图把一些非数值当做数值处理,却无法得到数值时,返回值就是 NaN
    • 示例

      Number.isNaN(3); //false
      Number.isNaN(0 / 0); // true
  2. Number.isInteger()
  3. Number.parseFloat() 和 Number.parseInt()
    • 解析的字符串首字符如果是一个数字,函数会持续解析到数字结束
    Number.parseFloat("21.4"); // 21.4
    Number.parseInt("12px",10); //
  4. 无穷大
    • 表示无穷的关键字
      Infinity
      -Infinity
    • isFinite()
      会把参数转换为数值,如果结果是 NaN,正无穷大或负无穷大,函数返回 false

2.1.4 Number() 函数

  • 该函数会尽可能返回一个对等的数值,如果失败,返回 NaN

2.1.5 布尔值

  • 如果布尔值被用作计算,true 为 1, false 为 0
  • JS 里被当做 false 的值
    1. 布尔值 false
    2. 未定义 undefined
    3. null
    4. 0
    5. NaN
    6. “”
  1. 非操作符

2.1.6 null(空) 和 undefined(未定义)

  • undefined 不是关键字,是未定义的全局变量

2.2 操作字符串

 

2.2.1 字符串

 
  1. length 属性
  2. 转义序列
  3. 字符串方法
    • concat
    • indexOf
    • lastIndexOf
    • repeat
      var inStr = “a b”;
      var outStr = inStr.repeat(3)
    • replace
    • split
    • substr
      string1.substr(4, 11);
      string1.substr(4);
    • toLowerCase
    • toUpperCase

2.2.2 模板字符串

var name = "aa";
var course = "bb";
var myString = `hell ${name}, welcome ${course}`;

2.3 数组

 

2.3.1 数组

  • JS 的数组能够存放任何数据类型
  1. 创建新数组

    • 数组也是一个对象
      var myArray = new Array();
      var myArray = [];
  2. 初始化数组
    var myArray = ['111', '22'];
    myArray[20] = "333e";
    myArray.length
  3. 数组的方法
    • concat
    • join
      把数组的全部元素连接在一起形成一个字符串
      var longDay = myArray.join(“-”);
    • toString
      相当于 myArray.join(“,”);
    • indexOf
      没有找到返回-1
    • lastIndexOf
    • slice
      可以为负数
    • sort
      把数组元素按字母顺序排列
    • splice
      myArray.splice(2, 1, “heheda”);
      指向索引为 2 的元素,删除 1 个元素,插入一个新元素,返回被删除的元素

2.3.2 如何遍历数组

 
  1. 使用 forEach()

    • 接受一个函数作为参数,并将函数依次应用与数组中的每个元素

      var myArray = [1, 2, 3, 4];
      function cube(x) {
      console.log(x*x*x);
      }
      myArray.forEach(cube);
    • forEach 不返回任何值
  2. 使用 map()
    • 和 forEach 的区别在于 map 会返回和最初数组相同大小的新数组

      var myArray = [1, 2, 3, 4];
      fucntion cube(x) {
      return (x*x*x);
      }
      var newArray = myArray.map(cube);
  3. 使用 for-of 访问数组
    var myArray = [2,3,4,5];
    functionn cube(x) {
    console.log(x*x*x);
    }
    for (var y of myArray) {
    cube(y);
    }

2.3.3 三点表示法

 
  1. 组合多个数组

    var array2 = [1, 2, ...array1, 3];
    
  2. 用参数的数组来调用函数
    var myArray = [1, 2, 3];
    alert(Math.min(...myArray));
  3. 收集数据
    var [a, b, ...c] = [1, 2, 3, 4, 5];
    

2.4 用 JavaScript 处理事件

  • mousedown 和 mouseup 在 click 前触发
  • ctrlKey shiftKey altKey metaKey

2.4.1 事件的类型

  • 一些常见事件
    1. 鼠标事件

      • onclick
      • oncontextmenu 鼠标右键弹出菜单
      • ondblclick
      • onmousedown
      • onmouseenter 鼠标移动到一个元素上时
      • onmouseleave
      • onmousemove 鼠标在一个元素上移动时
      • onmouseover 鼠标移动到一个元素或其子元素时
    2. 键盘事件
      • onkeydown 按下按键
      • onkeypress 按下并放开按键
      • onkeyup 释放按键
    3. DOM 对象事件
      • onerror 加载一个外部文件出现错误时
      • onload
      • onresize
      • onscroll 滚动了元素的滚动条
    4. 表单事件
      • onblur 元素失去焦点时
      • onchange
      • onfocus
      • onreset 重置表单
      • onselect
      • onsubmit

2.4.2 事件处理器

 
  1. 内联事件处理器

    <a href="http://www.baidu.com" onclick="alert('hello')">baidu</a>
    
  2. 作为 DOM 对象的属性的事件处理器
    // <a href="xxx" id="a1">aa</a>
    var myLink = document.getElementById('a1');
    myLink.onclick = function() {
    alert("hello");
    }
  3. 使用 addEventListener()
    var myLink = document.getElementById('a1');
    function sayHello() {
    alert("hello");
    }
    myLink.addEventListener('click', sayHello);
    myLink.removeEventListener('click', sayHello);
  4. 添加多个监听器
    • 使用 addEventListener 可以对一个事件添加多个函数

2.4.3 event 对象

myInputField = document.getElementById('a');
function myFunction(e) {
var kc = e.keyCode;
if (kc == 27) {
alert("xx");
}
}
myInputField.addEventListener('keydown', myFunction);
  • event 对象会自动传递给事件处理器
  • e.keyCode 表示按下了哪个键,27 表示 Escape
  1. 阻止默认行为

    var myLink = document.getElementById('a');
    function refuseAccess(e) {
    alert("wrong");
    e.preventDefault();
    }
    myLink.addEventListener('click', refuseAccess);
  2. 事件冒泡和捕获
    • 嵌套元素时,各层元素都有事件监听器时,执行顺序为冒泡
    • addEventListener 的第三个参数默认为 false,对于嵌套元素,从内向外执行,像冒泡一样.
  3. 关闭冒泡和捕获
    function myFunction(e) {
    var kc = e.keyCode;
    e.stopPropagation();
    if (kc == 27) {
    alert("1");
    }
    }

2.5 程序控制

 

2.5.1 条件语句

  • 和 C 差不多
  1. if() 语句
  2. 比较操作符
    • = 值和类型都相等
  3. 测试相等性
  4. if 进阶
  5. 测试多个条件
  6. switch 语句
  7. 逻辑操作符

2.5.2 循环和控制结构

 
  1. while
  2. do…while
  3. for
  4. 用 break 跳出循环
  5. 用 for…in 在对象集里循环
    var days = [1, 2, 3, 4];
    for (i in days) {
    alert(i);
    }

2.5.3 设置和使用定时器

  • 这两个方法都是 window 对象的方法
  1. setTimeout()

    function hide(elementId) {
    document.getElementById(elementId).style.display='none';
    }
    window.onload = function() {
    setTimtout("hide('id1')", 3000);
    }
    var timer1 = setTimeout("hide('id1')", 3000);
    clearTimeout(timer1);
  2. setInterval()
    var timer1 = setInterval("updateClock()", 1000);
    clearInterval(timer1);

3 理解 JavaScript 对象

 

3.1 面向对象编程

 

3.1.1 什么是面向对象编程

3.1.2 创建对象

 
  1. 创建直接实例

    myNewObject = new Object();
    myNewObject.showInfo = myFunc;
    myNewObject.info = 'this is a info';
  2. 使用关键字 this
    • this 在 HTML 内联 JS 里指此 HTML 元素,也可指向它所属的对象
  3. 匿名函数
    myNewObject.showInfo = function() {
    alert(this.info);
    }
  4. 使用构造函数
    • 如果要创建一个类的多个实例,可以创建构造函数

      function Car(Color, Year, Make, Miles) {
      this.color = Color;
      this.year = Year;
      this.make = Make;
      this.odometerReading = Miles;
      this.setOdometer = function(newMiles) {
      this.odometerReading = newMiles;
      }
      }
      var car1 = new Car("blue", "1998", "Ford", 77777);

3.1.3 用 prototype 扩展和继承对象

 
  1. 扩展对象

    function Person(personName) {
    this.name = personName;
    this.info = 'a';
    this.showInfo = function() {
    alert(this.info);
    }
    }
    var person1 = new Person('adam');
    var person2 = new Person('hehe');
    Person.prototype.sayHello = function() {
    alert(this.name + 'say hello');
    }
  2. 继承对象
    function Pet() {
    this.animal = "";
    }
    function Dog() {
    this.breed = "";
    }
    Dog.prototype = new Pet();

3.1.4 封装

function a(b, c, d) {
function kk(m, n) {
return m + n;
}
}

3.2 对象进阶

 

3.2.1 类

  • 新引入的 class 关键字和 constructor

    function Pet() {
    this.animal = "";
    this.setAnimal = function(newAnimal) {
    this.animal = newAnimal;
    }
    } class Pet {
    constructor(animal) {
    this.animal = animal;
    }
    setAnimal(newAnimal) {
    this.animal = newAnimal;
    }
    }
  1. 使用 getter 和 setter

    • 下划线前缀防止被重复调用
    class Pet {
    constructor(animal, name) {
    this.animal = animal;
    this.name = name;
    }
    get name() {
    return this._name;
    }
    set name(n) {
    n = n.charAt(0).toUpperCase() + n.slice(1).toLowerCase();
    this._name = n;
    }
    }
  2. Symbol
    • 创建的 Symbol 一定是唯一的传的参数只是说明

      var myname = Symbol('nickname');
      myCat[myname] = 'heheda';

3.2.2 对象继承

 
  1. 使用 extends 和 super

    class Dog extends Pet {
    constructor(name, breed) {
    super(name);
    this.breed = breed;
    }
    }

3.2.3 使用功能检测

if (document.getElementById) {
// do something
} else {
// other
}
  • typeof

    if (typeof document.getElementById == 'function') {
    // do something
    } else {
    // other
    }
  • typeof 的返回值 “number” “string” “boolean” “object” null undefined

3.3 DOM 脚本编程

 

3.3.1 DOM 节点

 
  1. 节点类型

    • nodeType 每种节点类型都有一个关联的数值,保存在属性 nodeType
      1. 元素
      2. 属性
      3. 文本
      4. CDATA 区域
      5. 实体引用
      6. 实体
      7. 执行指令
      8. HTML 注释
      9. 文档
      10. 文档类型(DTD)
      11. 文档片段
      12. 标签
    • childNodes 属性

      function countListItems() {
      var olElement = document.getElementById("toDoList");
      var count = 0;
      for (var i = 0; i < olElement.childNodes.length; i++) {
      if (olElement.chiodNodes[i].nodeType == 1)
      count++;
      }
      }
      window.onload = countListItems;
    • firstChild lastChild myElement.childNodes[0] myElement.childNodes[myElement.childNodes.length - 1];
    • parentNode 属性
    • nextSibling previousSibling
  2. 使用 nodeValue
  3. 使用 nodeName

3.3.2 用 getElementsByTagName() 选择元素

  • 基本用法
    var myDics = document.getElementsByTagName(“div”);
  • document.getElementsByClassName()

3.3.3 读取元素的属性

var myNode = document.getElementById("id1");
alert(myode.getAttribute("title"));

3.3.4 Mozilla 的 DOM 查看器

 
  1. 创建新节点

    • 创建步骤
      1. 创建新节点

        • createElement()
          var newDiv = document.createElement(“div”);
        • createTextNode()
          var newTextNode = document.createTextNode(“heheda”);
        • cloneNode()
          var myDiv = document.getElementById(“id1”);
          var newDiv = myDiv.cloneNode(true)
          true 代表会复制子节点一般需要修改 id 值
      2. 添加到 DOM 树
  2. 操作子节点
    • appendChild()
      var newText = document.createTextNode(“heheda”);
      var myDiv = document.getElementById(“id1”);
      myDiv.appendChild(newText);
    • insertBefore()
      var newPara = document.createElement(“p”);
      var myDiv = document.getElementById(“id1”);
      var para2 = document.getElementById(“para2”);
      myDiv.insertBefore(newPara, para2);
    • para.replaceChild(new, old)
    • removeChild()

      var myDiv = document.getElementById("id1");
      var myPara = document.getElementById("para2");
      var removedItem = myDiv.removeChild(myPara);
      alert(removedItem.getAttribute("id"));
  3. 编辑元素属性
    var myPara = document.getElementById("para1");
    myPara.setAttribute("title", "opening paragraph");
  4. 动态加载 JavaScript 文件
    var scr = document.createElement("script");
    scr.setAttribute("src", "newScript.js");
    document.head.appendChild(scr);

3.4 JSON 简介

 

3.4.1 JSON 是什么

  • 使用 JSON 表示法时,对象可以方便的转换为字符串来进行存储和转换
  • JSON 的真正优雅之处在于对象在 JSON 里以普通 JS 代码表示,因此可以利用 JS “自动” 解析功能
  1. JSON 语法

    var jsonObject = {
    "param1": "value1",
    "param2": "value2"
    }

3.4.2 访问 JSON 数据

  • eval 函数参数:
    1. 表达式
    2. 表达式字符串
    3. 字符串,其中是括号包含的 json
var x = eval(1*2);
eval("a=1;b=2;document.write(a+b);");
var user = '{"user":"admin", "location": "spain"}';
var myObject = eval('(' + user + ')');
  1. 使用直接浏览器 JSON 支持

    • 最新浏览器都对 JSON 提供直接支持,所以可以不用 eval 函数
    • 浏览器会创建一个名为 JSON 的 JS 对象来管理 JSON 的编码和解码,这个对象有两个方法,stringify() 和 parse()
  2. 使用 JSON.parse()
    var Mary = '{"h": 1.9, "age": 12}';
    var myObject = JSON.parse(Mary);
    var out = "";
    for (i in myObject) {
    out += i + " = " + myObject[i] + "\n";
    }
    alert(out);

3.4.3 JSON 的数据序列化

 
  1. 使用 JSON.stringify()

    var Dan = new Object();
    Dan.height = 1.85;
    Dan.age = 41;
    Dan.eyeColor = "blue";
    alert(JSON.stringify(Dan));

3.4.4 JSON 数据类型

  • 参数部分的规则
    1. 不能是 JS 保留的关键字
    2. 不能数字开头
    3. 特殊字符只能有下划线和美元符号
  • 值可以是以下数据类型
    1. 数值
    2. 字符串
    3. 布尔值
    4. 数组
    5. 对象
    6. null

3.4.5 模拟关联数组

  • 在 JS 中,object[“property”] 和 object.property 是对等的
var conference = {"a": "1", "b": "2"};
alert(conference["a"]);
alert(conference.a);

3.4.6 使用 JSON 创建对象

  • 用方括号表示数组 var categories = [“news”, “sports”];
  1. 属性

    var user = {“a”: 1, “b”: 2};
    var name = user.a;

  2. 方法
    var user = {
    "a": 1,
    "setName": function(newName) {
    this.username = newName;
    }
    }
    user.setName("heheda");
    • 当 JSON 作为通用数据交换格式时,值不能放函数
  3. 数组
    var bookListObject = {
    "a": [1, 2, 3]
    }
    var book = bookListObject.a[1];
  4. 对象

3.4.7 JSON 安全性

  • eval() 能执行任何 JS 命令,对于来源不明的 JSON 数据可能存在安全问题,安全的办法是使用内置 JSON 解析器,它只识别 JSON 文本而不会执行脚本命令

4 用 JavaScript 操作 Web 界面

 

4.1 HTML 与 JavaScript 编程

 

4.1.1 HTML5 的新标签

  • section
  • header
  • footer
  • nav
  • article
  • aside
  • figure
  • figcaption
  • summary

4.1.2 一些重要的新元素

 
  1. 用<video> 回放视频
  2. 用 canPlayType() 测试可用的格式
    • media.canPlayType(“video/webm”);
  3. 控制回放
    var myVideo = document.getElementById("vid1").play();
    var myVideo = document.getElementById("vid1").pause();
  4. 用<audio> 标签播放声音
    var soundElement = document.createElement('audio');
    soundElement.setAttibute('src', 'sound.ogg');
    soundElement.play();
    soundElement.currentTime = 12;
  5. 用<canvas> 在页面上绘图

4.1.3 拖放

4.1.4 本地存储

  • 两个对象
    localStorage
    sessionStorage

    if (typeof(Storage) != "undefined") {
    localStorage.setItem("key", "value");
    localStorage["key"] = "value";
    alert(localStorage.getItem("key"));
    alert(localStorage["key"]);
    }

4.1.5 操作本地文件

 
  1. 查看浏览器的支持情况

    • if (window.File && window.FileReader && window.FileList)

4.2 JavaScript 和 CSS

 

4.2.1 CSS 简介

 
  1. 从内容分离样式
  2. CSS 样式声明
  3. 在哪里保存样式声明

4.2.2 DOM 的 style 属性

4.2.3 用 className 访问类

4.2.4 DOM 的 styleSheets 对象

 
  1. 启用,禁用和切换样式表

4.3 CSS3 简介

5 与 JavaScript 工具相关的高级技术

 

5.1 读取和写入 cookie

 

5.1.1 什么是 cookie

 
  1. cookie 的局限性

5.1.2 使用 document.cookie 属性

 
  1. 数据的编码和解码

    var str = 'hehe (aa) .';
    document.write(str + '<br />' + escape(str));

5.1.3 cookie 组成

  • cookieName 和 cookieValue
  • domain 用于指明 cookie 属于哪个域,如果为 a.com ,则 b.a.com 可以访问这个 cookie
  • path 指定可以使用 cookie 的路径
  • secure 表明浏览器把 cookie 发给服务器时,是否要使用 SSL 标准
  • expires 以 UTC 标准的过期时间

5.1.4 编写 cookie

var cookieDate = new Date ( 2018, 05, 15 );
var user = "heheda";
document.cookie = "username=" + escape(user) + ";expires=" + cookieDate.toUTCString();

5.1.5 编写一个函数来写 cookie

5.1.6 读取 cookie

5.1.7 删除 cookie

  • 把一个 cookie 的失效日期设置为今天之前即可

5.1.8 在一个 cookie 里设置多个值

5.2 用正则表达式匹配模式

 

5.2.1 创建正则表达式

  • JS 里两种生成正则表达式的方法
  1. 使用正则表达式字符串字面量

    • var myRegExp = FooBar;

      var myRepExp = /FooBar/;
      if (document.getElementById("txt").value.search(myRegExp) == -1) {
      alert("not found");
      } else {
      alert("The string occurs");
      }
    • 正则表达式修饰符

    i 不区分大小写 g 全局匹配,而不是找到第一个匹配就停止 m 多行匹配 var aa = /stupid/gi;

    • 方括号[]指定范围
    • 处理特殊字符的快捷方式,元字符 \w 等
    • 正则表达式限定符 + 重复次数等
  2. 使用 JS 的 RegExp 对象
    var myPattern = new RegExp("Foobar");
    var result = /boy/.exec("heheda");
    console.log(result[0]);
    myPattern.test("this is a test");
    var result = myPattern.exec(myString);
  3. 对正则表达式使用字符串方法
    • match search replace split

      var myString = "heheda dada";
      var outString = myString.match(/\d+/g); var myString = "1 ;2 3;4 5";
      var outString = myString.split(/\s*;\s*/); myString.replace(/stupid/ig, "cupid");
    • 用一个函数作为 replace() 的参数

      function CtoF(match) {
      return ((match * 9) / 5) + 32;
      }
      var myString = "for 1 and 5";
      myString = myString.replace(/\d+/g, CtoF);

5.3 理解并使用闭包

 

5.3.1 回顾作用域的相关知识

5.3.2 从一个函数返回另一个函数

5.3.3 实现闭包

  • 闭包是访问父作用域的一个函数,即便是在该作用域已经结束之后.
  1. 传递参数

    function sayHi(visitor) {
    let msg = visitor + ' says: hello world!';
    return function logMessage() {
    console.log(msg);
    }
    }
  2. 编辑一个闭包变量
    function sayHi(visitor) {
    let msg = visitor + ' says: ';
    return function logMessage(extra) {
    msg = msg + extra;
    console.log(msg);
    }
    }
    var helloPhil = sayHi("Phil");
    var helloSue = sayHi("Sue");
  3. 闭包和变量
    • 闭包也允许将一些数据和操作这些数据的函数关联起来
    function sayHi(visitor) {
    let msg = visitor + ' says: hello world';
    return function logMessage() {
    console.log(msg);
    }
    }
    var helloPhil = sayHi("Phil");
    helloPhil()
    • 对象提供了灵活性,但是到处都可以修改,容易出现错误.

5.4 用模块组织代码

 

5.4.1 为何使用模块

 
  1. 模块使得代码更容易维护
  2. 模块帮助复用代码
  3. 模块有助于整齐的全局作用域

5.4.2 模块基础知识

  • 一个文件一个模块,模块中的内容对外部不可见.
  • 模块是通过 CORS 跨源资源共享来获取的
  1. 如何包含一个 JS 模块

    • JS 要求对模块使用相对路径

      <head>
      <script type="module" src="./myModule.js"></script>
      </head>
  2. nomodule 关键字

    <script nomodule src=“fallback-option.js”></script>

5.4.3 导出

function fun1(x) {
alert(x);
}
export func1;
  1. 一个简单的示例模块

    function convertCtoF(c) {
    return (c*1.8) + 32;
    }
    function convertFtoC(c) {
    return (f-32) / 1.8;
    }
    export {convertCtoF, convertFtoC} export var a = "something";
    export function func1() {console.log("hello");};
  2. 如何在导出时重命名
    export var distance = arr[1];
    export {arr as routeProperties };
  3. 具名的和默认的导出
    function mmToInches(d) {
    return d/25.4;
    }
    export default mmToInches;

5.4.4 导入

import {convertCtoF, convertFtoC} from './tempConvert.js';
  1. 默认导入

    function mmToInches(d) {
    return d/25.4;
    }
    export default mmToInches; import toInches from './convert.js';
    console.log(toInches(100));
  2. 如何在导入的过程中重命名

    import {convertCtoF as cF } from ’./tempConvert.js’;

  3. 如何把一个模块导入为一个对象

    import * as temps from ’./tempConvert.js’;

6 专业技能

 

6.1 良好的编程习惯

 

6.1.1 避免过度使用 JS

6.1.2 编写易读和易维护的代码

 
  1. 明智地使用注释

    • 代码较长地函数或对象地简要说明
    • 对易混淆或易误解代码地注释
    • 原作者自己地技巧或经验
    • 关于代码修改地注释
  2. 使用适当地文件名称,属性名称和方法名称
  3. 尽量复用代码
  4. 不要假设

6.1.3 平稳退化

6.1.4 渐进增强

 
  1. 分离样式,内容和代码

6.1.5 代码分离的 JS

 
  1. 脱离 HTML
  2. 仅把 JS 作为性能增强手段

6.1.6 功能检测

6.1.7 妥善处理错误

 
  1. 使用 try 和 catch

6.2 调试代码

 

6.2.1 调试简介

 
  1. 错误类型

    • 语法错误
    • 运行时错误
    • 逻辑错误
  2. 选择程序员地编辑器
  3. 用 alert() 进行简单调试

6.2.2 更高级地调试

 
  1. 控制台

    • console
      console.log()
      console.warn()
      console.info()
      console.error()
  2. 分组消息
    • console.group() console.groupEnd() 之间的 log 信息会分组显示
  3. 用断点停止代码执行
  4. 条件性断点
  5. 从代码中启动调试器
    • debugger;
  6. 验证 JS

6.3 继续深入学习

 

6.3.1 为什么要使用库

6.3.2 库能做什么

  • 一般库的功能
    1. 封装 DOM 方法
    2. 动画
    3. 拖放
    4. Ajax

6.3.3 一些常见的库和框架

 
  1. Prototype 框架

    • 优势在于 DOM 扩展和 Ajax 处理
  2. Dojo
    • 能够简化创建程序和用户界面的工作
  3. React
    • 主要用于构建用户界面
  4. Node.js
    • 允许在服务器上编写和执行 JS
  5. jQuery
    • 简化了 HTML 文档转换,事件处理,动画等多种工作

6.3.4 jQuery 入门

 
  1. 在页面里引用 jQuery

  2. jQuery 的$(document).ready 处理器
    • 类似于 window.onload

      $(document).ready(function() {
      // code
      });
  3. 选择页面元素
    • $(“”) 即可选择 HTML 元素
      $(“span”)
      $(“#elem”) //id
      $(“.classname”)
      $(“div#elem”)
      $(“ul li a.menu”) / 类为 menu,且嵌套在列表项里的锚点
      $(“p > span”) /
      p 的直接子元素 span
      $(“input[type=password]”)
      $(“p:first”)
      $(“p:even”) // 全部偶数段落
      $(“:header”) //标题元素
      $(“:button”)
      $(“:radio”)
      $(“:checkbox”)
      $(“:checked”)
  4. 操作 HTML 内容
    • html() 类似于 innerHTML

      var htmlContent = $("#elem").html();
      $("#elem").html("<p>here </p>");
    • text() 只是获取文本内容

        var textContent = $("#elem").text()
      $("#elem").append("<p>hehe </p>");
    • attr()

      var title = $("#elem").attr("title");
      $("elem").attr("title", "new title");
  5. 显示和隐藏元素
    • JS 中
      document.getElementById(“elem”).style.visibility = “visible”;
    • show()

      $("div").show();
      $("#elem").show("fast", function() {
      // 操作
      });
    • hide()

      $("#elem").hide("slow", function() {
      // 隐藏之后的操作
      });
    • toggle()

      $("#elem").toggle(1000, function() {
      // xx
      });
  6. 命令链
    • jQuery 大多数方法都返回一个 jQuery 对象

      $("#elem").fadeOut().fadeIn();
      $("#elem").text("Hello ").fadeOut().fadeIn();
  7. 处理事件
    • 常用方法

      $("a").click(function() {
      //
      });
      function hello() {
      alert("hello");
      }
      $("a").click(hello);
      $("a").on("click", hello);
    • 常见事件 blur focus hover keypress change mousemove resize scroll submit select

6.3.5 The jQuery UI

  • jQuery UI 提供了高级的效果和可以主题化的挂件
  1. jQuery UI 是什么

    $("#datepicker").datepicker();
    

6.3.6 Ajax 简介

 
  1. Ajax 入门
  2. XMLHttpRequest 对象
    • XMLHttpRequest 能够建立与服务器的连接,发送 http 请求而不需要加载相应的页面
    • 默认 xhr 只能对同域发起请求,除非服务端做了设置
  3. 创建 request 对象
    • var request = new XMLHttpRequest();
  4. 方法和属性
    • 属性
      onreadystatechage
      readyState
      responseText
      responseXML
      status
      statusText
    • 方法
      abort()
      getAllResponseHeaders()
      getResponseHeader(x)
      open(’method’,’URL’,’a’) // a 默认为 true,表示异步
      send(content)
      setRequestHeader(’x’,’y’)
  5. 与服务器通信
  6. 在服务器端发生了什么
  7. 处理服务器响应
  8. 还有更容易的方法,不是吗?

6.3.7 用 jQuery 实现 Ajax

  • load()

    $(function() {
    $("#elem").load("newContent.html");
    }); $(function() {
    $("#elem").load("newContent.html #info");
    });
  • get() post()

    $.get("serverScript.php",
    {param1: "value1", param2: "value2"},
    function(data) {
    alert("server response: " + data);
    });
  • ajax()
  • 对表单数据进行序列化 var formdata = $(’#form1’).serialize();

6.3.8 Node.js 简介

  • Node.js 使用 V8 JavaScript 引擎
  1. 使用一种非阻塞的代码模式

Author: cat

Created: 2019-11-13 Wed 22:40

JavaScript入门经典(第7版)读书笔记的更多相关文章

  1. 《ECMAScript6标准入门》第三版--读书笔记

    2015年6月,ECMAScript 6正式通过,成为国际标准.尽管在目前的工作中还没有使用ES6,但是每项新技术出来总是忍不住想尝尝鲜,想知道ES6能为前端开发带来哪些变化?对自己的工作有哪些方面可 ...

  2. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  3. javascript权威指南第6版学习笔记

    javascript权威指南第6版学习笔记 javascript数组.函数是特殊对象 看一点少一点. 3.1.4 hello.js内容是 var x=.3-.2;var y=.2-.1 console ...

  4. 《c#入门经典第五版》简介及pdf电子书网盘下载地址(收藏)

    <C#入门经典(第5版)>全面讲解C# 2010和.net架构编程知识,为您编写卓越C# 2010程序奠定坚实基础.C#入门经典系列是屡获殊荣的C#名著和超级畅销书.最新版的<C#入 ...

  5. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  6. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  7. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  8. JavaScript权威指南(第6版)(中文版)笔记

      JavaScript权威指南(第6版)(中文版)笔记      

  9. c语言入门经典(第5版)

    文章转载:http://mrcaoyc.blog.163.com/blog/static/23939201520159135915734 文件大小:126MB 文件格式:PDF    [点击下载] C ...

  10. HTML与CSS入门经典(第9版)试读 附随书源码 pdf扫描版​

    HTML与CSS入门经典(第9版)是经典畅销图书<HTML与CSS入门经典>的最新版本,与过去的版本相同,本书采用直观.循序渐进的方法,为读者讲解使用HTML5与CSS3设计.创建并维护世 ...

随机推荐

  1. SDN网络IPv6组播机制支持实时视频业务海量用户扩展

    以 OpenFlow 技术为核心的软件定义网络(SDN)框架具有集中控制的功能能够自己感知网络拓扑的变化,在细粒度的路径选择.接入控制.负载均衡方面有着天然的优势,为 IPv6 组播功能的实现提供了好 ...

  2. LeetCode_232-Implement Queue using Stacks

    题意是使用栈实现队列:队列是先进先出,后进后出. class MyQueue { public: /** Initialize your data structure here. */ MyQueue ...

  3. 【DP合集】背包 bound

    N 种物品,第 i 种物品有 s i 个,单个重量为 w i ,单个价值为 v i .现有一个限重为 W 的背包,求能容 纳的物品的最大总价值. Input 输入第一行二个整数 N , W ( N ≤ ...

  4. 安装Elasticsearch可视化插件

    背景 项目中使用Elasticsearch , 最开始14年使用的时候需要es自己安装插件才能通过web页面查看数据情况,目前新版本的ES安装插件很费劲,通过搜索发现目前谷歌浏览器就有这个插件,这里简 ...

  5. hydra暴力破解

    hydra,是一个非常好用的暴力破解工具,而且名字也很cool. 下面是官网上的介绍: AFP, Cisco AAA, Cisco auth, Cisco enable, CVS, Firebird, ...

  6. https协议分析

    一:什么是HTTPS https全称是超文本传输安全协议,https利用SSL/TLS加密数据包来进行http通信.https开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性. ...

  7. luogu P4035 [JSOI2008]球形空间产生器

    [返回模拟退火略解] 题目描述 今有 n+1n+1n+1 个 nnn 维的点,它们都在一个球上.求它们所在球的球心. Solution 4035\text{Solution 4035}Solution ...

  8. Vue路由守卫(跳转页面置顶的处理方)

    在用Vue 框架开发时,在电脑调试没有任何问题,但是用手机调试时会发现页面跳转的不对.就是跳转时页面展示的滑动位置不对,会保留上次跳转页面时的跳转位置.因此需要对页面的路由跳转进行优化,需要用到Vue ...

  9. C#数据转换

    C 货币 2.5.ToString("C") ¥2.50 D 十进制数 25.ToString("D5") 00025 E 科学型 25000.ToString ...

  10. vue-cli2、vue-cli3脚手架详细讲解

    前言: vue脚手架指的是vue-cli它是vue官方提供的一个快速构建单页面(SPA)环境配置的工具,cli 就是(command-line-interface  ) 命令行界面 .vue-cli是 ...