E-COM-NET

  • 首页
  • 在线工具
  • Layui镜像站
  • SUI文档
  • 联系我们
m0_63077733
m0_63077733

JavaScript学习笔记--【黑马程序员】

  • 学习

目录

一、编程语言

1.1 编程

 1.2 计算机语言

 1.3 编程语言

1.4 翻译器 

 1.5 编程语言和标记语言区别

 总结

二、计算机基础

2.1 计算机组成

2.2.数据存储 

2.3 数据存储单位 

2.4 程序运行 

三、HTML中的JavaScript

1.元素

1.1 标签的位置

 1.2 延迟脚本--defer

1.3 异步脚本--async

 1.4 XHML中的变化

2.嵌入代码和外部文件

 3.元素

 4.小结

 四、初始JavaScript

1.1 Javascript是什么

1.2JavaScript的作用 

1.3 HTML/CSS/JS的关系 

1.4 浏览器执行JS简介 

1.5 JS组成

​编辑 1.6 JS初体验

1.6.1 行内式JS

1.6.2 内嵌JS

1.6.3 外部JS文件 

四、JavaScript注释

1.单行注释

2.多行注释 

五、Javascript输入输出语句

 六、变量

1.变量的概述

1.1 什么是变量

1.2 变量在内存中的存储

2.变量的使用

2.1 声明变量

2.2.赋值

2.3 变量的初始化

2.4 【案例】变量的使用

3.变量语法扩展

3.1 更新变量

3.2 同时声明多个变量

 3.3 声明变量特殊情况

4.变量命名规范

5.标识符

6.var 、 let、 const

6.1 var关键字--声明的是函数作用域

6.2 let关键字--声明的是块作用域

6.3 const声明

7.交换变量案例

七、数据类型

1.数据类型简介

1.1 为什么需要数据类型

1.2 变量的数据类型

1.3 数据类型的分类

2.简单数据类型(Number,String,Boolean,Undefined,Null)

2.1 数字型--Number

​编辑 2.2 字符串类型--String

 2.3 布尔值--Boolean

 2.4 Undefined和Null

3.获取变量数据类型(Object)

3.1 获取检测变量的数据类型--typeof 

3.2 字面量

4.数据类型转换

4.1 什么是数据类型转换

4.2 转换为字符串

4.3 转换为数字型(重点) 

​编辑

【案例】计算年龄

【简单加法器】

 4.4转换为布尔值

八、标识符,关键字,保留字

1.标识符

2.关键字

3.保留字

 九、JavaScript 运算符

1.运算符

2.算数运算符

2.1 算术运算符概述

 2.2 浮点数的精度问题

2.3 表达式和返回值

3.递增和递减运算符(一元运算符)

3.1 递增和递减运算符概述

3.2 递增运算符

  3.3 前置递增和后置递增小结

4.比较运算符

4.1 比较运算符概述

4.2 小结

5.逻辑运算符

5.1 逻辑运算符概述

5.2 逻辑与 &&

5.3 逻辑或 ||

5.4 逻辑非 ! 

5.5 短路运算(逻辑中断)

6.赋值运算符

7.运算符优先级

 8.练习

十、JavaScript 流程控制--分支

1.流程控制

2.顺序流程控制

3.分支流程控制if语句

3.1 分支结构

3.2 if语句

  3.3 if else语句(双分支语句)

3.4 if else if语句(多分支语句)

4.三元表达式

4.1 语法结构

 4.2 执行思路

5.分支流程控制switch语句

5.1 语法结构

5.2 switch 语句和 if else if 语句的区别

十一、JavaScript 流程控制--循环

1.循环

2.for循环

2.1 语法结构

2.2 for循环重复相同的代码

2.3 for循环重复不相同的代码

3.双重for循环

3.1 双重for循环概述

 3.2 双重for循环语法

3.5 for循环小结

4.while循环

5.do while 循环

6.continue break

6.1 continue关键字

6.2 break关键字

十二、数组

1.数组的概念

2.创建数组

2.1 利用new创建数组--new Array()

 2.2 利用数组字面量创建数组

 2.4 数组元素的类型

3.获取数组中的元素

3.1 数组的索引

4.遍历数组

 4.1 数组的长度

​编辑

5.数组中新增元素

5.1 通过修改length长度新增数组元素

5.2 通过修改数组索引新增数组元素

【案例-数组新增元素】

【案例-筛选数组】

6.数组案例

十二、JavaScript 函数

1.函数的概念

2.函数的使用

2.1 声明函数

2.2 调用函数

2.3 函数的封装

3.函数的参数

3.1形参和实参

3.2 函数参数的传递过程

 3.3 函数形参和实参个数不匹配问题

3.4 小结

4.函数的返回值

4.1 return 语句

4.2 return终止函数

​编辑 4.3 return  的返回值

4.4 函数没有return 返回 undefined

4.5 break,continue,return 的区别

4.6 return 注意事项

5.arguments(伪数组)的使用

6.函数案例

【案例--利用函数封装方法,翻转任意一个数组】

【案例--利用函数封装方法,队数组排序--冒泡排序】

【案例--判断闰年】

函数可以调用另外一个函数

【案例-用户输入年份,输出当前年份2月份的天数】

7.函数的两种声明方式

7.1 自定义函数方式(命名函数)

7.2 函数表达式方式(匿名函数)

十三、Javascript 作用域

1.作用域

2.变量的作用域

2.1 全局变量

2.2 局部变量

2.3 Javascript没有块级作用域

3.作用域链

​编辑

【案例】

十四、预解析

1.预解析

2.变量预解析和函数预解析

3.预解析案例

十五、Javascript 对象

1.对象

1.1 什么是对象

1.2 为什么需要对象

2.创建对象的三种方式

2.1 利用字面量创建对象

​编辑

2.2 利用new Object 创建对象

2.3 利用构造函数创建对象

​编辑

2.4 构造函数和对象

3.new关键字

4.遍历对象属性(for...in)--for( var k in obj) 

十六、JavaScript 内置对象

1.内置对象

​编辑

2.查文档

2.1 MDN

2.2 如何学习对象中的方法

3.Math对象

3.1 Math概述

3.2 随机数方法random()--[0,1)

4.日期对象

4.1 Date概述

 4.2 Date()方法的使用

4.3 日期格式化

4.4 获取日期的总的毫秒形式

【案例:倒计时效果】

5.数组对象

5.1 数组对象的创建

5.2 检测是否为数组----instanceof、Array.isArray()

 5.3 添加删除数组元素的方法

5.4 数组排序

5.5 数组索引方法

5.6 数组转换为字符串

5.7 其他

6.字符串对象

6.1 基本包装类型

6.2 字符串的不可变

6.3 根据字符返回位置

6.4 根据位置返回字符

6.5 字符串操作方法

6.6replace()方法

6.7 split()方法

6.8 其他

十七、JavaScript 简单类型与复杂类型

1.简单类型和复杂类型

​编辑

2.堆和栈

3.简单类型的内存分配

​编辑

4.复杂类型的内存分配

​编辑

5.简单类型传参

6.复杂类型传参

十八、Web APIs

1. Web APIs 和 JS 基础关联性

1.1 JS的组成

 1.2 JS基础阶段以及Web APIs阶段

2.API(接口)和Web API(浏览器接口)

2.3 API和Web API总结

 2.4 什么是DOM

2.5 DOM树

2.6 DOM对象

十九、DOM元素的获取

1.根据CSS选择器来获取DOM元素(必须是字符串,也就是必须加引号;如果是类选择器前面加“.";如果是id选择器前面加"#")

        1.1 选择匹配的第一个元素--document.querySelector('CSS选择器')

         1.2 选择匹配的多个元素(得到的是一个伪数组)--document.querySelectorAll('CSS选择器')

 2.其他获取DOM元素方法

        根据id获取一个元素-->document.getElementById('nav')

        根据标签获取一类元素 获取页面 所有div(返回的是伪数组) ---->document.getElementsByTagName('div')

        根据类名获取元素 获取页面 所有类名为w的 --->document.getElementByClassName('w')

 获取某一个元素(父元素)内部所有指定标签的子元素--element(父元素).getElementsByTagName('标签名')

3. 获取HTML和Body标签

二十、事件基础

1. 事件基础

2.事件三要素

1. 事件源 (谁)2. 事件类型 (什么事件)3. 事件处理程序 (做啥)

3.执行事件的步骤

1. 获取事件源2. 注册事件(绑定事件)3. 添加事件处理程序(采取函数赋值形式)

4.常见的鼠标事件

二十一、设置/修改DOM元素内容

1. document.write()方法

2.对象.innerText属性

3.对象.innerHTML属性

4.三种方法的总结和区别

​编辑

5.常见元素的属性操作

 6.案例

 【分时显示不同图片,显示不同问候语】

 7.表单元素的属性操作

【案例-- 仿京东显示密码】

  8. 样式属性操作

【 案例: 淘宝点击关闭二维码】

 【案例: 循环精灵图背景】

 【案例:显示隐藏文本框内容】

【案例: 密码框格式提示错误信息】

 9.操作元素总结

10.排他思想

 【案例:百度换肤】

 【案例:表格隔行变色】

 【案例:表单全选取消全选案例】

 11.自定义属性的操作

1. 获取属性值

2.设置属性值

3.移除属性

 12.H5自定义属性--只能通过getAttriubute

12.1 设置H5自定义属性----data-index="2"/div.setAttribute('data-time', 20)

12.2 获取H5自定义属性 ---element.getAttrubute('data-index')/element.dataset.index/element.dataset['index']

二十二、节点操作

1.为什么学节点操作

2.节点概述

3.节点层级

3.1 父级节点--node.parentNode

3.2 子节点(总结:无论用什么都是“父节点.children【】”)

3.3 兄弟节点

  3.4 创建节点

4.4 添加节点

4.5 删除节点

4.6 复制节点(克隆节点)--node.cloneNode(false)-->不复制内容/node.cloneNode(true)-->复制内容

4.7 三种动态创建元素区别

二十二、DOM重点核心

1.创建

 1. document.write2. innerHTML3. createElement

2.增

1. appendChild2. insertBefore

3.删

1.. removeChild

4.改

1. 修改元素属性: src、href、title等2. 修改普通元素内容: innerHTML 、innerText3. 修改表单元素: value、type、disabled等4. 修改元素样式: style、className

5.查

6.属性操作

7.事件操作

 7.1 注册事件两种方式

二十三、PC端网页特效

 1. 元素偏移量offset系列

1.1 offset概述

​编辑

1.2 offset 与 style 区别

2.元素可视区client系列

3.元素滚动scroll系列

3.1  元素scroll系列属性

3.2 页面被卷去的头部

3.3 页面被卷去的头部兼容性解决方案 

4.offset、client、scroll总结

5.mouseenter 和mouseover的区别

6.动画函数封装

6.1 动画实现原理

 6.2 动画函数简单封装

6.3 动画函数给不同元素记录不同定时器

6.4 缓动效果原理

6.5 动画函数多个目标值之间移动

6.6 动画函数添加回调函数

 6.7 动画函数封装到单独JS文件里面

6.常见网页特效案例

【案例:网页轮播图】

6.1 节流阈

二十四、事件高级

1.注册事件(绑定事件)

1.1 注册事件概述:传统方式   VS  方法监听注册事件 

1.2 addEventListener事件监听方式

 1.3 attachEvent 注册事件 事件监听方式

注意点:

1.4 注册事件兼容性解决方案

2删除事件(解绑事件)

2.1 删除事件的方式

2.2 删除事件兼容性解决方案

3.DOM事件流

4.事件对象

4.1 什么是事件对象

4.2 事件对象的使用语法

4.3 事件对象的兼容性方案

4.4 事件对象的常见属性和方法

5.阻止事件冒泡

5.1 阻止事件冒泡的两种方式

5.2 阻止事件冒泡的兼容性解决方案

6.事件委托(代理,委派)

7.常用的鼠标事件

7.1 常用的鼠标事件

7.2 鼠标事件对象

8.常用的键盘事件

8.1 常用键盘事件

 8.2 键盘事件对象

 8.3 ASCII 表


一、编程语言

1.1 编程

JavaScript学习笔记--【黑马程序员】_第1张图片

 1.2 计算机语言

JavaScript学习笔记--【黑马程序员】_第2张图片

 1.3 编程语言

JavaScript学习笔记--【黑马程序员】_第3张图片

1.4 翻译器 

JavaScript学习笔记--【黑马程序员】_第4张图片

 1.5 编程语言和标记语言区别

 总结

JavaScript学习笔记--【黑马程序员】_第5张图片

二、计算机基础

2.1 计算机组成

JavaScript学习笔记--【黑马程序员】_第6张图片

2.2.数据存储 

JavaScript学习笔记--【黑马程序员】_第7张图片

2.3 数据存储单位 

JavaScript学习笔记--【黑马程序员】_第8张图片

2.4 程序运行 

JavaScript学习笔记--【黑马程序员】_第9张图片

三、HTML中的JavaScript

1.元素

JavaScript学习笔记--【黑马程序员】_第10张图片

 JavaScript学习笔记--【黑马程序员】_第11张图片

1.1 标签的位置

 script元素应该在body里面,这样可以加快打开速度JavaScript学习笔记--【黑马程序员】_第12张图片

 1.2 延迟脚本--defer

立即下载,但是先将整个页面解析完,才开始运行。 

在XHTML文档中,要把defer属性设置为defer="defer"

JavaScript学习笔记--【黑马程序员】_第13张图片

1.3 异步脚本--async

在XHTML文档中,要把async属性设置为async="async"

JavaScript学习笔记--【黑马程序员】_第14张图片

 1.4 XHML中的变化

XHTML中使用JavaScript必须指定type属性且值为text/javascript

JavaScript学习笔记--【黑马程序员】_第15张图片

 JavaScript学习笔记--【黑马程序员】_第16张图片

 JavaScript学习笔记--【黑马程序员】_第17张图片

2.嵌入代码和外部文件

JavaScript学习笔记--【黑马程序员】_第18张图片

 3.

这个元素可以包含能够出现在文档中的任何HTML元素--->script>元素除外

JavaScript学习笔记--【黑马程序员】_第19张图片

 4.小结

JavaScript学习笔记--【黑马程序员】_第20张图片

 四、初始JavaScript

1.1 Javascript是什么

JavaScript学习笔记--【黑马程序员】_第21张图片

JavaScript学习笔记--【黑马程序员】_第22张图片

1.2JavaScript的作用 

JavaScript学习笔记--【黑马程序员】_第23张图片

1.3 HTML/CSS/JS的关系 

JavaScript学习笔记--【黑马程序员】_第24张图片

1.4 浏览器执行JS简介 

JavaScript学习笔记--【黑马程序员】_第25张图片

1.5 JS组成

 JavaScript学习笔记--【黑马程序员】_第26张图片

  JavaScript学习笔记--【黑马程序员】_第27张图片

JavaScript学习笔记--【黑马程序员】_第28张图片 1.6 JS初体验

1.6.1 行内式JS

JavaScript学习笔记--【黑马程序员】_第29张图片

1.6.2 内嵌JS

JavaScript学习笔记--【黑马程序员】_第30张图片

1.6.3 外部JS文件 

JavaScript学习笔记--【黑马程序员】_第31张图片

四、JavaScript注释

1.单行注释

JavaScript学习笔记--【黑马程序员】_第32张图片

2.多行注释 

JavaScript学习笔记--【黑马程序员】_第33张图片

五、Javascript输入输出语句

JavaScript学习笔记--【黑马程序员】_第34张图片

    

 六、变量

1.变量的概述

1.1 什么是变量

JavaScript学习笔记--【黑马程序员】_第35张图片

1.2 变量在内存中的存储

 JavaScript学习笔记--【黑马程序员】_第36张图片

2.变量的使用

2.1 声明变量

JavaScript学习笔记--【黑马程序员】_第37张图片

2.2.赋值

JavaScript学习笔记--【黑马程序员】_第38张图片

2.3 变量的初始化

 JavaScript学习笔记--【黑马程序员】_第39张图片

    

2.4 【案例】变量的使用

    

3.变量语法扩展

3.1 更新变量

JavaScript学习笔记--【黑马程序员】_第40张图片

3.2 同时声明多个变量

JavaScript学习笔记--【黑马程序员】_第41张图片

 3.3 声明变量特殊情况

JavaScript学习笔记--【黑马程序员】_第42张图片

4.变量命名规范

JavaScript学习笔记--【黑马程序员】_第43张图片

5.标识符

JavaScript学习笔记--【黑马程序员】_第44张图片

6.var 、 let、 const

 var 在 ECMAScript 的所有版本中都可以使用,而 const 和 let 只能在 ECMAScript 6 及更晚的版本中使用。

6.1 var关键字--声明的是函数作用域

        (1) var声明作用域

JavaScript学习笔记--【黑马程序员】_第45张图片

        (2)var声明提升

 JavaScript学习笔记--【黑马程序员】_第46张图片

6.2 let关键字--声明的是块作用域

 块作用域是函数作用域的子集

let 也不允许同一个块作用域中出现冗余声明

JavaScript学习笔记--【黑马程序员】_第47张图片JavaScript学习笔记--【黑马程序员】_第48张图片

    

         (1)暂时性死区

let 与 var 的另一个重要的区别,就是 let 声明的变量不会在作用域中被提升

// name 会被提升
console.log(name); // undefined
var name = 'Matt';
// age 不会被提升
console.log(age); // ReferenceError:age 没有定义
let age = 26;

在解析代码时,JavaScript 引擎也会注意出现在块后面的 let 声明,只不过在此之前不能以任何方 式来引用未声明的变量。在 let 声明之前的执行瞬间被称为“暂时性死区”(temporal dead zone),在此 阶段引用任何后面才声明的变量都会抛出 ReferenceError。

        (2)全局声明

与 var 关键字不同,使用 let 在全局作用域中声明的变量不会成为 window 对象的属性(var 声 明的变量则会)。

var name = 'Matt';
console.log(window.name); // 'Matt'
let age = 26;
console.log(window.age); // undefined 

        (3)条件声明

在使用 var 声明变量时,由于声明会被提升,JavaScript 引擎会自动将多余的声明在作用域顶部合 并为一个声明。因为 let 的作用域是块,所以不可能检查前面是否已经使用 let 声明过同名变量,同 时也就不可能在没有声明的情况下声明它。


 

使用 try/catch 语句或 typeof 操作符也不能解决,因为条件块中 let 声明的作用域仅限于该块。

    
    

        (4)for 循环中的 let 声明

JavaScript学习笔记--【黑马程序员】_第49张图片

     

这种每次迭代声明一个独立变量实例的行为适用于所有风格的 for 循环,包括 for-in 和 for-of 循环。

6.3 const声明

const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且 尝试修改 const 声明的变量会导致运行时错误。

     

const 声明的限制只适用于它指向的变量的引用。换句话说,如果 const 变量引用的是一个对象, 那么修改这个对象内部的属性并不违反 const 的限制。

const person = {};
person.name = 'Matt'; // ok 

JavaScript 引擎会为 for 循环中的 let 声明分别创建独立的变量实例,虽然 const 变量跟 let 变 量很相似,但是不能用 const 来声明迭代变量(因为迭代变量会自增):

for (const i = 0; i < 10; ++i) {} // TypeError:给常量赋值

如果你只想用 const 声明一个不会被修改的 for 循环变量,那也是可以的。也就是说,每 次迭代只是创建一个新变量。这对 for-of 和 for-in 循环特别有意义

     

7.交换变量案例

    

七、数据类型

1.数据类型简介

1.1 为什么需要数据类型

1.2 变量的数据类型

 JavaScript学习笔记--【黑马程序员】_第50张图片

1.3 数据类型的分类

 JavaScript学习笔记--【黑马程序员】_第51张图片

2.简单数据类型(Number,String,Boolean,Undefined,Null,Symbol)

JavaScript学习笔记--【黑马程序员】_第52张图片

2.1 数字型--Number

JavaScript学习笔记--【黑马程序员】_第53张图片

(1)数值进制

八进制前面加0,十六进制前面加0x

如果字面量中包含的数字超出了应 有的范围,就会忽略前缀的零,后面的数字序列会被当成十进制数,

JavaScript学习笔记--【黑马程序员】_第54张图片

 (2)数字类型范围

JavaScript学习笔记--【黑马程序员】_第55张图片

(3)数值类型的三个特殊值

JavaScript学习笔记--【黑马程序员】_第56张图片

(4)isNaN()

JavaScript学习笔记--【黑马程序员】_第57张图片

console.log(0/0); // NaN 
console.log(-0/+0); // NaN 
//如果分子是非 0 值,分母是有符号 0 或无符号 0,则会返回 Infinity 或-Infinity:
console.log(5/0); // Infinity 
console.log(5/-0); // -Infinity

任何涉及 NaN 的操作始终返回 NaN(如 NaN/10)

NaN 不等于包括 NaN 在内的任何值

console.log(NaN == NaN); // false 

ECMAScript 提供了 isNaN()函数。该函数接收一个参数,可以是任意数据类型,然后判断 这个参数是否“不是数值”。把一个值传给 isNaN()后,该函数会尝试把它转换为数值。某些非数值的 值可以直接转换成数值,如字符串"10"或布尔值。任何不能转换为数值的值都会导致这个函数返回 true。

console.log(isNaN(NaN)); // true 
console.log(isNaN(10)); // false,10 是数值
console.log(isNaN("10")); // false,可以转换为数值 10 
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值 1 

(5)浮点值

要定义浮点值,数值中必须包含小数点,而且小数点后面必须至少有一个数字。虽然小数点前面不 是必须有整数,但推荐加上。

let floatNum1 = 1.1; 
let floatNum2 = 0.1; 
let floatNum3 = .1; // 有效,但不推荐

如果数值本身就是整数,只是小 数点后面跟着 0(如 1.0),那它也会被转换为整数。

对于非常大或非常小的数值,浮点值可以用科学记数法来表示。科学记数法用于表示一个应该乘以 10 的给定次幂的数值。ECMAScript 中科学记数法的格式要求是一个数值(整数或浮点数)后跟一个大 写或小写的字母 e,再加上一个要乘的 10 的多少次幂。

if (a + b == 0.3) { // 别这么干! 
     console.log("You got 0.3."); 
} 

JavaScript学习笔记--【黑马程序员】_第58张图片

 (6)数值转换

有 3 个函数可以将非数值转换为数值:Number()、parseInt()和 parseFloat()。

Number()--可以用于任何数据类型

JavaScript学习笔记--【黑马程序员】_第59张图片

let num1 = Number("Hello world!"); // NaN 
let num2 = Number(""); // 0 
let num3 = Number("000011"); // 11 
let num4 = Number(true); // 1 

parseInt()--字符串转换为数值

JavaScript学习笔记--【黑马程序员】_第60张图片

let num1 = parseInt("1234blue"); // 1234 
let num2 = parseInt(""); // NaN 
let num3 = parseInt("0xA"); // 10,解释为十六进制整数
let num4 = parseInt(22.5); // 22 
let num5 = parseInt("70"); // 70,解释为十进制值
let num6 = parseInt("0xf"); // 15,解释为十六进制整数

不同的数值格式很容易混淆,因此 parseInt()也接收第二个参数,用于指定底数(进制数)。

let num1 = parseInt("10", 2); // 2,按二进制解析
let num2 = parseInt("10", 8); // 8,按八进制解析
let num3 = parseInt("10", 10); // 10,按十进制解析
let num4 = parseInt("10", 16); // 16,按十六进制解析

parseFloat()--字符串转换为数值

  • 它始终忽略字符串开头的零
  • 十六进制数值始终会返回 0
  • 因为 parseFloat()只解析十进制值,因此不能指定底数。最后,如果字符串表示整数(没有小数点或者小 数点后面只有一个零),则 parseFloat()返回整数
let num1 = parseFloat("1234blue"); // 1234,按整数解析
let num2 = parseFloat("0xA"); // 0 
let num3 = parseFloat("22.5"); // 22.5 
let num4 = parseFloat("22.34.5"); // 22.34 
let num5 = parseFloat("0908.5"); // 908.5 
let num6 = parseFloat("3.125e7"); // 31250000

2.2 字符串类型--String

 字符串要用双引号或者单引号括起来JavaScript学习笔记--【黑马程序员】_第61张图片

 (1)字符串引号嵌套

 JavaScript学习笔记--【黑马程序员】_第62张图片

(2)字符串转义符

 (3)字符串长度

JavaScript学习笔记--【黑马程序员】_第63张图片

 (4)字符串拼接--只要有字符串则最后结果都是字符串

JavaScript学习笔记--【黑马程序员】_第64张图片

有两种方式把一个值转换为字符串。首先是使用几乎所有值都有的 toString()方法。这个方法唯 一的用途就是返回当前值的字符串等价物。toString()方法可见于数值、布尔值、对象和字符串值。(没错,字符串值也有 toString()方法, 该方法只是简单地返回自身的一个副本。)null 和 undefined 值没有 toString()方法

let age = 11; 
let ageAsString = age.toString(); // 字符串"11" 
let found = true; 
let foundAsString = found.toString(); // 字符串"true" 

多数情况下,toString()不接收任何参数。不过,在对数值调用这个方法时,toString()可以接收一个底数参数,即以什么底数来输出数值的字符串表示。默认情况下,toString()返回数值的十 进制字符串表示。而通过传入参数,可以得到数值的二进制、八进制、十六进制,或者其他任何有效基 数的字符串表示

let num = 10; 
console.log(num.toString()); // "10" 
console.log(num.toString(2)); // "1010" 
console.log(num.toString(8)); // "12" 
console.log(num.toString(10)); // "10" 
console.log(num.toString(16)); // "a" 

let value1 = 10; 
let value2 = true; 
let value3 = null; 
let value4; 
console.log(String(value1)); // "10" 
console.log(String(value2)); // "true" 
console.log(String(value3)); // "null" 
console.log(String(value4)); // "undefined" 

 (5)字符串拼接加强 

 变量是不能添加引号的,因为如果加了就变成字符串JavaScript学习笔记--【黑马程序员】_第65张图片

(6)字符串的特点

ECMAScript 中的字符串是不可变的(immutable),意思是一旦创建,它们的值就不能变了。要修改 某个变量中的字符串值,必须先销毁原始的字符串,然后将包含新值的另一个字符串保存到该变量

JavaScript学习笔记--【黑马程序员】_第66张图片

 (7)模板字面量

ECMAScript 6 新增了使用模板字面量定义字符串的能力。与使用单引号或双引号不同,模板字面量 保留换行字符,可以跨行定义字符串

let myMultiLineString = 'first line\nsecond line'; 
let myMultiLineTemplateLiteral = `first line 
second line`; 
console.log(myMultiLineString); 
// first line 
// second line" 
console.log(myMultiLineTemplateLiteral); 
// first line 
// second line 
console.log(myMultiLineString === myMultiLinetemplateLiteral); // true 

由于模板字面量会保持反引号内部的空格,因此在使用时要格外注意。格式正确的模板字符串看起 来可能会缩进不当

// 这个模板字面量在换行符之后有 25 个空格符
let myTemplateLiteral = `first line 
 second line`; 
console.log(myTemplateLiteral.length); // 47 
// 这个模板字面量以一个换行符开头
let secondTemplateLiteral = ` 
first line 
second line`; 
console.log(secondTemplateLiteral[0] === '\n'); // true 
// 这个模板字面量没有意料之外的字符
let thirdTemplateLiteral = `first line 
second line`; 
console.log(thirdTemplateLiteral); 
// first line 
// second line 

 (8)字符串插值

模板字面量最常用的一个特性是支持字符串插值,也就是可以在一个连续定义中插入一个或多个 值。技术上讲,模板字面量不是字符串,而是一种特殊的 JavaScript 句法表达式,只不过求值后得到的 是字符串。

let value = 5; 
let exponent = 'second'; 
// 以前,字符串插值是这样实现的:
let interpolatedString = 
 value + ' to the ' + exponent + ' power is ' + (value * value); 
// 现在,可以用模板字面量这样实现:
let interpolatedTemplateLiteral = 
 `${ value } to the ${ exponent } power is ${ value * value }`; 
console.log(interpolatedString); // 5 to the second power is 25 
console.log(interpolatedTemplateLiteral); // 5 to the second power is 25

模板也可以插入自己之前的值

let value = ''; 
function append() { 
 value = `${value}abc` 
 console.log(value); 
} 
append(); // abc 
append(); // abcabc 
append(); // abcabcabc 

【案例】显示年龄

JavaScript学习笔记--【黑马程序员】_第67张图片

 2.3 布尔值--Boolean

默认值是false

Boolean()转型函数可以在任意类型的数据上调用,而且始终返回一个布尔值。什么值能转换为 true 或 false 的规则取决于数据类型和实际的值。

JavaScript学习笔记--【黑马程序员】_第68张图片

 2.4 Undefined

当使用 var 或 let 声明了变量但没有初始 化时,就相当于给变量赋予了 undefined 值

var variable;
console.log(variable); // undefined
console.log('你好' + variable); // 你好undefined
console.log(11 + variable); // NaN
console.log(true + variable); // Na

包含 undefined 值的变量跟未定义变量是有区别的

let message; // 这个变量被声明了,只是值为 undefined 
// 确保没有声明过这个变量
// let age 
console.log(message); // "undefined" 
console.log(age); // 报错

无论是声明还是未声明,typeof 返回的都是字符串"undefined"。

let message; // 这个变量被声明了,只是值为 undefined 
// 确保没有声明过这个变量
// let age 
console.log(typeof message); // "undefined"  
console.log(typeof age); // "undefined"

2.5 Null

一个声明变量给 null 值,里面存的值为空(学习对象时,我们继续研究null)

var vari = null;
console.log('你好' + vari); // 你好null
console.log(11 + vari); // 11
console.log(true + vari); // 1

如前所述,永远不必显式地将 变量值设置为 undefined。但 null 不是这样的。任何时候,只要变量要保存对象,而当时又没有那个 对象可保存,就要用 null 来填充该变量。这样就可以保持 null 是空对象指针的语义,并进一步将其 与 undefined 区分开来

let message = null; 
let age; //默认为undefined,所以不为空
if (message) { 
     // 这个块不会执行
} 
if (!message) { 
     // 这个块会执行
} 
if (age) { 
     // 这个块不会执行
} 
if (!age) { //因为为undefined,所以age在这里进入
     // 这个块会执行
} 

2.6 Symbol

符号是原始值,且符号实例是唯一、不可变的。 符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。

(1)符号的基本用法

符号需要使用 Symbol()函数初始化。因为符号本身是原始类型,所以 typeof 操作符对符号返回 symbol

let sym = Symbol(); 
console.log(typeof sym); // symbol

调用 Symbol()函数时,也可以传入一个字符串参数作为对符号的描述(description),将来可以通 过这个字符串来调试代码。但是,这个字符串参数与符号定义或标识完全无关

let genericSymbol = Symbol(); 
let otherGenericSymbol = Symbol(); 
let fooSymbol = Symbol('foo'); 
let otherFooSymbol = Symbol('foo'); 
console.log(genericSymbol == otherGenericSymbol); // false
console.log(fooSymbol == otherFooSymbol); // false

符号没有字面量语法,这也是它们发挥作用的关键。按照规范,你只要创建 Symbol()实例并将其 用作对象的新属性,就可以保证它不会覆盖已有的对象属性,无论是符号属性还是字符串属性

let genericSymbol = Symbol(); 
console.log(genericSymbol); // Symbol() 
let fooSymbol = Symbol('foo'); 
console.log(fooSymbol); // Symbol(foo);

Symbol()函数不能与 new 关键字一起作为构造函数使用

let myBoolean = new Boolean(); 
console.log(typeof myBoolean); // "object" 
let myString = new String(); 
console.log(typeof myString); // "object" 
let myNumber = new Number(); 
console.log(typeof myNumber); // "object" 
let mySymbol = new Symbol(); // TypeError: Symbol is not a constructor

Symbol 不可以添加属性

let hd = Symbol();
hd.name = "后盾人";
console.log(hd.name);

(2.)Symbol.for()

根据描述获取Symbol,如果不存在则新建一个Symbol

  • 使用Symbol.for会在系统中将Symbol登记
  • 使用Symbol则不会登记

如果运行时的不同部分需要共享和重用符号实例,那么可以用一个字符串作为键,在全局符号注册 表中创建并重用符号。 需要使用 Symbol.for()方法

let fooGlobalSymbol = Symbol.for('foo'); 
console.log(typeof fooGlobalSymbol); // symbol

第一次使用某个字符串调用时,它会检查全局运 行时注册表,发现不存在对应的符号,于是就会生成一个新符号实例并添加到注册表中。后续使用相同 字符串的调用同样会检查注册表,发现存在与该字符串对应的符号,然后就会返回该符号实例。

let fooGlobalSymbol = Symbol.for('foo'); // 创建新符号
let otherFooGlobalSymbol = Symbol.for('foo'); // 重用已有符号
console.log(fooGlobalSymbol === otherFooGlobalSymbol); // true 
即使采用相同的符号描述,在全局注册表中定义的符号跟使用 Symbol()定义的符号也并不等同:
let localSymbol = Symbol('foo'); 
let globalSymbol = Symbol.for('foo'); 
console.log(localSymbol === globalSymbol); // false


使用description可以获取传入的描述参数
 

let hd = Symbol("小林");
console.log(hd.description); //小林

(3)Symbol.keyFor()

还可以使用 Symbol.keyFor()来查询全局注册表,Symbol.keyFor 根据使用Symbol.for登记的Symbol返回描述,如果找不到返回undefined

// 创建全局符号
let s = Symbol.for('foo'); 
console.log(Symbol.keyFor(s)); // foo 
// 创建普通符号
let s2 = Symbol('bar'); 
console.log(Symbol.keyFor(s2)); // undefined 
如果传给 Symbol.keyFor()的不是符号,则该方法抛出 TypeError:
Symbol.keyFor(123); // TypeError: 123 is not a symbol

(4)对象属性

Symbol 是独一无二的所以可以保证对象属性的唯一。

  • Symbol 声明和访问使用 [](变量)形式操作

  • 也不能使用 . 语法因为 .语法是操作字符串属性的。

下面写法是错误的,会将symbol 当成字符串symbol处理

let symbol = Symbol("小林");
let obj = {
  symbol: "hdcms.com"
};
console.log(obj);

正确写法是以[] 变量形式声明和访问

let symbol = Symbol("小林");
let obj = {
  [symbol]: "abc"
};
console.log(obj[symbol]); //abc

(5)遍历属性

Symbol 不能使用 for/in、for/of 遍历操作

let symbol = Symbol("小林");
let obj = {
  name: "abc",
  [symbol]: "abc"
};

for (const key in obj) {
  console.log(key); //name
}

for (const key of Object.keys(obj)) {
  console.log(key); //name
}

也可以使用 Reflect.ownKeys(obj) 获取所有属性包括Symbol

for (const key of Reflect.ownKeys(obj)) {
  console.log(key);
}

3.获取变量数据类型(Object)

let o = new Object();

//如果没有参数,如上面的例子所示,那么完全可以省略括号(不推荐):
let o = new Object; // 合法,但不推荐

3.1 Object实例有如下属性和方法

JavaScript学习笔记--【黑马程序员】_第69张图片

3.2 获取检测变量的数据类型--typeof 

注意typeof在某些情况下返回的结果可能会让人费解,但技术上讲还是正确的。比如,调用typeof null 返回的是"object"。这是因为特殊值 null 被认为是一个对空对象的引用。

JavaScript学习笔记--【黑马程序员】_第70张图片

3.2 字面量

JavaScript学习笔记--【黑马程序员】_第71张图片

3.3 Object类型

对象通过 new 操作符后跟对象类型的名称 来创建。开发者可以通过创建 Object 类型的实例来创建自己的对象,然后再给对象添加属性和方法

let o = new Object(); 
let o = new Object; // 合法,但不推

JavaScript学习笔记--【黑马程序员】_第72张图片

4.数据类型转换

4.1 什么是数据类型转换

JavaScript学习笔记--【黑马程序员】_第73张图片

4.2 转换为字符串

 JavaScript学习笔记--【黑马程序员】_第74张图片

4.3 转换为数字型(重点) 

JavaScript学习笔记--【黑马程序员】_第75张图片

【案例】计算年龄

 JavaScript学习笔记--【黑马程序员】_第76张图片

【简单加法器】

JavaScript学习笔记--【黑马程序员】_第77张图片

JavaScript学习笔记--【黑马程序员】_第78张图片

 4.4转换为布尔值

JavaScript学习笔记--【黑马程序员】_第79张图片

console.log(Boolean('')); // false
console.log(Boolean(0)); // false
console.log(Boolean(NaN)); // false
console.log(Boolean(null)); // false
console.log(Boolean(undefined)); // false
console.log(Boolean('小白')); // true
console.log(Boolean(12)); // true

八、标识符,关键字,保留字

1.标识符

2.关键字

JavaScript学习笔记--【黑马程序员】_第80张图片

3.保留字

JavaScript学习笔记--【黑马程序员】_第81张图片

 九、JavaScript 运算符

1.运算符

JavaScript学习笔记--【黑马程序员】_第82张图片

2.算数运算符

2.1 算术运算符概述

JavaScript学习笔记--【黑马程序员】_第83张图片

 2.2 浮点数的精度问题

不要直接判断两个浮点数是否相等

JavaScript学习笔记--【黑马程序员】_第84张图片

 JavaScript学习笔记--【黑马程序员】_第85张图片

2.3 表达式和返回值

 JavaScript学习笔记--【黑马程序员】_第86张图片

3.递增和递减运算符(一元运算符)

3.1 递增和递减运算符概述

JavaScript学习笔记--【黑马程序员】_第87张图片

3.2 递增运算符

        (1)前置递增运算符 

JavaScript学习笔记--【黑马程序员】_第88张图片

        (2)后置递增运算符

JavaScript学习笔记--【黑马程序员】_第89张图片

  3.3 前置递增和后置递增小结

JavaScript学习笔记--【黑马程序员】_第90张图片

JavaScript学习笔记--【黑马程序员】_第91张图片

let s1 = "2"; 
let s2 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
s1++; // 值变成数值 3 
s2++; // 值变成 NaN 
b++; // 值变成数值 1 
f--; // 值变成 0.10000000000000009(因为浮点数不精确)
o--; // 值变成-2 

3.4 一元加和减

如果将一元加应用到非数值,则会执行与使用 Number()转型函数一样的类型转换:布尔值 false 和 true 转换为 0 和 1,字符串根据特殊规则进行解析,对象会调用它们的 valueOf()和/或 toString() 方法以得到可以转换的值

let s1 = "01"; 
let s2 = "1.1";
let s3 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
s1 = +s1; // 值变成数值 1 
s2 = +s2; // 值变成数值 1.1 
s3 = +s3; // 值变成 NaN 
b = +b; // 值变成数值 0 
f = +f; // 不变,还是 1.1 
o = +o; // 值变成数值-1  

一元减由一个减号(-)表示,放在变量前头,主要用于把数值变成负值

let s1 = "01"; 
let s2 = "1.1"; 
let s3 = "z"; 
let b = false; 
let f = 1.1; 
let o = { 
 valueOf() { 
 return -1; 
 } 
}; 
s1 = -s1; // 值变成数值-1 
s2 = -s2; // 值变成数值-1.1 
s3 = -s3; // 值变成 NaN 
b = -b; // 值变成数值 0 
f = -f; // 变成-1.1 
o = -o; // 值变成数值 1

4.比较运算符

4.1 比较运算符概述

JavaScript学习笔记--【黑马程序员】_第92张图片

JavaScript学习笔记--【黑马程序员】_第93张图片

 只要是数值和字符串 比较,字符串就会先被转换为数值,然后进行数值比较。

//因为两个操作数都是字符串,所以会逐个比较它们的字符编码(字符"2"的编码是 50,而字符"3"的编码是 51)。
let result = "23" < "3"; // true 


//这次会将字符串"23"转换为数值 23,然后再跟 3 比较
let result = "23" < 3; // false


//因为字符"a"不能转换成任何有意义的数值,所以只能转换为 NaN
let result = "a" < 3; // 因为"a"会转换为 NaN,所以结果是 false

即任何关系 操作符在涉及比较 NaN 时都返回 false。

let result1 = NaN < 3; // false 
let result2 = NaN >= 3; // false 
//在大多数比较的场景中,如果一个值不小于另一个值,那就一定大于或等于它。但在比较 NaN 时,
无论是小于还是大于等于,比较的结果都会返回 false

4.2 小结

 JavaScript学习笔记--【黑马程序员】_第94张图片

5.逻辑运算符

5.1 逻辑运算符概述

JavaScript学习笔记--【黑马程序员】_第95张图片

5.2 逻辑与 &&

两边都是true才返回true,否则返回false

JavaScript学习笔记--【黑马程序员】_第96张图片

5.3 逻辑或 ||

 两边都为 false 才返回 false,否则都为true

JavaScript学习笔记--【黑马程序员】_第97张图片

5.4 逻辑非 ! 

 

5.5 短路运算(逻辑中断)

当有多个表达式(值)时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值

         (1)逻辑与--表达式1 && 表达式2

  • 如果第一个表达式的值为真,则返回表达式2
  • 如果第一个表达式的值为假,则返回表达式1

        (2)逻辑或--表达式1 || 表达式2

  • 如果第一个表达式的值为真,则返回表达式1
  • 如果第一个表达式的值为假,则返回表达式2

        (3)逻辑中断(短路操作)

6.赋值运算符

用来把数据赋值给变量的运算符。

JavaScript学习笔记--【黑马程序员】_第98张图片

var age = 10;
age += 5; // 相当于 age = age + 5;
age -= 5; // 相当于 age = age - 5;
age *= 10; // 相当于 age = age * 10;

7.位操作符

   JavaScript学习笔记--【黑马程序员】_第99张图片

  (1) 按位非-- 波浪符(~)表示,它的作用是返回数值的一补数【按位非的最终效果是对 数值取反并减 1】

let num1 = 25; // 二进制 00000000000000000000000000011001 
let num2 = ~num1; // 二进制 11111111111111111111111111100110 
console.log(num2); // -26

(2)按位与--和号(&)

按位与操作在两个位都是 1 时返回 1,在任何一位是 0 时返回 0

JavaScript学习笔记--【黑马程序员】_第100张图片

JavaScript学习笔记--【黑马程序员】_第101张图片

(3)按位或--操作符用管道符(|)表示

 按位或操作在至少一位是 1 时返回 1,两位都是 0 时返回 0。

JavaScript学习笔记--【黑马程序员】_第102张图片

JavaScript学习笔记--【黑马程序员】_第103张图片

(4)按位异或--用脱字符(^)表示

 JavaScript学习笔记--【黑马程序员】_第104张图片

  按位异或与按位或的区别是,它只在一位上是 1 的时候返回 1(两位都是 1 或 0,则返回 0)。

JavaScript学习笔记--【黑马程序员】_第105张图片

(5)左移--用两个小于号(<<)表示

let oldValue = 2; // 等于二进制 10 
let newValue = oldValue << 5; // 等于二进制 1000000,即十进制 64

 JavaScript学习笔记--【黑马程序员】_第106张图片

(6)有符号右 移--两个大于号(>>)表示,会将数值的所有 32 位都向右移,同时保留符号(正或负)

let oldValue = 64; // 等于二进制 1000000 
let newValue = oldValue >> 5; // 等于二进制 10,即十进制 2 

JavaScript学习笔记--【黑马程序员】_第107张图片

(7)无符号右移--3 个大于号表示(>>>)

 对于正数,无符号右移与 有符号右移结果相同。

let oldValue = 64; // 等于二进制 1000000 
let newValue = oldValue >>> 5; // 等于二进制 10,即十进制 2 

无符号右移操作符将负数的二进制表示当成正数的二进制表示来处理

let oldValue = -64; // 等于二进制 11111111111111111111111111000000 
let newValue = oldValue >>> 5; // 等于十进制 134217726

8.布尔操作符

1. 逻辑非--一个叹号(!)表示

逻辑非操作符首先将操作数转换为布尔值,然后再对其取反。

console.log(!false); // true 
console.log(!"blue"); // false 
console.log(!0); // true 
console.log(!NaN); // true 
console.log(!""); // true 
console.log(!12345); // false

 逻辑非操作符也可以用于把任意值转换为布尔值。同时使用两个叹号(!!),相当于调用了转型函 数 Boolean()。无论操作数是什么类型,第一个叹号总会返回布尔值。第二个叹号对该布尔值取反, 从而给出变量真正对应的布尔值。结果与对同一个值使用 Boolean()函数是一样的

console.log(!!"blue"); // true 
console.log(!!0); // false 
console.log(!!NaN); // false 
console.log(!!""); // false 
console.log(!!12345); // true 

2. 逻辑与--由两个和号(&&)表示

JavaScript学习笔记--【黑马程序员】_第108张图片

JavaScript学习笔记--【黑马程序员】_第109张图片

 逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个 操作数求值。对逻辑与操作符来说,如果第一个操作数是 false,那么无论第二个操作数是什么值,结 果也不可能等于 true。

 JavaScript学习笔记--【黑马程序员】_第110张图片

3.逻辑或---两个管道符(||)表示

JavaScript学习笔记--【黑马程序员】_第111张图片JavaScript学习笔记--【黑马程序员】_第112张图片

 第一个操作数求值为 true,第二个操作数就不会再被求值了

let found = true; 
let result = (found || someUndeclaredVariable); // 不会出错
console.log(result); // 会执行
跟前面的例子一样,变量 someUndeclaredVariable 也没有定义。但是,因为变量 found 的值
为 true,所以逻辑或操作符不会对变量 someUndeclaredVariable 求值,而直接返回 true。假如把
found 的值改为 false,那就会报错了:
let found = false; 
let result = (found || someUndeclaredVariable); // 这里会出错
console.log(result); // 不会执行这一行

 9.乘性操作符

(1)乘法操作符--由一个星号(*)表示,

JavaScript学习笔记--【黑马程序员】_第113张图片

(2)除法操作符--符由一个斜杠(/)表示

 JavaScript学习笔记--【黑马程序员】_第114张图片

 (3) 取模操作符---由一个百分比符号(%)表示

JavaScript学习笔记--【黑马程序员】_第115张图片

10.指数操作符

 ECMAScript 7 新增了指数操作符,Math.pow()现在有了自己的操作符**

console.log(Math.pow(3, 2); // 9 
console.log(3 ** 2); // 9 
console.log(Math.pow(16, 0.5); // 4 
console.log(16** 0.5); // 4 

指数操作符也有自己的指数赋值操作符**=

let squared = 3; 
squared **= 2; 
console.log(squared); // 9
let sqrt = 16; 
sqrt **= 0.5; 
console.log(sqrt); // 4

11.加性操作符

1. 加法操作符

JavaScript学习笔记--【黑马程序员】_第116张图片

let result1 = 5 + 5; // 两个数值
console.log(result1); // 10 
let result2 = 5 + "5"; // 一个数值和一个字符串
console.log(result2); // "55"
let num1 = 5; 
let num2 = 10; 
let message = "The sum of 5 and 10 is " + num1 + num2; 
console.log(message); // "The sum of 5 and 10 is 510"

如果想真正执行数学计算,然后把结果追加到字符串末尾,只要使用一对括号即可

let num1 = 5; 
let num2 = 10; 
let message = "The sum of 5 and 10 is " + (num1 + num2); 
console.log(message); // "The sum of 5 and 10 is 15"

2. 减法操作符

JavaScript学习笔记--【黑马程序员】_第117张图片

let result1 = 5 - true; // true 被转换为 1,所以结果是 4 
let result2 = NaN - 1; // NaN 
let result3 = 5 - 3; // 2 
let result4 = 5 - ""; // ""被转换为 0,所以结果是 5 
let result5 = 5 - "2"; // "2"被转换为 2,所以结果是 3 
let result6 = 5 - null; // null 被转换为 0,所以结果是 5 

12.相等操作符

1. 等于和不等于---两个等于号(==/!=)表示

JavaScript学习笔记--【黑马程序员】_第118张图片

JavaScript学习笔记--【黑马程序员】_第119张图片 2. 全等和不全等--3 个等于号(===/!==)表示

let result1 = ("55" == 55); // true,转换后相等
let result2 = ("55" === 55); // false,不相等,因为数据类型不同

let result1 = ("55" != 55); // false,转换后相等
let result2 = ("55" !== 55); // true,不相等,因为数据类型不同

null===undefined(false)

 

 13.条件操作符

variable = boolean_expression ? true_value : false_value;

上面的代码执行了条件赋值操作,即根据条件表达式 boolean_expression 的值决定将哪个值赋 给变量 variable 。如果 boolean_expression 是 true ,则赋值 true_value ;如果 boolean_expression 是 false,则赋值 false_value。

14.逗号操作符

在一条语句中同时声明多个变量是逗号操作符最常用的场景。不过,也可以使用逗号操作符来辅助 赋值。在赋值时使用逗号操作符分隔值,最终会返回表达式中最后一个值

let num = (5, 1, 4, 8, 0); // num 的值为 0 

10.运算符优先级

  • 一元运算符里面的逻辑非优先级很高
  • 逻辑与比逻辑或优先级高(&& >> ||)

JavaScript学习笔记--【黑马程序员】_第120张图片

 9.练习

十、JavaScript 流程控制--分支

1.流程控制

JavaScript学习笔记--【黑马程序员】_第121张图片

2.顺序流程控制

JavaScript学习笔记--【黑马程序员】_第122张图片

3.分支流程控制if语句

3.1 分支结构

JavaScript学习笔记--【黑马程序员】_第123张图片

3.2 if语句

        (1)语法结构

 JavaScript学习笔记--【黑马程序员】_第124张图片

        (2)执行流程 

JavaScript学习笔记--【黑马程序员】_第125张图片

 【案例】

JavaScript学习笔记--【黑马程序员】_第126张图片

var usrAge = prompt('请输入您的年龄:');
if(usrAge >= 18){
 alert('您的年龄合法,欢迎来天际网吧享受学习的乐趣!');
}

  3.3 if else语句(双分支语句)

        (1)语法结构

JavaScript学习笔记--【黑马程序员】_第127张图片

         (2)执行流程

JavaScript学习笔记--【黑马程序员】_第128张图片

【案例】

if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
 alert("这个年份是闰年");
 } else { // 剩下的是平年
 alert("这个年份是平年");
 }

3.4 if else if语句(多分支语句)

        (1)语法结构

JavaScript学习笔记--【黑马程序员】_第129张图片

        (2)执行流程 

JavaScript学习笔记--【黑马程序员】_第130张图片

【案例】

JavaScript学习笔记--【黑马程序员】_第131张图片

var score = prompt('请您输入分数:');
if (score >= 90) {
alert('宝贝,你是我的骄傲');
} else if (score >= 80) {
alert('宝贝,你已经很出色了');
} else if (score >= 70) {
alert('你要继续加油喽');
} else if (score >= 60) {
alert('孩子,你很危险');
} else {
alert('熊孩子,我不想和你说话,我只想用鞭子和你说话');

4.三元表达式

4.1 语法结构

 4.2 执行思路

【案例】

JavaScript学习笔记--【黑马程序员】_第132张图片

var time = prompt('请您输入一个 0 ~ 59 之间的一个数字');
// 三元表达式 表达式 ? 表达式1 :表达式2 
var result = time < 10 ? '0' + time : time; // 把返回值赋值给一个变量
alert(result);

5.分支流程控制switch语句

5.1 语法结构

JavaScript学习笔记--【黑马程序员】_第133张图片

    

JavaScript学习笔记--【黑马程序员】_第134张图片

 【案例】

JavaScript学习笔记--【黑马程序员】_第135张图片

var fruit = prompt('请您输入查询的水果:');
switch (fruit) {
case '苹果':
alert('苹果的价格是 3.5/斤');
break;
case '榴莲':
alert('榴莲的价格是 35/斤');
break;
default:
alert('没有此水果');
}

5.2 switch 语句和 if else if 语句的区别

JavaScript学习笔记--【黑马程序员】_第136张图片

    

【案例-ATM取款机】

十一、JavaScript 流程控制--循环

1.循环

JavaScript学习笔记--【黑马程序员】_第137张图片  

2.for循环

2.1 语法结构

JavaScript学习笔记--【黑马程序员】_第138张图片

JavaScript学习笔记--【黑马程序员】_第139张图片

2.2 for循环重复相同的代码

不过,初始化定义的迭代器变 量在循环执行完成后几乎不可能再用到了。因此,最清晰的写法是使用 let 声明迭代器变量,这样就可 以将这个变量的作用域限定在循环中。

 JavaScript学习笔记--【黑马程序员】_第140张图片

let count = 10; 
for (let i = 0; i < count; i++) { 
 console.log(i); 
} 
//以上代码在循环开始前定义了变量 i 的初始值为 0。然后求值条件表达式,如果求值结果
//为 true(i < count),则执行循环体。因此循环体也可能不会被执行。如果循环体被执
//行了,则循环后表达式也会执行,以便递增变量 i。for 循环跟下面的 while 循环是一样的:
let count = 10; 
let i = 0; 
while (i < count) { 
 console.log(i); 
 i++

2.3 for循环重复不相同的代码

 JavaScript学习笔记--【黑马程序员】_第141张图片

JavaScript学习笔记--【黑马程序员】_第142张图片 【案例:求1-100之间所有整数的累加和】

JavaScript学习笔记--【黑马程序员】_第143张图片

var sum = 0;
for(var i = 1;i <= 100; i++){
 sumNum += i;
}
console.log('1-100之间整数的和 = ' + sum);

 【案例-求学生成绩】

JavaScript学习笔记--【黑马程序员】_第144张图片

var num = prompt('请输入班级总的人数:'); // num 班级总的人数
var sum = 0; // 总成绩
var average = 0; // 平均成绩
for (var i = 1; i <= num; i++) {
 var score = prompt('请输入第' + i + '个学生的成绩');
 sum = sum + parseFloat(score); 
}
average = sum / num;
alert('班级总的成绩是:' + sum);
alert('班级总的平均成绩是:' + average);

【案例-一行打印五个星星】

var star = '';
for (var i = 1; i <= 5; i++) {
 star += '☆'
 }
console.log(star);

3.双重for循环

3.1 双重for循环概述

JavaScript学习笔记--【黑马程序员】_第145张图片

 3.2 双重for循环语法

JavaScript学习笔记--【黑马程序员】_第146张图片

【案例--打印五行五列星星】

 JavaScript学习笔记--【黑马程序员】_第147张图片

var star = '';
for (var j = 1; j <= 5; j++) {
 for (var i = 1; i <= 5; i++) {
 star += '☆'
 }
 // 每次满 5个星星 就 加一次换行
 star += '\n'
}
console.log(star);

【案例--打印n行n列星星】

JavaScript学习笔记--【黑马程序员】_第148张图片

var row = prompt('请输入您打印几行星星:');
var col = prompt('请输入您打印几列星星:');
var str = '';
for (var i = 1; i <= row; i++) {
 for (j = 1; j <= col; j++) {
 str += '☆';
 }
 str += '\n';
}
 console.log(str);

【案例--打印倒三角】

JavaScript学习笔记--【黑马程序员】_第149张图片

JavaScript学习笔记--【黑马程序员】_第150张图片

var row = prompt('请输入您打印几行星星:');
var col = prompt('请输入您打印几列星星:');
var str = '';
for (var i = 1; i <= row; i++) {
 for (j = 1; j <= col; j++) {
 str += '☆';
 }
 str += '\n';
}
 console.log(str);

【案例--九九乘法表】

JavaScript学习笔记--【黑马程序员】_第151张图片

 JavaScript学习笔记--【黑马程序员】_第152张图片

3.3 for-in语句

for-in 语句是一种严格的迭代语句,用于枚举对象中的非符号键属性

for (const propName in window) { 
 document.write(propName); 
} 

这个例子使用 for-in 循环显示了 BOM 对象 window 的所有属性。每次执行循环,都会给变量 propName 赋予一个 window 对象的属性作为值,直到 window 的所有属性都被枚举一遍。与 for 循环 一样,这里控制语句中的 const 也不是必需的。但为了确保这个局部变量不被修改,推荐使用 const。

1.所有可枚举的属性都会返回一次,但返回的顺序可能会因浏览器而异。

2.如果 for-in 循环要迭代的变量是 null 或 undefined,则不执行循环体。

var obj = {a:1, b:2, c:3};

for (var prop in obj) {
  console.log("obj." + prop + " = " + obj[prop]);
}

// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"

 3.4 for-of语句

for-of 语句是一种严格的迭代语句,用于遍历可迭代对象的元素

for (const el of [2,4,6,8]) { 
 document.write(el); 
} 

与 for 循环一样,这里控制语句中的 const 也不是必需的。但为了确保 这个局部变量不被修改,推荐使用 const。

3.5 for-in和for-of的区别

    1.for-in只是获取数组的索引;而for-of会获取数组的值
    2.for-in会遍历对象的整个原型链,性能差;而for-of只遍历当前对象,不会遍历原型链
    3.对于数组的遍历,for-in会返回数组中所有可枚举的属性(包括原型链上可枚举的属性);for-of只返回数组的下标对应的属性值
    4.for-of适用遍历数组/字符串/map/set等有迭代器对象的集合,但是不能遍历普通对象(obj is not iterable)

for-in

let arr = [1, 2, 3, 4, 5]
Array.prototype.id = 123
arr.name = 'Lisa'
for (let index in arr) {
	if (index == 2) {
	}
	console.log(index, arr[index]);//遍历[1,2,3,4,5,Lisa,123]
}

for-of

let arr = [1, 2, 3, 4, 5]
Array.prototype.id = 321
arr.name = 'Lisa'
for (let value of arr) {
	console.log(value);//只能拿到[1,2,3,4,5]
}

3.6  for循环小结

JavaScript学习笔记--【黑马程序员】_第153张图片

4.while循环

JavaScript学习笔记--【黑马程序员】_第154张图片

JavaScript学习笔记--【黑马程序员】_第155张图片

5.do while 循环

JavaScript学习笔记--【黑马程序员】_第156张图片

【案例】

JavaScript学习笔记--【黑马程序员】_第157张图片

do {
 var love = prompt('你爱我吗?');
} while (love != '我爱你')
alert('登录成功');

 JavaScript学习笔记--【黑马程序员】_第158张图片

6.continue break

6.1 continue关键字

跳出本次循环,继续下一次循环 

JavaScript学习笔记--【黑马程序员】_第159张图片

6.2 break关键字

跳出整个循环结构

JavaScript学习笔记--【黑马程序员】_第160张图片

    

 6.3.break和continue语句

break 语句用于立即退 出循环,强制执行循环后的下一条语句。(退出当前循环)

continue 语句也用于立即退出循环,但会再次从循环顶部 开始执行。

let num = 0; 
for (let i = 1; i < 10; i++) { 
 if (i % 5 == 0) { 
 break;
 } 
 num++; 
} 
console.log(num); // 4 

而在循环体内,有一个 if 语句用于检查 i 能否被 5 整除(使用取模操作符)。如果是,则执行 break 语句,退出循环。变量 num 的初始值为 0, 表示循环在退出前执行了多少次。当 break 语句执行后,下一行执行的代码是 console.log(num), 显示 4。之所以循环执行了 4 次,是因为当 i 等于 5 时,break 语句会导致循环退出,该次循环不会执 行递增 num 的代码。

let num = 0; 
for (let i = 1; i < 10; i++) { 
 if (i % 5 == 0) { 
 continue; 
 } 
 num++; 
} 
console.log(num); // 8 

7.with函数

with 语句的用途是将代码作用域设置为特定的对象

with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象。

with 通常被当做重复引用同一个对象中的多个属性的快捷方式,可以不需要重复引用对象本身。

比如,目前现在有一个这样的对象:

var obj = {
    a: 1,
    b: 2,
    c: 3
};


如果想要改变 obj 中每一项的值,一般写法可能会是这样:

// 重复写了3次的“obj”
obj.a = 2;
obj.b = 3;
obj.c = 4;


而用了 with 的写法,会有一个简单的快捷方式

with (obj) {
    a = 3;
    b = 4;
    c = 5;
}

8.switch语句

switch (expression) { 
 case value1: 
 statement
 break; 
 case value2: 
 statement 
 break; 
 case value3: 
 statement 
 break; 
 case value4: 
 statement 
 break; 
 default: 
 statement 
} 

这里的每个 case(条件/分支)相当于:“如果表达式等于后面的值,则执行下面的语句。”break 关键字会导致代码执行跳出 switch 语句。如果没有 break,则代码会继续匹配下一个条件。default 关键字用于在任何条件都没有满足时指定默认执行的语句(相当于 else 语句)。

1.switch 语句可以用于所有数据类型(在很多语言中,它只能用于数值),因此可以使用字符串甚至对象。

2.条件的值不需要是常量,也可以是变量或表达式。

switch ("hello world") { 
 case "hello" + " world": 
 console.log("Greeting was found."); 
 break; 
 case "goodbye": 
 console.log("Closing was found."); 
 break; 
 default: 
 console.log("Unexpected message was found."); 
} 

switch 语句在比较每个条件的值时会使用全等操作符,因此不会强制转换数据类 型(比如,字符串"10"不等于数值 10)

十二、数组

1.数组的概念

JavaScript学习笔记--【黑马程序员】_第161张图片

2.创建数组

2.1 利用new创建数组--new Array()

JavaScript学习笔记--【黑马程序员】_第162张图片

 2.2 利用数组字面量创建数组

 2.4 数组元素的类型

  

    

3.获取数组中的元素

3.1 数组的索引

JavaScript学习笔记--【黑马程序员】_第163张图片

4.遍历数组

JavaScript学习笔记--【黑马程序员】_第164张图片

    

 4.1 数组的长度

    

JavaScript学习笔记--【黑马程序员】_第165张图片

【案例-数组求和及平均值】

    

 【案例-数组的最大值】

JavaScript学习笔记--【黑马程序员】_第166张图片

    

 【案例-数组转换为分割字符串】

JavaScript学习笔记--【黑马程序员】_第167张图片

    

5.数组中新增元素

5.1 通过修改length长度新增数组元素

JavaScript学习笔记--【黑马程序员】_第168张图片

        // 1. 新增数组元素 修改length长度 
        var arr = ['red', 'green', 'blue'];
        console.log(arr.length);
        arr.length = 5; // 把我们数组的长度修改为了 5  里面应该有5个元素 
        console.log(arr);
        console.log(arr[3]); // undefined
        console.log(arr[4]); // undefined

5.2 通过修改数组索引新增数组元素

JavaScript学习笔记--【黑马程序员】_第169张图片

        // 2. 新增数组元素 修改索引号 追加数组元素
        var arr1 = ['red', 'green', 'blue'];
        arr1[3] = 'pink';
        console.log(arr1);
        arr1[4] = 'hotpink';
        console.log(arr1);
        arr1[0] = 'yellow'; // 这里是替换原来的数组元素
        console.log(arr1);
        arr1 = '有点意思';
        console.log(arr1); // 不要直接给 数组名赋值 否则里面的数组元素都没有了

【案例-数组新增元素】

JavaScript学习笔记--【黑马程序员】_第170张图片

   

【案例-筛选数组】

JavaScript学习笔记--【黑马程序员】_第171张图片

    

6.数组案例

【案例-删除指定数组元素】

    

【案例-翻转数组】

JavaScript学习笔记--【黑马程序员】_第172张图片

    

【复习交换两个变量】

    

【案例--冒泡排序】

    

十二、JavaScript 函数

1.函数的概念

JavaScript学习笔记--【黑马程序员】_第173张图片

    

2.函数的使用

2.1 声明函数

JavaScript学习笔记--【黑马程序员】_第174张图片

2.2 调用函数

 JavaScript学习笔记--【黑马程序员】_第175张图片

    

2.3 函数的封装

 JavaScript学习笔记--【黑马程序员】_第176张图片

【案例--利用函数计算1-100之间累加和】

    

3.函数的参数

3.1形参和实参

JavaScript学习笔记--【黑马程序员】_第177张图片

JavaScript学习笔记--【黑马程序员】_第178张图片

    

 【案例--利用函数求任意两个数的和】

    

3.2 函数参数的传递过程

JavaScript学习笔记--【黑马程序员】_第179张图片

 3.3 函数形参和实参个数不匹配问题

JavaScript学习笔记--【黑马程序员】_第180张图片

3.4 小结

 JavaScript学习笔记--【黑马程序员】_第181张图片

4.函数的返回值

4.1 return 语句

JavaScript学习笔记--【黑马程序员】_第182张图片

JavaScript学习笔记--【黑马程序员】_第183张图片【案例-利用函数求任意两个数的最大值】

 【案例--利用函数求任意一个数组中的最大值】

4.2 return终止函数

JavaScript学习笔记--【黑马程序员】_第184张图片
 4.3 return  的返回值

JavaScript学习笔记--【黑马程序员】_第185张图片

 【案例--创建一个函数,实现两个数之间的加减乘除运算,并将结果返回】

4.4 函数没有return 返回 undefined

JavaScript学习笔记--【黑马程序员】_第186张图片

    

4.5 break,continue,return 的区别

JavaScript学习笔记--【黑马程序员】_第187张图片

 JavaScript学习笔记--【黑马程序员】_第188张图片

4.6 return 注意事项

1.return是将要返回的东西进行返回,return后面的句子不会执行

2.return只能返回一个值,只能返回最后一个

3.我们的函数如果有return 则返回的是 return 后面的值,如果函数么有 return 则返回undefined

5.arguments(伪数组)的使用

 当不确定传入多少个参数的时候,就使用arguments

只有函数才可以使用arguments,而且是每个函数都内置好了这个argumentsJavaScript学习笔记--【黑马程序员】_第189张图片

 【案例--利用函数求任意个数的最大值】

    

6.函数案例

【案例--利用函数封装方法,翻转任意一个数组】

    

【案例--利用函数封装方法,队数组排序--冒泡排序】

    

【案例--判断闰年】

    

函数可以调用另外一个函数

【案例-用户输入年份,输出当前年份2月份的天数】

    

7.函数的两种声明方式

7.1 自定义函数方式(命名函数)

调用函数的代码和声明函数的代码顺序无所谓

JavaScript学习笔记--【黑马程序员】_第190张图片

7.2 函数表达式方式(匿名函数)

 调用函数的代码只能在声明函数的代码后面JavaScript学习笔记--【黑马程序员】_第191张图片

    

十三、Javascript 作用域

1.作用域

    

2.变量的作用域

1.注意 如果在函数内部 没有声明直接赋值的变量也属于全局变量

2.函数的形参也可以看做是局部变量

3. 从执行效率来看全局变量和局部变量
         (1) 全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
         (2) 局部变量 当我们程序执行完毕就会销毁, 比较节约内存资源

2.1 全局变量

JavaScript学习笔记--【黑马程序员】_第192张图片

2.2 局部变量

 JavaScript学习笔记--【黑马程序员】_第193张图片

    

2.3 Javascript没有块级作用域

    

3.作用域链

JavaScript学习笔记--【黑马程序员】_第194张图片

    

【案例】

   

十四、预解析

1.预解析

    

2.变量预解析和函数预解析

1. 我们js引擎运行js 分为两步:  预解析  代码执行
        // (1). 预解析 js引擎会把js 里面所有的 var  还有 function 提升到当前作用域的最前面
        // (2). 代码执行  按照代码书写的顺序从上往下执行
2. 预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
        // (1) 变量提升 就是把所有的变量声明提升到当前的作用域最前面  不提升赋值操作
        // (2) 函数提升 就是把所有的函数声明提升到当前作用域的最前面  不调用函数

3.预解析案例

    

十五、Javascript 对象

1.对象

1.1 什么是对象

JavaScript学习笔记--【黑马程序员】_第195张图片JavaScript学习笔记--【黑马程序员】_第196张图片

1.2 为什么需要对象

 JavaScript学习笔记--【黑马程序员】_第197张图片

2.创建对象的三种方式

2.1 利用字面量创建对象

JavaScript学习笔记--【黑马程序员】_第198张图片

JavaScript学习笔记--【黑马程序员】_第199张图片

变量、属性、函数、方法总结

 

    
    

2.2 利用new Object 创建对象

 JavaScript学习笔记--【黑马程序员】_第200张图片

JavaScript学习笔记--【黑马程序员】_第201张图片

    

2.3 利用构造函数创建对象

 JavaScript学习笔记--【黑马程序员】_第202张图片

JavaScript学习笔记--【黑马程序员】_第203张图片

    

2.4 构造函数和对象

 JavaScript学习笔记--【黑马程序员】_第204张图片

    

3.new关键字

JavaScript学习笔记--【黑马程序员】_第205张图片

    

4.遍历对象属性(for...in)--for( var k in obj) 

JavaScript学习笔记--【黑马程序员】_第206张图片

JavaScript学习笔记--【黑马程序员】_第207张图片

    

十六、JavaScript 内置对象

1.内置对象

JavaScript学习笔记--【黑马程序员】_第208张图片

2.查文档

2.1 MDN

JavaScript学习笔记--【黑马程序员】_第209张图片

MDN Web Docs (mozilla.org)

2.2 如何学习对象中的方法

JavaScript学习笔记--【黑马程序员】_第210张图片

3.Math对象

3.1 Math概述

JavaScript学习笔记--【黑马程序员】_第211张图片

    

【案例-封装自己的数学对象】

3.2 随机数方法random()--[0,1)

 JavaScript学习笔记--【黑马程序员】_第212张图片

    

 【案例--猜数字游戏】

JavaScript学习笔记--【黑马程序员】_第213张图片

JavaScript学习笔记--【黑马程序员】_第214张图片

    

4.日期对象

4.1 Date概述

使用时需要先实例化(先new 一个对象才可以使用)

 4.2 Date()方法的使用

JavaScript学习笔记--【黑马程序员】_第215张图片

    

创建的对象将保存当前日期和时间:ECMAScript 为此提供了两个辅助方法:Date.parse()和 Date.UTC()

//比如,要创建一个表示“2019 年 5 月 23 日”的日期对象,可以使用以下代码:
let someDate = new Date(Date.parse("May 23, 2019"));
//如果直接把表示日期的字
//符串传给 Date 构造函数,那么 Date 会在后台调用 Date.parse()。
//与上面是等价的:
let someDate = new Date("May 23, 2019");

ECMAScript 还提供了 Date.now()方法,返回表示方法执行时日期和时间的毫秒数。

// 起始时间
let start = Date.now(); 
// 调用函数
doSomething(); 
// 结束时间
let stop = Date.now(), 
result = stop - start;

4.3 继承的方法

Date 类型重写了 toLocaleString()、toString()和 valueOf()方法。

Date 类型的 valueOf()方法根本就不返回字符串,这个方法被重写后返回的是日期的毫秒表示。

let date1 = new Date(2019, 0, 1); // 2019 年 1 月 1 日
let date2 = new Date(2019, 1, 1); // 2019 年 2 月 1 日
console.log(date1 < date2); // true 
console.log(date1 > date2); // false

4.4 日期格式化

 JavaScript学习笔记--【黑马程序员】_第216张图片

    
    

4.4 获取日期的总的毫秒形式

JavaScript学习笔记--【黑马程序员】_第217张图片

    

【案例:倒计时效果】

JavaScript学习笔记--【黑马程序员】_第218张图片

5.数组对象

5.1 数组对象的创建

JavaScript学习笔记--【黑马程序员】_第219张图片

    

5.2 检测是否为数组----instanceof、Array.isArray()

JavaScript学习笔记--【黑马程序员】_第220张图片

    

 5.3 添加删除数组元素的方法

添加元素--push()、unshift()

删除元素--pop()、shift()

JavaScript学习笔记--【黑马程序员】_第221张图片

 【案例: 筛选数组】

JavaScript学习笔记--【黑马程序员】_第222张图片

    

5.4 数组排序

 JavaScript学习笔记--【黑马程序员】_第223张图片

    

5.5 数组索引方法

 JavaScript学习笔记--【黑马程序员】_第224张图片

 【案例: 数组去重】

JavaScript学习笔记--【黑马程序员】_第225张图片

5.6 数组转换为字符串

 JavaScript学习笔记--【黑马程序员】_第226张图片

    

5.7 其他

 JavaScript学习笔记--【黑马程序员】_第227张图片

6.字符串对象

6.1 基本包装类型

JavaScript学习笔记--【黑马程序员】_第228张图片

    

6.2 字符串的不可变

 JavaScript学习笔记--【黑马程序员】_第229张图片

    

6.3 根据字符返回位置

 JavaScript学习笔记--【黑马程序员】_第230张图片

 【案例:返回字符位置】

JavaScript学习笔记--【黑马程序员】_第231张图片

    

6.4 根据位置返回字符

JavaScript学习笔记--【黑马程序员】_第232张图片

JavaScript学习笔记--【黑马程序员】_第233张图片

【案例-统计出现最大的字符和次数】

JavaScript学习笔记--【黑马程序员】_第234张图片

    

6.5 字符串操作方法

JavaScript学习笔记--【黑马程序员】_第235张图片

    

6.6replace()方法

 JavaScript学习笔记--【黑马程序员】_第236张图片

        // 1. 替换字符 replace('被替换的字符', '替换为的字符')  它只会替换第一个字符
        var str = 'andyandy';
        console.log(str.replace('a', 'b'));
        // 有一个字符串 'abcoefoxyozzopp'  要求把里面所有的 o 替换为 *
        var str1 = 'abcoefoxyozzopp';
        while (str1.indexOf('o') !== -1) {
            str1 = str1.replace('o', '*');
        }
        console.log(str1);

6.7 split()方法

 JavaScript学习笔记--【黑马程序员】_第237张图片

6.8 其他

 

7.RegExp

通过 RegExp 类型支持正则表达式:let expression = /pattern/flags;

  匹配模式

 g:全局模式,表示查找字符串的全部内容,而不是找到第一个匹配的内容就结束。

 i:不区分大小写,表示在查找匹配时忽略 pattern 和字符串的大小写。

 m:多行模式,表示查找到一行文本末尾时会继续查找。

 y:粘附模式,表示只查找从 lastIndex 开始及之后的字符串。

 u:Unicode 模式,启用 Unicode 匹配。

 s:dotAll 模式,表示元字符.匹配任何字符(包括\n 或\r)。

JavaScript学习笔记--【黑马程序员】_第238张图片

let text = "this has been a short summer"; 
let pattern = /(.)hort/g; 
if (pattern.test(text)) { 
 console.log(RegExp.input); // this has been a short summer 
 console.log(RegExp.leftContext); // this has been a 
 console.log(RegExp.rightContext); // summer 
 console.log(RegExp.lastMatch); // short 
 console.log(RegExp.lastParen); // s 
} 

[112]

十七、JavaScript 简单类型与复杂类型、作用域与内存

1.简单类型和复杂类型

JavaScript学习笔记--【黑马程序员】_第239张图片

2.堆和栈

JavaScript学习笔记--【黑马程序员】_第240张图片

3.简单类型的内存分配

JavaScript学习笔记--【黑马程序员】_第241张图片

4.复杂类型的内存分配

JavaScript学习笔记--【黑马程序员】_第242张图片

5.简单类型传参

函数的形参也可以看做是一个变量,当我们把一个值类型变量作为参数传给函数的形参时,其实是把比哪里在栈空间里的值复制了一份给形参,在方法内部对形参做任何改变,都不会影响到外部变量。 

    

6.复杂类型传参

  函数的形参可以看作是一个变量。当我们把引用类型变量传给形参时,其实把变量在栈空间里保存的堆地址复制给形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。

JavaScript学习笔记--【黑马程序员】_第243张图片

7.原始值和引用值

ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。

原始值(primitive value)就是 最简单的数据

----->保存原始值的变量是按值(by value)访问的,因为我们操作的就是存储在变量中的实际值。

引用值(reference value)则是由多个值构成的对象

--->引用值是保存在内存中的对象。与其他语言不同,JavaScript 不允许直接访问内存位置,因此也就 不能直接操作对象所在的内存空间。在操作对象时,实际上操作的是对该对象的引用(reference)而非 实际的对象本身。为此,保存引用值的变量是按引用(by reference)访问的。

7.1 动态属性

对于引用值而言,可以随时添加、修改和删除其属性 和方法。

let person = new Object(); 
person.name = "Nicholas"; 
console.log(person.name); // "Nicholas" 

原始值不能有属性,尽管尝试给原始值添加属性不会报错。

let name = "Nicholas"; 
name.age = 27; 
console.log(name.age); // undefined 

7.2 复制值

原始值:两个变量可以独立使用,互不干扰

在通过变量把一个原始值赋值 到另一个变量时,原始值会被复制到新变量的位置。

let num1 = 5; 
let num2 = num1; 
//这个值跟存储在num1 中的 5 是完全独立的,因为它是那个值的副本。

JavaScript学习笔记--【黑马程序员】_第244张图片

 引用值:两个变量实际 上指向同一个对象

在把引用值从一个变量赋给另一个变量时,存储在变量中的值也会被复制到新变量所在的位置。区 别在于,这里复制的值实际上是一个指针,它指向存储在堆内存中的对象。

let obj1 = new Object(); 
let obj2 = obj1; 
obj1.name = "Nicholas"; 
console.log(obj2.name); // "Nicholas" 

变量 obj1 保存了一个新对象的实例。然后,这个值被复制到 obj2,此时两个变 量都指向了同一个对象。在给 obj1 创建属性 name 并赋值后,通过 obj2 也可以访问这个属性,因为 它们都指向同一个对象。

JavaScript学习笔记--【黑马程序员】_第245张图片

7.3 传递参数:ECMAScript 中所有函数的参数都是按值传递的

 函数外的值会被复制到函数内部的参数 中,就像从一个变量复制到另一个变量一样。如果是原始值,那么就跟原始值变量的复制一样,如果是 引用值,那么就跟引用值变量的复制一样。

在按值传递参数时,值会被复制到一个局部变量(即一个命名参数,或者用 ECMAScript 的话说, 就是 arguments 对象中的一个槽位)。

function addTen(num) { 
 num += 10; 
 return num; 
} 
let count = 20; 
let result = addTen(count); 
console.log(count); // 20,没有变化
console.log(result); // 30 

在按引用传递参数时,值在内存中的位置会被保存在一个局部变 量,这意味着对本地变量的修改会反映到函数外部。(这在 ECMAScript 中是不可能的。)

function setName(obj) { 
 obj.name = "Nicholas"; 
} 
let person = new Object(); 
setName(person); 
console.log(person.name); // "Nicholas" 

对象并把它保存在变量 person 中。然后,这个对象被传给 setName() 方法,并被复制到参数 obj 中。在函数内部,obj 和 person 都指向同一个对象。结果就是,即使对象 是按值传进函数的,obj 也会通过引用访问对象。当函数内部给 obj 设置了 name 属性时,函数外部的 对象也会反映这个变化,因为 obj 指向的对象保存在全局作用域的堆内存上。

function setName(obj) { 
 obj.name = "Nicholas"; 
 obj = new Object(); 
 obj.name = "Greg"; 
} 
let person = new Object(); 
setName(person); 
console.log(person.name); // "Nicholas"

7.4 确定类型

如果值是对象或 null,那么 typeof  返回"object",

let s = "Nicholas"; 
let b = true; 
let i = 22; 
let u; 
let n = null; 
let o = new Object(); 
console.log(typeof s); // string 
console.log(typeof i); // number 
console.log(typeof b); // boolean 
console.log(typeof u); // undefined 
console.log(typeof n); // object 
console.log(typeof o); // object 

所有引用值都是 Object 的实例,因此通过 instanceof 操作符检测任何引用值和 Object 构造函数都会返回 true。类似地,如果用 instanceof 检测原始值,则始终会返回 false, 因为原始值不是对象。

8.执行上下文与作用域

在浏览器中,全局上下文就是我们常说的 window 对象,因此所有通过 var 定 义的全局变量和函数都会成为 window 对象的属性和方法。使用 let 和 const 的顶级声明不会定义在全变 局上下文中,但在作用域链解析上效果是一样的。

var color = "blue"; 
function changeColor() { 
 let anotherColor = "red"; 
 function swapColors() { 
 let tempColor = anotherColor; 
 anotherColor = color; 
 color = tempColor; 
 // 这里可以访问 color、anotherColor 和 tempColor 
 } 
 // 这里可以访问 color 和 anotherColor,但访问不到 tempColor 
 swapColors(); 
} 
// 这里只能访问 color 
changeColor(); 

以上代码涉及 3 个上下文:全局上下文、changeColor()的局部上下文和 swapColors()的局部 上下文。全局上下文中有一个变量 color 和一个函数 changeColor()。changeColor()的局部上下文中 有一个变量 anotherColor 和一个函数 swapColors(),但在这里可以访问全局上下文中的变量 color。 swapColors()的局部上下文中有一个变量 tempColor,只能在这个上下文中访问到。全局上下文和 changeColor()的局部上下文都无法访问到 tempColor。而在 swapColors()中则可以访问另外两个 上下文中的变量,因为它们都是父上下文。

 8.1 变量声明

        1.使用var的函数作用域声明

function add(num1, num2) { 
 var sum = num1 + num2; 
 return sum; 
} 
let result = add(10, 20); // 30 
console.log(sum); // 报错:sum 在这里不是有效变量

如果变量未经声明就被初始化了, 那么它就会自动被添加到全局上下文

function add(num1, num2) { 
 sum = num1 + num2; 
 return sum; 
} 
let result = add(10, 20); // 30 
console.log(sum); // 30 

var 声明会被拿到函数或全局作用域的顶部,位于作用域中所有代码之前。这个现象叫作“提升” (hoisting)。

var name = "Jake"; 
// 等价于:
name = 'Jake'; 
var name; 
下面是两个等价的函数:
function fn1() { 
 var name = 'Jake'; 
} 
// 等价于:
function fn2() { 
 var name; 
 name = 'Jake'; 
} 

通过在声明之前打印变量,可以验证变量会被提升。声明的提升意味着会输出 undefined 而不是 Reference Error:

console.log(name); // undefined 
var name = 'Jake'; 
function() { 
 console.log(name); // undefined 
 var name = 'Jake'; 
} 

        2. 使用 let 的块级作用域声明

块 级作用域由最近的一对包含花括号{}界定。换句话说,if 块、while 块、function 块,甚至连单独 的块也是 let 声明变量的作用域

if (true) { 
 let a; 
} 
console.log(a); // ReferenceError: a 没有定义
while (true) { 
 let b; 
} 
console.log(b); // ReferenceError: b 没有定义
function foo() { 
 let c; 
} 
console.log(c); // ReferenceError: c 没有定义
 // 这没什么可奇怪的
 // var 声明也会导致报错
// 这不是对象字面量,而是一个独立的块
// JavaScript 解释器会根据其中内容识别出它来
{ 
 let d; 
} 
console.log(d); // ReferenceError: d 没有定义

let 与 var 的另一个不同之处是在同一作用域内不能声明两次。重复的 var 声明会被忽略,而重 复的 let 声明会抛出 SyntaxError。

var a; 
var a; 
// 不会报错
{ 
 let b; 
 let b; 
} 
// SyntaxError: 标识符 b 已经声明过了

let 的行为非常适合在循环中声明迭代变量。使用 var 声明的迭代变量会泄漏到循环外部,这种情 况应该避免。

for (var i = 0; i < 10; ++i) {} 
console.log(i); // 10 
for (let j = 0; j < 10; ++j) {} 
console.log(j); // ReferenceError: j 没有定义

        3. 使用 const 的常量声明

使用 const 声明的变量必须同时初始化为某个值。 一经声明,在其生命周期的任何时候都不能再重新赋予新值。

const a; // SyntaxError: 常量声明时没有初始化
const b = 3; 
console.log(b); // 3 
b = 4; // TypeError: 给常量赋值

const 除了要遵循以上规则,其他方面与 let 声明是一样的:

if (true) { 
 const a = 0; 
} 
console.log(a); // ReferenceError: a 没有定义
while (true) { 
 const b = 1; 
} 
console.log(b); // ReferenceError: b 没有定义
function foo() { 
 const c = 2; 
} 
console.log(c); // ReferenceError: c 没有定义
{ 
 const d = 3; 
} 
console.log(d); // ReferenceError: d 没有定义

const 声明只应用到顶级原语或者对象。换句话说,赋值为对象的 const 变量不能再被重新赋值 为其他引用值,但对象的键则不受限制。

const o1 = {}; 
o1 = {}; // TypeError: 给常量赋值
const o2 = {}; 
o2.name = 'Jake'; 
console.log(o2.name); // 'Jake' 

十八、Web APIs

1. Web APIs 和 JS 基础关联性

1.1 JS的组成

JavaScript学习笔记--【黑马程序员】_第246张图片

 1.2 JS基础阶段以及Web APIs阶段

2.API(接口)和Web API(浏览器接口)

JavaScript学习笔记--【黑马程序员】_第247张图片

 JavaScript学习笔记--【黑马程序员】_第248张图片

2.3 API和Web API总结

 JavaScript学习笔记--【黑马程序员】_第249张图片

 2.4 什么是DOM

JavaScript学习笔记--【黑马程序员】_第250张图片

2.5 DOM树

 JavaScript学习笔记--【黑马程序员】_第251张图片

2.6 DOM对象

 JavaScript学习笔记--【黑马程序员】_第252张图片


    
    
    
  

十九、DOM元素的获取

1.根据CSS选择器来获取DOM元素(必须是字符串,也就是必须加引号;如果是类选择器前面加“.";如果是id选择器前面加"#")

        1.1 选择匹配的第一个元素--document.querySelector('CSS选择器')

JavaScript学习笔记--【黑马程序员】_第253张图片

         1.2 选择匹配的多个元素(得到的是一个伪数组)--document.querySelectorAll('CSS选择器')

JavaScript学习笔记--【黑马程序员】_第254张图片

JavaScript学习笔记--【黑马程序员】_第255张图片

JavaScript学习笔记--【黑马程序员】_第256张图片


    
盒子1
盒子2
  • 首页
  • 产品

 2.其他获取DOM元素方法

        根据id获取一个元素-->document.getElementById('nav')


    
2019-9-9

        根据标签获取一类元素 获取页面 所有div(返回的是伪数组) ---->document.getElementsByTagName('div')


    
  • 知否知否,应是等你好久11
  • 知否知否,应是等你好久11
  • 知否知否,应是等你好久11
  • 知否知否,应是等你好久11
  1. 生僻字
  2. 生僻字
  3. 生僻字
  4. 生僻字

        根据类名获取元素 获取页面 所有类名为w的 --->document.getElementByClassName('w')


    
盒子1
盒子2
  • 首页
  • 产品

 获取某一个元素(父元素)内部所有指定标签的子元素--element(父元素).getElementsByTagName('标签名')


    
  1. 生僻字
  2. 生僻字
  3. 生僻字
  4. 生僻字

3. 获取HTML和Body标签

JavaScript学习笔记--【黑马程序员】_第257张图片


    

二十、事件基础

1. 事件基础

JavaScript学习笔记--【黑马程序员】_第258张图片


    
    

2.事件三要素

1. 事件源 (谁)
2. 事件类型 (什么事件)
3. 事件处理程序 (做啥)


    
123

【案例: 点击按钮弹出警示框】

JavaScript学习笔记--【黑马程序员】_第259张图片

var btn = document.getElementById('btn');
btn.onclick = function() {
alert('你好吗');
};

3.执行事件的步骤

1. 获取事件源
2. 注册事件(绑定事件)
3. 添加事件处理程序(采取函数赋值形式)






某个时间

1123

4.常见的鼠标事件

JavaScript学习笔记--【黑马程序员】_第260张图片

  

二十一、设置/修改DOM元素内容

1. document.write()方法

  1. 只能将文本内容追加到前面的位置
  2. 文本中包含的标签会被解析
//永远都只能追加操作,且只能位置前
document.write('Hello World')
document.write('

你好

')

2.对象.innerText属性

  1. 将文本内容添加/更新到任意标签位置
  2. 文本中包含的标签不会被解析
  3. innerText 不识别html标签 非标准 去除空格和换行
    

3.对象.innerHTML属性

  1.   将文本内容添加/更新到任意标签位置
  2. 文本中包含的标签会被解析
  3. innerHTML 识别html标签 W3C标准 保留空格和换行的
//innerHTML属性
box.innerHTML='

前端程序员

'

4.三种方法的总结和区别

JavaScript学习笔记--【黑马程序员】_第261张图片


    

我是文字 123

JavaScript学习笔记--【黑马程序员】_第262张图片

5.常见元素的属性操作

JavaScript学习笔记--【黑马程序员】_第263张图片


    
     

 6.案例

 【分时显示不同图片,显示不同问候语】

JavaScript学习笔记--【黑马程序员】_第264张图片

JavaScript学习笔记--【黑马程序员】_第265张图片

    



    
    
上午好

 7.表单元素的属性操作


    
    
    

【案例-- 仿京东显示密码】

JavaScript学习笔记--【黑马程序员】_第266张图片

    



    

  8. 样式属性操作

我们可以通过 JS 修改元素的大小、颜色、位置等样式。

JavaScript学习笔记--【黑马程序员】_第267张图片

  • element.style---行内样式操作
  •     
    
    
    
        
  • element.className---类名样式操作 
  1. 1.如果样式修改较多,可以采用操作类名方式更改元素样式
  2. 2.class因为是个保留字,因此使用className来操作元素类名属性
  3. className直接更改元素的类名,会覆盖原来的类名
  4. 如果想要保留原先的类名,我们可以这么做 多类名选择器(原来的类名 新的类名)
    




    
文本

【 案例: 淘宝点击关闭二维码】

JavaScript学习笔记--【黑马程序员】_第268张图片

JavaScript学习笔记--【黑马程序员】_第269张图片

    



    
淘宝二维码 ×

 【案例: 循环精灵图背景】

JavaScript学习笔记--【黑马程序员】_第270张图片

JavaScript学习笔记--【黑马程序员】_第271张图片

    



    

 【案例:显示隐藏文本框内容】

JavaScript学习笔记--【黑马程序员】_第272张图片

JavaScript学习笔记--【黑马程序员】_第273张图片

    
    

【案例: 密码框格式提示错误信息】

JavaScript学习笔记--【黑马程序员】_第274张图片

   
 



    

请输入6~16位密码

 9.操作元素总结

JavaScript学习笔记--【黑马程序员】_第275张图片

10.排他思想

 JavaScript学习笔记--【黑马程序员】_第276张图片


    
    
    
    
    
    

 【案例:百度换肤】

  
  



    

 【案例:表格隔行变色】

JavaScript学习笔记--【黑马程序员】_第277张图片

JavaScript学习笔记--【黑马程序员】_第278张图片

    



    
代码 名称 最新公布净值 累计净值 前单位净值 净值增长率
003526 农银金穗3个月定期开放债券 1.075 1.079 1.074 +0.047%
003526 农银金穗3个月定期开放债券 1.075 1.079 1.074 +0.047%
003526 农银金穗3个月定期开放债券 1.075 1.079 1.074 +0.047%
003526 农银金穗3个月定期开放债券 1.075 1.079 1.074 +0.047%
003526 农银金穗3个月定期开放债券 1.075 1.079 1.074 +0.047%
003526 农银金穗3个月定期开放债券 1.075 1.079 1.074 +0.047%

 【案例:表单全选取消全选案例】

JavaScript学习笔记--【黑马程序员】_第279张图片

JavaScript学习笔记--【黑马程序员】_第280张图片

 
   




    
商品 价钱
iPhone8 8000
iPad Pro 5000
iPad Air 2000
Apple Watch 2000

 11.自定义属性的操作

1. 获取属性值

  1. element.属性
  2. element.getAttribute('自定义属性')--最主要用于获取自定义属性

JavaScript学习笔记--【黑马程序员】_第281张图片


    

2.设置属性值

  1.  element.属性='值'
  2. element.setAttribute('属性‘,’值')--常用于自定义

JavaScript学习笔记--【黑马程序员】_第282张图片


    

3.移除属性

  1. element.removeAttrubute('属性')

 


    

【 案例:tab 栏切换(重点案例)】

JavaScript学习笔记--【黑马程序员】_第283张图片

JavaScript学习笔记--【黑马程序员】_第284张图片

JavaScript学习笔记--【黑马程序员】_第285张图片

    



    
  • 商品介绍
  • 规格与包装
  • 售后保障
  • 商品评价(50000)
  • 手机社区
商品介绍模块内容
规格与包装模块内容
售后保障模块内容
商品评价(50000)模块内容
手机社区模块内容

 12.H5自定义属性--只能通过getAttriubute

JavaScript学习笔记--【黑马程序员】_第286张图片

12.1 设置H5自定义属性----data-index="2"/div.setAttribute('data-time', 20)

JavaScript学习笔记--【黑马程序员】_第287张图片


    

12.2 获取H5自定义属性 ---element.getAttrubute('data-index')/element.dataset.index/element.dataset['index']

  • h5新增的获取自定义属性的方法 它只能获取data-开头的
  • dataset 是一个集合里面存放了所有以data开头的自定义属性
  • 如果自定义属性里面有多个-链接的单词,我们获取的时候采取 驼峰命名法


    

二十二、节点操作

1.为什么学节点操作

JavaScript学习笔记--【黑马程序员】_第288张图片

2.节点概述

 JavaScript学习笔记--【黑马程序员】_第289张图片

JavaScript学习笔记--【黑马程序员】_第290张图片


    
    
我是div
我是span
  • 我是li
  • 我是li
  • 我是li
  • 我是li
×

3.节点层级

 JavaScript学习笔记--【黑马程序员】_第291张图片

3.1 父级节点--node.parentNode

 


    
    
我是div
我是span
  • 我是li
  • 我是li
  • 我是li
  • 我是li
×

3.2 子节点(总结:无论用什么都是“父节点.children【】”)

        (1)parentNode.childNodes(标准)--一般不用这个(因为包括其他元素)

  • 注意点:
  • 返回值包含了所有的子节点,包括元素节点,文本节点等

JavaScript学习笔记--【黑马程序员】_第292张图片

         (2)parentNode.children(非标准)--主要用这个(因为直接获得相要的元素)JavaScript学习笔记--【黑马程序员】_第293张图片


    
    
我是div
我是span
  • 我是li
  • 我是li
  • 我是li
  • 我是li
  1. 我是li
  2. 我是li
  3. 我是li
  4. 我是li
×

         (3)parentNode.firstChild--一般不用这个(因为包括其他元素)

  firstChild 返回第一个子节点,找不到则返回null。同样,也是包含所有的节点。

        (4)parentNode.lastChild--一般不用这个(因为包括其他元素)

lastChild 返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点。

        (5). parentNode.firstElementChild--一般不用(因为i9才支持)
firstElementChild 返回第一个子元素节点,找不到则返回null。


        (6). parentNode.lastElementChild--一般不用(因为i9才支持)
lastElementChild 返回最后一个子元素节点,找不到则返回null。

    (7) 实际开发中, 既没有兼容性问题又返回第一个子元素
 

        console.log(ol.children[0]);
        console.log(ol.children[ol.children.length - 1]);

JavaScript学习笔记--【黑马程序员】_第294张图片


    
  1. 我是li1
  2. 我是li2
  3. 我是li3
  4. 我是li4
  5. 我是li5

【案例:下拉菜单】

JavaScript学习笔记--【黑马程序员】_第295张图片

 JavaScript学习笔记--【黑马程序员】_第296张图片

 
   



    
  • 微博
    • 私信
    • 评论
    • @我
  • 微博
    • 私信
    • 评论
    • @我
  • 微博
    • 私信
    • 评论
    • @我
  • 微博
    • 私信
    • 评论
    • @我

3.3 兄弟节点

1. node.nextSibling--一般不用这个(因为包括其他元素)
nextSibling 返回当前元素的下一个兄弟元素节点,找不到则返回null。同样,也是包含所有的节点。
2. node.previousSibling--一般不用这个(因为包括其他元素)
previousSibling 返回当前元素上一个兄弟元素节点,找不到则返回null。同样,也是包含所有的节点

3. node.nextElementSibling--主要用这个(因为直接获得相要的元素)
nextElementSibling 返回当前元素下一个兄弟元素节点,找不到则返回null。
4. node.previousElementSibling--主要用这个(因为直接获得相要的元素)
previousElementSibling 返回当前元素上一个兄弟节点,找不到则返回null


    
我是div
我是span

JavaScript学习笔记--【黑马程序员】_第297张图片

  3.4 创建节点

document.createElement('tagName')
document.createElement() 方法创建由 tagName 指定的 HTML 元素。因为这些元素原先不存在,
是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。

4.4 添加节点

1. node(父亲).appendChild(child)
node.appendChild() 方法将一个节点添加到指定父节点的子节点列表末尾。类似于 CSS 里面的
after 伪元素。
2. node.insertBefore(child, 指定元素)
node.insertBefore() 方法将一个节点添加到父节点的指定子节点前面。类似于 CSS 里面的 before
伪元素


    
  • 123

【案例:简单版发布留言案例】

JavaScript学习笔记--【黑马程序员】_第298张图片

    



    
    
    

4.5 删除节点

node.removeChild(child)
node.removeChild() 方法从 DOM 中删除一个子节点,返回删除的节点。


    
    
  • 熊大
  • 熊二
  • 光头强

【案例:删除留言案例】

阻止链接跳转:删除

JavaScript学习笔记--【黑马程序员】_第299张图片

    



    
    
    

4.6 复制节点(克隆节点)--node.cloneNode(false)-->不复制内容/node.cloneNode(true)-->复制内容

node.cloneNode()
node.cloneNode() 方法返回调用该方法的节点的一个副本。 也称为克隆节点/拷贝节点
5.6 复制节点(克隆节点)
注意:
1. 如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点(不复制内容)。
2.
如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子节点。


    
  • 1111
  • 2
  • 3

【案例:动态生成表格】

JavaScript学习笔记--【黑马程序员】_第300张图片

 JavaScript学习笔记--【黑马程序员】_第301张图片

   
 



    
姓名 科目 成绩 操作

4.7 三种动态创建元素区别

JavaScript学习笔记--【黑马程序员】_第302张图片

 document.write()--如果页面文档流加载完毕,再调用这句话会导致页面重绘

        1. document.write() 创建元素  如果页面文档流加载完毕,再调用这句话会导致页面重绘
         var btn = document.querySelector('button');
         btn.onclick = function() {
            document.write('
123
'); }

element.innerHTML

document.creatElement()

注意点:

  • 1. document.write 是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
  • 2. innerHTML 是将内容写入某个 DOM 节点,不会导致页面全部重绘
  • 3. innerHTML 创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
  • 4. createElement() 创建多个元素效率稍低一点点,但是结构更清晰
  • 总结:不同浏览器下,innerHTML 效率要比 creatElement 高


    
    

abc

element.innerHTML   与   document.creatElement()的效率对比


    
    效率测试




二十二、DOM重点核心

JavaScript学习笔记--【黑马程序员】_第303张图片

1.创建

 1. document.write
2. innerHTML

3. createElement

2.增

1. appendChild
2. insertBefore

3.删

1.. removeChild

4.改

1. 修改元素属性: src、href、title等
2. 修改普通元素内容: innerHTML 、innerText
3. 修改表单元素: value、type、disabled等
4. 修改元素样式: style、className

5.查

1. DOM提供的API 方法: getElementById、getElementsByTagName 古老用法 不太推荐
2. H5提供的新方法: querySelector、querySelectorAll 提倡
3. 利用节点操作获取元素: 父(parentNode)、子(children)、兄(previousElementSibling、
nextElementSibling)
提倡

6.属性操作

1. setAttribute:设置dom的属性值
2. getAttribute:得到dom的属性值
3. removeAttribute移除属性

7.事件操作

给元素注册事件, 采取 事件源.事件类型 = 事件处理程序

JavaScript学习笔记--【黑马程序员】_第304张图片

 7.1 注册事件两种方式

二十三、PC端网页特效

 1. 元素偏移量offset系列(包含边框的)

1.1 offset概述

offset 翻译过来就是偏移量, 我们使用 offset 系列相关属性可以动态的得到该元素的位置(偏移)、大小等。

  •  获得元素距离带有定位父元素的位置
  •  获得元素自身的大小(宽度高度)
  •  注意: 返回的数值都不带单位

JavaScript学习笔记--【黑马程序员】_第305张图片

    



    

JavaScript学习笔记--【黑马程序员】_第306张图片

1.2 offset 与 style 区别

JavaScript学习笔记--【黑马程序员】_第307张图片

    



    

 【案例:获取鼠标在盒子内的坐标】

JavaScript学习笔记--【黑马程序员】_第308张图片

    



    

【案例:模态框拖拽】

JavaScript学习笔记--【黑马程序员】_第309张图片

JavaScript学习笔记--【黑马程序员】_第310张图片





    


  
    
  
  
  



点击,弹出登录框
登录会员 关闭
登录会员

 【案例:仿京东放大镜】

html

        
        

css

.preview_img {
    position: relative;
    height: 398px;
    border: 1px solid #ccc;
}

.mask {
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    width: 300px;
    height: 300px;
    background: #FEDE4F;
    opacity: .5;
    border: 1px solid #ccc;
    cursor: move;
}

.big {
    display: none;
    position: absolute;
    left: 410px;
    top: 0;
    width: 500px;
    height: 500px;
    background-color: pink;
    z-index: 999;
    border: 1px solid #ccc;
    overflow: hidden;
}

JavaScript学习笔记--【黑马程序员】_第311张图片

JavaScript学习笔记--【黑马程序员】_第312张图片

window.addEventListener('load', function() {
    var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    // 1. 当我们鼠标经过 preview_img 就显示和隐藏 mask 遮挡层 和 big 大盒子
    preview_img.addEventListener('mouseover', function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    })
    preview_img.addEventListener('mouseout', function() {
            mask.style.display = 'none';
            big.style.display = 'none';
        })
})

window.addEventListener('load', function() {
    var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    // 1. 当我们鼠标经过 preview_img 就显示和隐藏 mask 遮挡层 和 big 大盒子
    preview_img.addEventListener('mouseover', function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    })
    preview_img.addEventListener('mouseout', function() {
            mask.style.display = 'none';
            big.style.display = 'none';
        })
        // 2. 鼠标移动的时候,让黄色的盒子跟着鼠标来走
    preview_img.addEventListener('mousemove', function(e) {
        // (1). 先计算出鼠标在盒子内的坐标
        //鼠标与盒子的距离==鼠标与页面的距离--盒子和页面的距离
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        // console.log(x, y);
        // (2) 减去盒子高度 300的一半 是 150 就是我们mask 的最终 left 和top值了(要让鼠标在黄色遮罩层的中间)
        // (3) 我们mask 移动的距离
        var maskX = x - mask.offsetWidth / 2;
        var maskY = y - mask.offsetHeight / 2;

    })

})

 JavaScript学习笔记--【黑马程序员】_第313张图片

window.addEventListener('load', function() {
    var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    // 1. 当我们鼠标经过 preview_img 就显示和隐藏 mask 遮挡层 和 big 大盒子
    preview_img.addEventListener('mouseover', function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    })
    preview_img.addEventListener('mouseout', function() {
            mask.style.display = 'none';
            big.style.display = 'none';
        })
        // 2. 鼠标移动的时候,让黄色的盒子跟着鼠标来走
    preview_img.addEventListener('mousemove', function(e) {
        // (1). 先计算出鼠标在盒子内的坐标
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        // console.log(x, y);
        // (2) 减去盒子高度 300的一半 是 150 就是我们mask 的最终 left 和top值了
        // (3) 我们mask 移动的距离
        var maskX = x - mask.offsetWidth / 2;
        var maskY = y - mask.offsetHeight / 2;
        // (4) 如果x 坐标小于了0 就让他停在0 的位置
        // 遮挡层的最大移动距离===最大盒子的宽度--黄色遮罩层的大小
        var maskMax = preview_img.offsetWidth - mask.offsetWidth;
        if (maskX <= 0) {
            maskX = 0;
        } else if (maskX >= maskMax) {
            maskX = maskMax;
        }
        if (maskY <= 0) {
            maskY = 0;
        } else if (maskY >= maskMax) {
            maskY = maskMax;
        }
        mask.style.left = maskX + 'px';
        mask.style.top = maskY + 'px';

    })

})

JavaScript学习笔记--【黑马程序员】_第314张图片

JavaScript学习笔记--【黑马程序员】_第315张图片

window.addEventListener('load', function() {
    var preview_img = document.querySelector('.preview_img');
    var mask = document.querySelector('.mask');
    var big = document.querySelector('.big');
    // 1. 当我们鼠标经过 preview_img 就显示和隐藏 mask 遮挡层 和 big 大盒子
    preview_img.addEventListener('mouseover', function() {
        mask.style.display = 'block';
        big.style.display = 'block';
    })
    preview_img.addEventListener('mouseout', function() {
            mask.style.display = 'none';
            big.style.display = 'none';
        })
        // 2. 鼠标移动的时候,让黄色的盒子跟着鼠标来走
    preview_img.addEventListener('mousemove', function(e) {
        // (1). 先计算出鼠标在盒子内的坐标
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        // console.log(x, y);
        // (2) 减去盒子高度 300的一半 是 150 就是我们mask 的最终 left 和top值了
        // (3) 我们mask 移动的距离
        var maskX = x - mask.offsetWidth / 2;
        var maskY = y - mask.offsetHeight / 2;
        // (4) 如果x 坐标小于了0 就让他停在0 的位置
        // 遮挡层的最大移动距离
        var maskMax = preview_img.offsetWidth - mask.offsetWidth;
        if (maskX <= 0) {
            maskX = 0;
        } else if (maskX >= maskMax) {
            maskX = maskMax;
        }
        if (maskY <= 0) {
            maskY = 0;
        } else if (maskY >= maskMax) {
            maskY = maskMax;
        }
        mask.style.left = maskX + 'px';
        mask.style.top = maskY + 'px';
        // 3. 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
        // 大图
        var bigIMg = document.querySelector('.bigImg');
        // 大图片最大移动距离
        var bigMax = bigIMg.offsetWidth - big.offsetWidth;
        // 大图片的移动距离 X Y
        var bigX = maskX * bigMax / maskMax;
        var bigY = maskY * bigMax / maskMax;
        //记得给图片加上定位
        //大图和遮罩层是反方向的
        bigIMg.style.left = -bigX + 'px';
        bigIMg.style.top = -bigY + 'px';

    })

})

2.元素可视区client系列(不包含边框的)

client 翻译过来就是客户端,我们使用 client 系列的相关属性来获取元素可视区的相关信息。通过 client 系列的相关属性可以动态的得到该元素的边框大小、元素大小等。

JavaScript学习笔记--【黑马程序员】_第316张图片

 JavaScript学习笔记--【黑马程序员】_第317张图片

    


    

 立即执行函数

如果有多个立即执行函数则每一个函数之间要用分号隔开

    

【案例: 淘宝 flexible.js 源码分析】

JavaScript学习笔记--【黑马程序员】_第318张图片

(function flexible(window, document) {
    // 获取的html 的根元素
    var docEl = document.documentElement
        // dpr 物理像素比
    var dpr = window.devicePixelRatio || 1

    // adjust body font size  设置我们body 的字体大小
    function setBodyFontSize() {
        // 如果页面中有body 这个元素 就设置body的字体大小
        if (document.body) {
            document.body.style.fontSize = (12 * dpr) + 'px'
        } else {
            // 如果页面中没有body 这个元素,则等着 我们页面主要的DOM元素加载完毕再去设置body
            // 的字体大小
            document.addEventListener('DOMContentLoaded', setBodyFontSize)
        }
    }
    setBodyFontSize();

    // set 1rem = viewWidth / 10    设置我们html 元素的文字大小
    function setRemUnit() {
        var rem = docEl.clientWidth / 10
        docEl.style.fontSize = rem + 'px'
    }

    setRemUnit()

    // reset rem unit on page resize  当我们页面尺寸大小发生变化的时候,要重新设置下rem 的大小
    window.addEventListener('resize', setRemUnit)
        // pageshow 是我们重新加载页面触发的事件
    window.addEventListener('pageshow', function(e) {
        // e.persisted 返回的是true 就是说如果这个页面是从缓存取过来的页面,也需要从新计算一下rem 的大小
        if (e.persisted) {
            setRemUnit()
        }
    })

    // detect 0.5px supports  有些移动端的浏览器不支持0.5像素的写法
    if (dpr >= 2) {
        var fakeBody = document.createElement('body')
        var testElement = document.createElement('div')
        testElement.style.border = '.5px solid transparent'
        fakeBody.appendChild(testElement)
        docEl.appendChild(fakeBody)
        if (testElement.offsetHeight === 1) {
            docEl.classList.add('hairlines')
        }
        docEl.removeChild(fakeBody)
    }
}(window, document))

3.元素滚动scroll系列

3.1  元素scroll系列属性

scroll 翻译过来就是滚动的,我们使用 scroll 系列的相关属性可以动态的得到该元素的大小、滚动距离等。

元素被卷去的头部是 element.scrollTop , 如果是页面被卷去的头部 则是 window.pageYOffset

JavaScript学习笔记--【黑马程序员】_第319张图片

JavaScript学习笔记--【黑马程序员】_第320张图片

    



    
我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容 我是内容

3.2 页面被卷去的头部

 如果浏览器的高(或宽)度不足以显示整个页面时,会自动出现滚动条。当滚动条向下滚动时,页面上面被隐藏掉的高度,我们就称为页面被卷去的头部。滚动条在滚动时会触发 onscroll 事件。

【案例:仿淘宝固定右侧侧边栏】

JavaScript学习笔记--【黑马程序员】_第321张图片

 JavaScript学习笔记--【黑马程序员】_第322张图片

JavaScript学习笔记--【黑马程序员】_第323张图片

    



    
返回顶部
头部区域
banner区域
主体部分

3.3 页面被卷去的头部兼容性解决方案 

需要注意的是,页面被卷去的头部,有兼容性问题,因此被卷去的头部通常有如下几种写法:
1. 声明了 DTD,使用 document.documentElement.scrollTop
2. 未声明 DTD,使用 document.body.scrollTop
3. 新方法 window.pageYOffset 和 window.pageXOffset,IE9 开始支持

JavaScript学习笔记--【黑马程序员】_第324张图片

4.offset、client、scroll总结

JavaScript学习笔记--【黑马程序员】_第325张图片

 JavaScript学习笔记--【黑马程序员】_第326张图片

1. offset系列 经常用于获得元素位置 offsetLeft offsetTop
2. client 经常用于获取元素大小 clientWidth clientHeight
3. scroll 经常用于获取滚动距离 scrollTop scrollLeft


4. 注意页面滚动的距离通过 window.pageXOffset 获得

5.mouseenter 【一般跟mouseleave】(不会冒泡)和mouseover(会冒泡)的区别

 当鼠标移动到元素上时就会触发 mouseenter 事件
 类似 mouseover,它们两者之间的差别是
 mouseover 鼠标经过自身盒子会触发,经过子盒子还会触发。 mouseenter 只会经过自身盒子触发
 之所以这样,就是因为mouseenter不会冒泡
跟mouseenter搭配 鼠标离开 mouseleave 同样不会冒泡

    



    

6.动画函数封装

6.1 动画实现原理:通过定时器 setInterval() 不断移动盒子位置。

JavaScript学习笔记--【黑马程序员】_第327张图片

    



    

6.2 动画函数简单封装==动画对象+移动到的距离

注意函数需要传递2个参数,动画对象和移动到的距离

    



    
夏雨荷

6.3 动画函数给不同元素记录不同定时器

JavaScript学习笔记--【黑马程序员】_第328张图片

    



    
    
夏雨荷

6.4 缓动效果原理:步长公式:(目标值 - 现在的位置) / 10

 JavaScript学习笔记--【黑马程序员】_第329张图片JavaScript学习笔记--【黑马程序员】_第330张图片

    



    
    夏雨荷
    

6.5 动画函数多个目标值之间移动

 JavaScript学习笔记--【黑马程序员】_第331张图片


    
    
    夏雨荷
    

6.6 动画函数添加回调函数(写在定时器结束的位置)

 JavaScript学习笔记--【黑马程序员】_第332张图片

    



    
    
    夏雨荷
    

 6.7 动画函数封装到单独JS文件里面

JavaScript学习笔记--【黑马程序员】_第333张图片

    
    



    
←
问题反馈

6.常见网页特效案例

【案例:网页轮播图】

JavaScript学习笔记--【黑马程序员】_第334张图片

JavaScript学习笔记--【黑马程序员】_第335张图片

 左右两边的按钮

JavaScript学习笔记--【黑马程序员】_第336张图片

// 先让其他文件加载完在执行js
window.addEventListener('load', function() {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    // 2. 鼠标经过focus 就显示隐藏左右按钮
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
    })
})


 动态生成小圆点

JavaScript学习笔记--【黑马程序员】_第337张图片

    //3.动态生成小圆点  有几张图片,我就生成几个小圆点
    //因为ul和ol很多 加上focus可以缩小范围
    var ul=focus.querySelector('ul')
    var ol=focus.querySelector('.circle')
    //先求出ul中有多少个li
    for(var i=0;i

JavaScript学习笔记--【黑马程序员】_第338张图片

    //3.动态生成小圆点  有几张图片,我就生成几个小圆点
    //因为ul和ol很多 加上focus可以缩小范围
    var ul=focus.querySelector('ul')
    var ol=focus.querySelector('.circle')
    //先求出ul中有多少个li
    for(var i=0;i

 点击小圆圈实现图片滚动

JavaScript学习笔记--【黑马程序员】_第339张图片

// 先让其他文件加载完在执行js
window.addEventListener('load', function() {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    // 2. 鼠标经过focus 就显示隐藏左右按钮
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
    })


    //3.动态生成小圆点  有几张图片,我就生成几个小圆点
    //因为ul和ol很多 加上focus可以缩小范围
    var ul=focus.querySelector('ul')
    var ol=focus.querySelector('.circle')
    //先求出ul中有多少个li
    for(var i=0;i

 图片的无缝滚动(将第一张图片复制到最后)

JavaScript学习笔记--【黑马程序员】_第340张图片

 JavaScript学习笔记--【黑马程序员】_第341张图片

// 先让其他文件加载完在执行js
window.addEventListener('load', function() {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    //图片的宽度 因为要经常用到 所以当中全局变量
    var focusWidth=focus.offsetWidth;
    // 2. 鼠标经过focus 就显示隐藏左右按钮
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
    })


    //3.动态生成小圆点  有几张图片,我就生成几个小圆点
    //因为ul和ol很多 加上focus可以缩小范围
    var ul=focus.querySelector('ul')
    var ol=focus.querySelector('.circle')
    //先求出ul中有多少个li
    for(var i=0;i

克隆图片---并使得不添加小圆圈 

// 先让其他文件加载完在执行js
window.addEventListener('load', function() {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    //图片的宽度 因为要经常用到 所以当中全局变量
    var focusWidth=focus.offsetWidth;
    // 2. 鼠标经过focus 就显示隐藏左右按钮
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
    })


    //3.动态生成小圆点  有几张图片,我就生成几个小圆点
    //因为ul和ol很多 加上focus可以缩小范围
    var ul=focus.querySelector('ul')
    var ol=focus.querySelector('.circle')
    //先求出ul中有多少个li
    for(var i=0;i

 小圆圈跟随左按钮

JavaScript学习笔记--【黑马程序员】_第342张图片

            //【问题:当我们点击小圆圈的第二个的时候 点击右侧按钮的时候 图片却出现上一张照片】
            //当我们点击某一个小li的时候 就拿到当前的li的索引号
            num=index;
            //当我们点击某一个小li的时候 就拿到当前的li的索引号
            num=circle;

 左侧按钮

JavaScript学习笔记--【黑马程序员】_第343张图片

// 先让其他文件加载完在执行js
window.addEventListener('load', function() {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    //图片的宽度 因为要经常用到 所以当中全局变量
    var focusWidth=focus.offsetWidth;
    // 2. 鼠标经过focus 就显示隐藏左右按钮
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
    })


    //3.动态生成小圆点  有几张图片,我就生成几个小圆点
    //因为ul和ol很多 加上focus可以缩小范围
    var ul=focus.querySelector('ul')
    var ol=focus.querySelector('.circle')
    //先求出ul中有多少个li
    for(var i=0;i

自动播放功能【添加和删除定时器】 

JavaScript学习笔记--【黑马程序员】_第344张图片

window.addEventListener('load', function() {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    var focusWidth = focus.offsetWidth;
    // 2. 鼠标经过focus 就显示隐藏左右按钮
    focus.addEventListener('mouseenter', function() {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
        //当鼠标在图片上面的时候 自动播放功能要停止
        clearInterval(timer);
        timer = null; // 清除定时器变量
    });
    focus.addEventListener('mouseleave', function() {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
        //当鼠标移开的时候 自动播放功能要继续开启
        timer = setInterval(function() {
            //手动调用点击事件
            arrow_r.click();
        }, 2000);
    });
    // 3. 动态生成小圆圈  有几张图片,我就生成几个小圆圈
    var ul = focus.querySelector('ul');
    var ol = focus.querySelector('.circle');
    // console.log(ul.children.length);
    for (var i = 0; i < ul.children.length; i++) {
        // 创建一个小li 
        var li = document.createElement('li');
        // 记录当前小圆圈的索引号 通过自定义属性来做 
        li.setAttribute('index', i);
        // 把小li插入到ol 里面
        ol.appendChild(li);
        // 4. 小圆圈的排他思想 我们可以直接在生成小圆圈的同时直接绑定点击事件
        li.addEventListener('click', function() {
            // 干掉所有人 把所有的小li 清除 current 类名
            for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 留下我自己  当前的小li 设置current 类名
            this.className = 'current';
            // 5. 点击小圆圈,移动图片 当然移动的是 ul 
            // ul 的移动距离 小圆圈的索引号 乘以 图片的宽度 注意是负值
            // 当我们点击了某个小li 就拿到当前小li 的索引号
            var index = this.getAttribute('index');
            // 当我们点击了某个小li 就要把这个li 的索引号给 num  
            num = index;
            // 当我们点击了某个小li 就要把这个li 的索引号给 circle  
            circle = index;
            // num = circle = index;
            console.log(focusWidth);
            console.log(index);

            animate(ul, -index * focusWidth);
        })
    }
    // 把ol里面的第一个小li设置类名为 current
    ol.children[0].className = 'current';
    // 6. 克隆第一张图片(li)放到ul 最后面
    var first = ul.children[0].cloneNode(true);
    ul.appendChild(first);
    // 7. 点击右侧按钮, 图片滚动一张
    var num = 0;
    // circle 控制小圆圈的播放
    var circle = 0;
    // flag 节流阀
    var flag = true;
    arrow_r.addEventListener('click', function() {
        if (flag) {
            flag = false; // 关闭节流阀
            // 如果走到了最后复制的一张图片,此时 我们的ul 要快速复原 left 改为 0
            if (num == ul.children.length - 1) {
                ul.style.left = 0;
                num = 0;
            }
            num++;
            animate(ul, -num * focusWidth, function() {
                flag = true; // 打开节流阀
            });
            // 8. 点击右侧按钮,小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放
            circle++;
            // 如果circle == 4 说明走到最后我们克隆的这张图片了 我们就复原
            if (circle == ol.children.length) {
                circle = 0;
            }
            // 调用函数
            circleChange();
        }
    });

    // 9. 左侧按钮做法
    arrow_l.addEventListener('click', function() {
        if (flag) {
            flag = false;
            if (num == 0) {
                num = ul.children.length - 1;
                ul.style.left = -num * focusWidth + 'px';

            }
            num--;
            animate(ul, -num * focusWidth, function() {
                flag = true;
            });
            // 点击左侧按钮,小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放
            circle--;
            // 如果circle < 0  说明第一张图片,则小圆圈要改为第4个小圆圈(3)
            // if (circle < 0) {
            //     circle = ol.children.length - 1;
            // }
            circle = circle < 0 ? ol.children.length - 1 : circle;
            // 调用函数
            circleChange();
        }
    });

    function circleChange() {
        // 先清除其余小圆圈的current类名
        for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = '';
        }
        // 留下当前的小圆圈的current类名
        ol.children[circle].className = 'current';
    }
    // 10. 自动播放轮播图
    var timer = setInterval(function() {
        //手动调用点击事件
        arrow_r.click();
    }, 2000);

})

6.1 节流阈(防止动画过快--【使用回调函数】)

 开始设置一个变量 var flag = true;
If(flag) {flag = false; do something} 关闭水龙头
利用回调函数 动画执行完毕, flag = true 打开水龙头
JavaScript学习笔记--【黑马程序员】_第345张图片【案例:返回顶部】

JavaScript学习笔记--【黑马程序员】_第346张图片

JavaScript学习笔记--【黑马程序员】_第347张图片





    
    
    
    Document
    



    
返回顶部
头部区域
banner区域
主体部分

 【案例:筋头云案例】

JavaScript学习笔记--【黑马程序员】_第348张图片

JavaScript学习笔记--【黑马程序员】_第349张图片





    
    
    
    
    



    
  • 首页新闻
  • 师资力量
  • 活动策划
  • 企业文化
  • 招聘信息
  • 公司简介
  • 我是佩奇
  • 啥是佩奇

二十四、事件高级

1.注册事件(绑定事件)

1.1 注册事件概述:传统方式   VS  方法监听注册事件 

JavaScript学习笔记--【黑马程序员】_第350张图片

  btns[0].onclick = function() {}

使用时后面会将前面的进行覆盖


    
    
    

1.2 addEventListener事件监听方式

eventTarget.addEventListener('事件类型', listener[, useCapture])

JavaScript学习笔记--【黑马程序员】_第351张图片

  •  (1) 里面的事件类型是字符串 必定加引号 而且不带on
  •  (2) 同一个元素 同一个事件可以添加多个侦听器(事件处理程序)

    
    
    

 1.3 attachEvent 注册事件 事件监听方式

eventTarget.attachEvent(eventNameWithOn, callback)

JavaScript学习笔记--【黑马程序员】_第352张图片

注意点:

  1. 事件类型是字符串,且要加上on

    
    
    
    

1.4 注册事件兼容性解决方案

 兼容性处理的原则: 首先照顾大多数浏览器,再处理特殊浏览器

    

2删除事件(解绑事件)

2.1 删除事件的方式

        1. 传统注册方式
eventTarget.onclick = null;

    

    
1
2
3


        2. 方法监听注册方式
① eventTarget.removeEventListener(type, listener[, useCapture]);

    

    
1
2
3


② eventTarget.detachEvent(eventNameWithOn, callback);

    

    
1
2
3

2.2 删除事件兼容性解决方案

    

3.DOM事件流

JavaScript学习笔记--【黑马程序员】_第353张图片

JavaScript学习笔记--【黑马程序员】_第354张图片

事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即 DOM 事件流。 

注意
1. JS 代码中只能执行捕获或者冒泡其中的一个阶段。
2. onclick 和 attachEvent 只能得到冒泡阶段。
3.
addEventListener(type, listener[, useCapture])第三个参数如果是 true,表示在事件捕
获阶段调用事件处理程序;如果是 false(不写默认就是false),表示在事件冒泡阶段调用事件处理程序
。
4. 实际开发中我们很少使用事件捕获,我们更关注事件冒泡。
5. 有些事件是没有冒泡的,比如 onblur、onfocus、onmouseenter、onmouseleave
6. 事件冒泡有时候会带来麻烦,有时候又会帮助很巧妙的做某些事件,我们后面讲解。


    
son盒子

4.事件对象

4.1 什么是事件对象

JavaScript学习笔记--【黑马程序员】_第355张图片

    



    
123

4.2 事件对象的使用语法

    

 这个 event 是个形参,系统帮我们设定为事件对象,不需要传递实参过去。
当我们注册事件时, event 对象就会被系统自动创建,并依次传递给事件监听器(事件处理函数)

4.3 事件对象的兼容性方案

JavaScript学习笔记--【黑马程序员】_第356张图片

4.4 事件对象的常见属性和方法

 e.target 点击了那个元素,就返回那个元素

this (currentTarget)那个元素绑定了这个点击事件,那么就返回谁JavaScript学习笔记--【黑马程序员】_第357张图片

    



    
123
  • abc
  • abc
  • abc

 JavaScript学习笔记--【黑马程序员】_第358张图片


    
123
百度

5.阻止事件冒泡

5.1 阻止事件冒泡的两种方式(stopPropagation())

事件冒泡:开始时由最具体的元素接收,然后逐级向上传播到到 DOM 最顶层节点。
事件冒泡本身的特性,会带来的坏处,也会带来的好处,需要我们灵活掌握。

 标准写法:利用事件对象里面的 stopPropagation()方法

e.stopPropagation()

非标准写法:IE 6-8 利用事件对象 cancelBubble 属性

e.cancelBubble = true;
    



    
son儿子

5.2 阻止事件冒泡的兼容性解决方案

if(e && e.stopPropagation){
    e.stopPropagation();
}else{
    window.event.cancelBubble = true;
}

6.事件委托(代理,委派)

JavaScript学习笔记--【黑马程序员】_第359张图片

JavaScript学习笔记--【黑马程序员】_第360张图片

JavaScript学习笔记--【黑马程序员】_第361张图片

事件委托的原理
不是每个子节点单独设置事件监听器,
而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点。


    
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!
  • 知否知否,点我应有弹框在手!

7.常用的鼠标事件

7.1 常用的鼠标事件

JavaScript学习笔记--【黑马程序员】_第362张图片

1.禁止鼠标右键菜单---e.preventDefault()
contextmenu主要控制应该何时显示上下文菜单,主要用于程序员取消默认的上下文菜单 

document.addEventListener('contextmenu', function(e) {
        // 1. contextmenu 我们可以禁用右键菜单
    e.preventDefault();//阻止默认行为
})

2.禁止鼠标选中(selectstart 开始选中)

document.addEventListener('selectstart', function(e) {
            // 2. 禁止选中文字 selectstart
    e.preventDefault();//阻止默认行为
})

7.2 鼠标事件对象

JavaScript学习笔记--【黑马程序员】_第363张图片


    

 【案例: 跟随鼠标的天使】

JavaScript学习笔记--【黑马程序员】_第364张图片

JavaScript学习笔记--【黑马程序员】_第365张图片

    



    
    

8.常用的键盘事件

8.1 常用键盘事件

JavaScript学习笔记--【黑马程序员】_第366张图片

 注意:
1. 如果使用addEventListener 不需要加 on
2. onkeypress 和前面2个的区别是,它不识别功能键,比如左右箭头,shift 等。
3. 三个事件的执行顺序是: keydown -- keypress --- keyup

    

 8.2 键盘事件对象(keyCode--输出对应的ASCii)

 注意:

onkeydown 和 onkeyup 不区分字母大小写,onkeypress 区分字母大小写。
在我们实际开发中,我们更多的使用keydown和keyup, 它能识别所有的键(包括功能键)
Keypress 不识别功能键,但是keyCode属性能区分大小写,返回不同的ASCII值

    

 8.3 ASCII 表

JavaScript学习笔记--【黑马程序员】_第367张图片

 【案例: 模拟京东按键输入内容】

JavaScript学习笔记--【黑马程序员】_第368张图片

JavaScript学习笔记--【黑马程序员】_第369张图片


    
    

【案例: 模拟京东快递单号查询】

JavaScript学习笔记--【黑马程序员】_第370张图片

JavaScript学习笔记--【黑马程序员】_第371张图片

  
 



    
123

二十五、移动端网页特效

1.触屏事件

 1.1 触屏事件概述

JavaScript学习笔记--【黑马程序员】_第372张图片

    



    

1.2 触摸事件对象(TouchEvent)

 touchstart、touchmove、touchend 三个事件都会各自有事件对象

 JavaScript学习笔记--【黑马程序员】_第373张图片

    



    

1.3 移动端拖动元素

 JavaScript学习笔记--【黑马程序员】_第374张图片

    



    

2.移动端常见特效

【案例:移动端轮播图】

开头要将最后一张克隆放在最前面

JavaScript学习笔记--【黑马程序员】_第375张图片

JavaScript学习笔记--【黑马程序员】_第376张图片

自动播放 

JavaScript学习笔记--【黑马程序员】_第377张图片

window.addEventListener('load', function() {
    // alert(1);
    // 1. 获取元素 
    var focus = document.querySelector('.focus');
    var ul = focus.children[0];
    // 获得focus 的宽度
    var w = focus.offsetWidth;
    // 2. 利用定时器自动轮播图图片
    var index = 0;
    var timer = setInterval(function() {
        index++;
        var translatex = -index * w;
        //添加过度效果
        ul.style.transition = 'all .3s';
        ul.style.transform = 'translateX(' + translatex + 'px)';
    }, 2000);
})

 自动播放--无缝连接

JavaScript学习笔记--【黑马程序员】_第378张图片

window.addEventListener('load', function() {
    // alert(1);
    // 1. 获取元素 
    var focus = document.querySelector('.focus');
    var ul = focus.children[0];
    // 获得focus 的宽度
    var w = focus.offsetWidth;
    var ol = focus.children[1];
    // 2. 利用定时器自动轮播图图片
    var index = 0;
    var timer = setInterval(function() {
        index++;
        var translatex = -index * w;
        ul.style.transition = 'all .3s';
        ul.style.transform = 'translateX(' + translatex + 'px)';
    }, 2000);
    // 等着我们过渡完成之后,再去判断 监听过渡完成的事件 transitionend 
    ul.addEventListener('transitionend', function() {
        // 无缝滚动
        if (index >= 3) {
            index = 0;
            // console.log(index);
            // 去掉过渡效果 这样让我们的ul 快速的跳到目标位置
            ul.style.transition = 'none';
            // 利用最新的索引号乘以宽度 去滚动图片
            var translatex = -index * w;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        } else if (index < 0) {
            index = 2;
            ul.style.transition = 'none';
            // 利用最新的索引号乘以宽度 去滚动图片
            var translatex = -index * w;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        }
    })
})

2.1 classList

 classList属性是HTML5新增的一个属性,返回元素的类名。但是ie10以上版本支持。
该属性用于在元素中添加,移除及切换 CSS 类。有以下方法

注意以上方法里面,所有类名都不带点

         (1)添加类: 
element.classList.add(’类名’);

focus.classList.add(‘current’);

        (2) 移除类:
element.classList.remove(’类名’);

focus.classList.remove(‘current’);

        (3)切换类:
element.classList.toggle(’类名’);

focus.classList.toggle(‘current’);
    



    

【小圆点跟随变化效果】

JavaScript学习笔记--【黑马程序员】_第379张图片

window.addEventListener('load', function() {
    // alert(1);
    // 1. 获取元素 
    var focus = document.querySelector('.focus');
    var ul = focus.children[0];
    // 获得focus 的宽度
    var w = focus.offsetWidth;
    var ol = focus.children[1];
    // 2. 利用定时器自动轮播图图片
    var index = 0;
    var timer = setInterval(function() {
        index++;
        var translatex = -index * w;
        ul.style.transition = 'all .3s';
        ul.style.transform = 'translateX(' + translatex + 'px)';
    }, 2000);
    // 等着我们过渡完成之后,再去判断 监听过渡完成的事件 transitionend 
    ul.addEventListener('transitionend', function() {
        // 无缝滚动
        if (index >= 3) {
            index = 0;
            // console.log(index);
            // 去掉过渡效果 这样让我们的ul 快速的跳到目标位置
            ul.style.transition = 'none';
            // 利用最新的索引号乘以宽度 去滚动图片
            var translatex = -index * w;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        } else if (index < 0) {
            index = 2;
            ul.style.transition = 'none';
            // 利用最新的索引号乘以宽度 去滚动图片
            var translatex = -index * w;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        }
        // 3. 小圆点跟随变化
        // 把ol里面li带有current类名的选出来去掉类名 remove
        ol.querySelector('.current').classList.remove('current');
        // 让当前索引号 的小li 加上 current   add
        ol.children[index].classList.add('current');
    });
})

【手指滑动轮播图】

JavaScript学习笔记--【黑马程序员】_第380张图片

    // 4. 手指滑动轮播图 
    // 触摸元素 touchstart: 获取手指初始坐标
    var startX = 0;
    var moveX = 0; // 后面我们会使用这个移动距离所以要定义一个全局变量
    ul.addEventListener('touchstart', function(e) {
        startX = e.targetTouches[0].pageX;
        // 手指触摸的时候就停止定时器
        clearInterval(timer);
    });
    // 移动手指 touchmove: 计算手指的滑动距离, 并且移动盒子
    ul.addEventListener('touchmove', function(e) {
        // 计算移动距离
        moveX = e.targetTouches[0].pageX - startX;
        // 移动盒子:  盒子原来的位置 + 手指移动的距离 
        var translatex = -index * w + moveX;
        // 手指拖动的时候,不需要动画效果所以要取消过渡效果
        ul.style.transition = 'none';
        ul.style.transform = 'translateX(' + translatex + 'px)';
    });

【手指拖动播放上一张或者下一张】

    // 手指离开 根据移动距离去判断是回弹还是播放上一张下一张
    ul.addEventListener('touchend', function(e) {
            // (1) 如果移动距离大于50像素我们就播放上一张或者下一张
            //abs--取绝对值
            if (Math.abs(moveX) > 50) {
                // 如果是右滑就是 播放上一张 moveX 是正值
                if (moveX > 0) {
                    index--;
                } else {
                    // 如果是左滑就是 播放下一张 moveX 是负值
                    index++;
                }
                var translatex = -index * w;
                ul.style.transition = 'all .3s';
                ul.style.transform = 'translateX(' + translatex + 'px)';
        
            }
        }

 【回弹效果】

JavaScript学习笔记--【黑马程序员】_第381张图片

window.addEventListener('load', function() {
    // alert(1);
    // 1. 获取元素 
    var focus = document.querySelector('.focus');
    var ul = focus.children[0];
    // 获得focus 的宽度
    var w = focus.offsetWidth;
    var ol = focus.children[1];
    // 2. 利用定时器自动轮播图图片
    var index = 0;
    var timer = setInterval(function() {
        index++;
        var translatex = -index * w;
        ul.style.transition = 'all .3s';
        ul.style.transform = 'translateX(' + translatex + 'px)';
    }, 2000);
    // 等着我们过渡完成之后,再去判断 监听过渡完成的事件 transitionend 
    ul.addEventListener('transitionend', function() {
        // 无缝滚动
        if (index >= 3) {
            index = 0;
            // console.log(index);
            // 去掉过渡效果 这样让我们的ul 快速的跳到目标位置
            ul.style.transition = 'none';
            // 利用最新的索引号乘以宽度 去滚动图片
            var translatex = -index * w;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        } else if (index < 0) {
            index = 2;
            ul.style.transition = 'none';
            // 利用最新的索引号乘以宽度 去滚动图片
            var translatex = -index * w;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        }
        // 3. 小圆点跟随变化
        // 把ol里面li带有current类名的选出来去掉类名 remove
        ol.querySelector('.current').classList.remove('current');
        // 让当前索引号 的小li 加上 current   add
        ol.children[index].classList.add('current');
    });

    // 4. 手指滑动轮播图 
    // 触摸元素 touchstart: 获取手指初始坐标
    var startX = 0;
    var moveX = 0; // 后面我们会使用这个移动距离所以要定义一个全局变量
    ul.addEventListener('touchstart', function(e) {
        startX = e.targetTouches[0].pageX;
        // 手指触摸的时候就停止定时器
        clearInterval(timer);
    });
    // 移动手指 touchmove: 计算手指的滑动距离, 并且移动盒子
    ul.addEventListener('touchmove', function(e) {
        // 计算移动距离
        moveX = e.targetTouches[0].pageX - startX;
        // 移动盒子:  盒子原来的位置 + 手指移动的距离 
        var translatex = -index * w + moveX;
        // 手指拖动的时候,不需要动画效果所以要取消过渡效果
        ul.style.transition = 'none';
        ul.style.transform = 'translateX(' + translatex + 'px)';
    });
    // 手指离开 根据移动距离去判断是回弹还是播放上一张下一张
    ul.addEventListener('touchend', function(e) {
        //如果移动过了 在判断 要不然白费
        if (flag) {
            // (1) 如果移动距离大于50像素我们就播放上一张或者下一张
            //abs--取绝对值
            if (Math.abs(moveX) > 50) {
                // 如果是右滑就是 播放上一张 moveX 是正值
                if (moveX > 0) {
                    index--;
                } else {
                    // 如果是左滑就是 播放下一张 moveX 是负值
                    index++;
                }
                var translatex = -index * w;
                ul.style.transition = 'all .3s';
                ul.style.transform = 'translateX(' + translatex + 'px)';
            } else {
                // (2) 如果移动距离小于50像素我们就回弹
                var translatex = -index * w;
                ul.style.transition = 'all .1s';
                ul.style.transform = 'translateX(' + translatex + 'px)';
            }
        }
        // 手指离开的时候就重新开启定时器
        clearInterval(timer);//开新的定时器之前 先将原来的删除
        timer = setInterval(function() {
            index++;
            var translatex = -index * w;
            ul.style.transition = 'all .3s';
            ul.style.transform = 'translateX(' + translatex + 'px)';
        }, 2000);
    });
})

【 案例:返回顶部】

JavaScript学习笔记--【黑马程序员】_第382张图片

JavaScript学习笔记--【黑马程序员】_第383张图片

    // 返回顶部模块制作
    var goBack = document.querySelector('.goBack');
    var nav = document.querySelector('nav');
    window.addEventListener('scroll', function() {
        if (window.pageYOffset >= nav.offsetTop) {
            goBack.style.display = 'block';
        } else {
            goBack.style.display = 'none';
        }
    });
    //快速回到顶部
    goBack.addEventListener('click', function() {
        window.scroll(0, 0);
    })

2.2 click延时解决方案

 移动端 click 事件会有 300ms 的延时,原因是移动端屏幕双击会缩放(double tap to zoom) 页面。

1. 禁用缩放。 浏览器禁用默认的双击缩放行为并且去掉 300ms 的点击延迟。

2. 利用touch事件自己封装这个事件解决 300ms 延迟。

JavaScript学习笔记--【黑马程序员】_第384张图片

    

3. 使用插件。 fastclick 插件解决 300ms 延迟。

3.移动端常见开发插件

3.1 什么是插件

JavaScript学习笔记--【黑马程序员】_第385张图片

 3.2 插件的使用

JavaScript学习笔记--【黑马程序员】_第386张图片

    
    



    

3.3 Swiper插件的使用·

 JavaScript学习笔记--【黑马程序员】_第387张图片

3.4 插件的使用总结

 JavaScript学习笔记--【黑马程序员】_第388张图片

3.5 【练习--移动端视频插件】

 JavaScript学习笔记--【黑马程序员】_第389张图片

4.移动端常用开发框架

4.1 框架概述

JavaScript学习笔记--【黑马程序员】_第390张图片

 4.2 Bootstrap(要先引入jQuery)

JavaScript学习笔记--【黑马程序员】_第391张图片





    
    
    
    Document
    
    
    
    



    
...
这是我的图片1
...
这是我的图片2
...
这是我的图片3
...
Previous Next

二十六、BOM 浏览器对象模型

1 BOM 概述

1.1 什么是BOM

BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window

JavaScript学习笔记--【黑马程序员】_第392张图片1.2 BOM的构成

BOM 比 DOM 更大,它包含 DOM

JavaScript学习笔记--【黑马程序员】_第393张图片

JavaScript学习笔记--【黑马程序员】_第394张图片

    


2 window 对象的常见事件

2.1 窗口加载事件【window.addEventListener("load",function(){})】

window.onload = function(){}//以最后一个onload为主
//或者
window.addEventListener("load",function(){});//多个load都可以

window.onload 是窗口 (页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS文件等), 就调用的处理函数。
注意:
1. 有了 window.onload 就可以把 JS 代码写到页面元素的上方,因为 onload 是等页面内容全部加载完毕,
再去执行处理函数。
2. window.onload 传统注册事件方式 只能写一次,如果有多个,会以最后一个 window.onload 为准。
3. 如果使用 addEventListener 则没有限制

document.addEventListener('DOMContentLoaded',function(){})//DOM加载完就可以开始了

DOMContentLoaded 事件触发时,仅当DOM加载完成,不包括样式表,图片,flash等等。
Ie9以上才支持
如果页面的图片很多的话, 从用户访问到onload触发可能需要较长的时间, 交互效果就不能实现,必然影响用户的体验,此时用 DOMContentLoaded 事件比较合适。

    

2.2 调整窗口大小事件--【window.addEventListener("resize",function(){});】

window.onresize = function(){}
window.addEventListener("resize",function(){});

JavaScript学习笔记--【黑马程序员】_第395张图片

    



    
    

3 定时器

3.1 两种定时器

JavaScript学习笔记--【黑马程序员】_第396张图片

3.2 setTimeout()定时器【只调用一次】--【window.setTimeout(调用函数, [延迟的毫秒数]);】

setTimeout() 方法用于设置一个定时器,该定时器在定时器到期后执行调用函数。


注意:


1. window 可以省略。
2. 这个调用函数可以
直接写函数,或者写函数名或者采取字符串‘函数名()'三种形式。第三种不推荐
3. 延迟的毫秒数省略默认是 0,如果写,必须是毫秒。
4. 因为定时器可能有很多,所以我们经常给定时器赋值一个标识符。

    

JavaScript学习笔记--【黑马程序员】_第397张图片

【案例: 5秒后自动关闭的广告】

JavaScript学习笔记--【黑马程序员】_第398张图片


    
    

3.3 停止(清除)setTimeout()定时器--【window.clearTimeout(定时器的名字)】

clearTimeout()方法取消了先前通过调用 setTimeout() 建立的定时器。
注意:
1. window 可以省略。
2. 里面的参数就是定时器的标识符 。


    
    

3.4 setInterval()定时器【反复调用】--【window.setInterval(回调函数, [间隔的毫秒数]);】

JavaScript学习笔记--【黑马程序员】_第399张图片

    

【案例: 倒计时】

JavaScript学习笔记--【黑马程序员】_第400张图片

JavaScript学习笔记--【黑马程序员】_第401张图片

  
  



    
1 2 3

3.5 停止(清除)setInterval()定时器--【window.clearTimeout(定时器的名字)】

 JavaScript学习笔记--【黑马程序员】_第402张图片


    
    
    

 【案例: 发送短信】

JavaScript学习笔记--【黑马程序员】_第403张图片

JavaScript学习笔记--【黑马程序员】_第404张图片


    手机号码:  
    

3.6 this

 现阶段,我们先了解一下几个this指向
1. 全局作用域或者普通函数中this指向全局对象window(注意定时器里面的this指向window)
2. 方法调用中谁调用this指向谁
3.构造函数中this指向构造函数的实例


    
    

 【时钟】

JavaScript学习笔记--【黑马程序员】_第405张图片


4 JS 执行机制

4.1 JS是单线程

JavaScript学习笔记--【黑马程序员】_第406张图片

    

4.2 同步(程序的执行顺序与任务的排列顺序是一致的)与异步

JavaScript学习笔记--【黑马程序员】_第407张图片

JavaScript学习笔记--【黑马程序员】_第408张图片

JavaScript学习笔记--【黑马程序员】_第409张图片

    

4. 3 JS执行机制

JavaScript学习笔记--【黑马程序员】_第410张图片

4.4 JS执行机制

  

JavaScript学习笔记--【黑马程序员】_第411张图片
5 location 对象 

5.1 什么是location对象

window 对象给我们提供了一个 location 属性用于获取或设置窗体的 URL,并且可以用于解析 URL 。 因为这个属性返回的是一个对象,所以我们将这个属性也称为 location 对象。

5.2 URL

JavaScript学习笔记--【黑马程序员】_第412张图片

5.3 location对象的属性

JavaScript学习笔记--【黑马程序员】_第413张图片

【案例: 5秒钟之后自动跳转页面】

JavaScript学习笔记--【黑马程序员】_第414张图片


    
    

【案例: 获取 URL 参数数据】

JavaScript学习笔记--【黑马程序员】_第415张图片


    
用户名:

    

5.4 location对象的方法

JavaScript学习笔记--【黑马程序员】_第416张图片


    
    

6 navigator 对象

navigator 对象包含有关浏览器的信息,它有很多属性,我们最常用的是 userAgent,该属性可以返回由客户机发送服务器的 user-agent 头部的值。下面前端代码可以判断用户那个终端打开页面,实现跳转

    

    
    
  • 打开京东App,购物更轻松
  • 立即打开
登陆
京东超市 京东超市 京东超市 京东超市 京东超市 京东超市 京东超市 京东超市 京东超市 京东超市


7 history 对象

 window 对象给我们提供了一个 history 对象,与浏览器历史记录进行交互。该对象包含用户(在浏览器窗口中)访问过的 URL。

JavaScript学习笔记--【黑马程序员】_第417张图片 back() 


    点击我去往首页
    
    

forward()


    点击我去往列表页
    
    

JavaScript学习笔记--【黑马程序员】_第418张图片


    点击我去往列表页
    
    

    点击我去往首页
    
    

二十七、本地存储

JavaScript学习笔记--【黑马程序员】_第419张图片

1 window.sessionStorage(数据存储在浏览器中的)--重新打开就没有了


    
    
    
    
    
    

JavaScript学习笔记--【黑马程序员】_第420张图片

存储数据:

sessionStorage.setItem(名字, 值)


获取数据:

sessionStorage.getItem(key)


删除数据:

sessionStorage.removeItem(key

删除所有的数据:

sessionStorage.clear(key)


2 window.localStorage--(关闭页面数据还在)


    
    
    
    
    
    

 JavaScript学习笔记--【黑马程序员】_第421张图片

存储数据:

localStorage.setItem(key, value)


获取数据:

localStorage.getItem(key)



删除数据:

localStorage.removeItem(key)

删除所有数据:
 

localStorage.clear()

【案例:记住用户名】

JavaScript学习笔记--【黑马程序员】_第422张图片


      记住用户名
    

你可能感兴趣的:(学习)

  • x86-64汇编语言训练程序与实战 十除以十等于一
    本文还有配套的精品资源,点击获取简介:汇编语言是一种低级语言,与机器代码紧密相关,特别适用于编写系统级代码及性能要求高的应用。nasm编译器是针对x86和x86-64架构的汇编语言编译器,支持多种语法风格和指令集。项目Euler提供数学和计算机科学问题,鼓励编程技巧应用,前100个问题的答案可共享。x86-64架构扩展了寄存器数量并引入新指令,提升了数据处理效率。学习汇编语言能够深入理解计算机底层
  • 三菱PLC全套学习资料及应用手册 good2know
    本文还有配套的精品资源,点击获取简介:三菱PLC作为工业自动化领域的核心设备,其系列产品的学习和应用需要全面深入的知识。本次资料包为学习者提供从基础到进阶的全方位学习资源,包括各种型号PLC的操作手册、编程指南、软件操作教程以及实际案例分析,旨在帮助用户系统掌握PLC的编程语言、指令系统及在各类工业应用中的实施。1.三菱PLC基础知识入门1.1PLC的基本概念可编程逻辑控制器(PLC)是工业自动化
  • 日更006 终极训练营day3 懒cici
    人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向
  • day15|前端框架学习和算法 universe_01 前端算法笔记
    T22括号生成先把所有情况都画出来,然后(在满足什么情况下)把不符合条件的删除。T78子集要画树状图,把思路清晰。可以用暴力法、回溯法和DFS做这个题DFS深度搜索:每个边都走完,再回溯应用:二叉树搜索,图搜索回溯算法=DFS+剪枝T200岛屿数量(非常经典BFS宽度把树状转化成队列形式,lambda匿名函数“一次性的小函数,没有名字”setup语法糖:让代码更简洁好写的语法ref创建:基本类型的
  • 《极简思维》第三部分 小洋苏兮
    整理你的人际关系如何改善人际关系?摘录:因为人际关系问题是人们生活中不快乐的主要原因。感想:感觉这个说的挺对,之前我总是埋头学习,不管舍友不管自己的合作伙伴的一些事情,但实际上,这学期关注了之后好多了摘录:“亲密关系与社交会让你健康而快乐。这是基础。太过于关注成就或不太关心人际关系的人都不怎么快乐。基本上来说,人类就是建立在人脉关系上的。”感想:但是如果有时想的太多就不太好,要以一个开放的心态跟别
  • 你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。 霖霖z
    打卡人:周云日期:2018年11月09日【日精进打卡第180天】【知~学习】《六项精进》0遍共214遍《通篇》1遍共106遍《大学》2遍共347遍《坚强工作,温柔生活》ok《不抱怨的世界》104-108页《经典名句》你要记住,最重要的是:随时做好准备,为了你可能成为更好的自己,放弃现在的自己。【行~实践】一、修身:(对自己个人)1、坚持打卡二、齐家:(对家庭和家人)打扫卫生,接送孩子,洗衣做饭,陪
  • 贫穷家庭的孩子考上985以后会怎样? Mellisa蜜思言
    我出生在一个贫穷的农村家庭,据我妈说,我出生的时候才4斤多,而她生完我以后月子里就瘦到70斤。家里一直很穷,父母都是在菜市场卖菜的,家里还有几亩地种庄稼的。我很小开始就要去帮忙,暑假的生活就是帮忙去卖菜和割稻谷,那时候自己对于割稻谷这种事情有着莫名的恐惧,生怕自己长大以后还是每年都要过着割稻谷这种日子。父母因为忙于生计无暇顾及我的学习,幸好我因为看到他们这样子的生活,内心里有深深的恐惧感,驱使着我
  • 2019-06-05 第十七把巴鲁克
    今天去实验田里实习,见到了福寿螺真的可怕且牛皮,六级也快来了,说实话还是害怕。我昨天考了环工原理,真的太难了,太烦了,理工科真的难,烦。实验报告还是没写,要抓紧速度抓紧时间,还是应该学会努力学习,远离一些不上进的事物。
  • 为什么焦虑、抑郁、自残的青少年越来越多? 精神健康
    很多家长觉得没缺孩子吃的穿的,他们有安稳的生活,他们有什么可焦虑、抑郁的,但现在的孩子,学习压力越来越大,每天休息的时间越来越少,出现焦虑抑郁是很正常的。从发展的角度看,青少年时期,人的身体、情绪,智力、人格都急剧发展,正从未成熟走向成熟,情绪起伏不定,易冲动,再者,由于缺乏生活经验,以及来自于家长、学校、社会的各种要求和压力,从而不知所措,心中的焦虑、恐惧、彷徨得不到及时的排解,从而导致心理上的
  • 读书打卡《别想太多啦》 chenchen_68ed
    第一,世间之事,不去尝试永远不知道其中的奥秘,在尝试中有失败是必然的。如果担心失败,那什么都学不会。第二,经历的失败越多,越会对失败者抱有宽容的态度,“原来如此,我也经历过类似的失败啦,那只是暂时的”。经历越多失败的长者,越能包容别人,这也就是所谓的“越年长越宽容”。成熟的人,就是在众多失败经历中不断学习,并接纳别人的失败。对于他人的小小过失不吹毛求疵,自己的心态会更加平和。在不断失败中学习,让自
  • 2023-01-26 胡喜平
    我觉得《可见的学习》一书确实从底层逻辑说清楚了,教学的本质。可是太多术语和概念,一时间难以消化啊。而且知道和懂得有距离,运用就更不行了,需要高手和专家的指导。我需要多听听新课标的讲座了,来反复印证。读论文也有了一点点灵感,明天修改我的论文。
  • 平静得接受自己的笨拙 20190118 晨间日记 吴伯符
    图片发自App最近做了一个关于微习惯的分享,这里有八个字:微量开始,超额完成。这里的言下之意其实是要你在一开始的时候,平静地接受自己的笨拙。接受自己的笨拙,理解自己的笨拙,放慢速度尝试,观察哪里可以改进,再反复练习,观察自己哪里可以再进一步改进,再反复…这是学习一切技能的必须的过程。这里的两个关键点是:1.尽快的开始这个过程,这就能够用到微习惯的微量开始。2.尽快的度过这个过程,这就需要用到超额完
  • 二十四节气组诗 谷雨 离陌_6639
    图片来源网络,若侵犯了你的权益,请联系我删除6.谷雨文/离陌背上行囊背上如行囊的我从此任行程马不停蹄今天家乡的田野春雨快马加鞭播下希望的种子观音不语目送着我和夏天一道在观音山出关图片来源网络,若侵犯了你的权益,请联系我删除你好啊,我是离陌,已然在懵懂中走过了16年的岁月,为了珍惜当下的每一秒,所以立志做一名终身学习者。文学对于我来说是一种信仰,诗歌是我的生命。人生之道,四通八达,即入文学,自当持之
  • 你好,2020年 瑄瑄妍妍的妈咪
    早上好,今天是2020年的第一天,也就是元旦,新年新的一天开始了。新的开始,重新规划未来的一年。从今天开始,用了一个新的记账软件,之前的随手记软件,也没有删除,只是重新下载了一个别的软件,开始一个新的记账旅程,对于理财开支,有个新的规划。通过小红书视频软件,学习了不少育儿知识,和各种不同的美食,以后动手制作,给宝宝做健康美味的营养餐。学习方面,继续学英语吧!虽然是抽出时间学的,进度也比较慢,但是积
  • 常规笔记本和加固笔记本的区别 luchengtech 电脑三防笔记本加固计算机加固笔记本
    在现代科技产品中,笔记本电脑因其便携性和功能性被广泛应用。根据使用场景和需求的不同,笔记本可分为常规笔记本和加固笔记本,二者在多个方面存在显著区别。适用场景是区分二者的重要标志。常规笔记本主要面向普通消费者和办公人群,适用于家庭娱乐、日常办公、学生学习等相对稳定的室内环境。比如,人们在家用它追剧、处理文档,学生在教室用它完成作业。而加固笔记本则专为特殊行业设计,像军事、野外勘探、工业制造、交通运输
  • 《云襄传》:云襄做的局是浑水摸鱼吗? 书生号贺
    云襄入南都是要浑水摸鱼吗?他是云台的高材生吗?他为啥笃定师父一定会让他留在南都?他为啥觉得他能够做局成功?他是在经商吗?还是在经营人心与欲望?云襄是云台弟子,云台属千门的一支,另一支叫凌渊,云台教人经商之道,重智慧,凌渊以武力取胜,但倍受打压。云襄学习十五年,下高山奔越州,途经南洋,因恩人闻聪被害,囚于白驹镇,念于情分,被卷入这样一个局面里,结识了舒亚南与金十两,于是,复仇小组成立,目标是南都漕帮
  • 心力践行营十二期一阶学习打卡 LX_王彤彤
    姓名:王彤彤时间:2021年4月24日一:朗读师父的十大人生哲学二:师父的早安分享感悟很喜欢这句话:所有的行动都是基于目标的尝试,没有所谓的失败,只是不同尝试后得到的不同结果,让我们更好地调整下一次的行动。三:感恩日记1.我太幸福了,我很感恩姑姑,因为姑姑放假又投喂了我,还给我带了饺子回家,这让我感觉很幸福。谢谢,谢谢,谢谢。2.我太幸福了,我很感恩师父晚上的直播,因为听他的分享我知道怎么更好的去
  • 为了在未来的人工智能世界中取得成功,学生们必须学习人类写作的优点 睿邸管家
    澳大利亚各地的学生在新学年开始使用铅笔、钢笔和键盘学习写字。在工作场所,机器也在学习写作,如此有效,几年之内,它们可能会写得比人类更好。有时它们已经做到了,就像Grammarly这样的应用程序所展示的那样。当然,人类现在的日常写作可能很快就会由具有人工智能(AI)的机器来完成。手机和电子邮件软件常用的预测文本是无数人每天都在使用的一种人工智能写作形式。据AI行业研究机构称,到2022年,人工智能及
  • 闭组进行时... 李亚青_强化班
    今天是2019年12月1号距离开始三月学习的日子:2019年10月07,已经过去将近两个月,回顾这一阶段的学习,收获了什么?又学会了什么呢?图片发自App我想,收获最大的就是身边这一群人吧,有和蔼可亲的学姐,贴心的学长,嬉戏打闹,玩的不亦乐乎,但也同样认真踏实学习小伙伴图片发自App本以为在这样的时刻,有太多太多话,太多太多想法想要表达,可言到此处,又觉得似乎没有什么想要说的了还是那句话,幸运遇到
  • 2021-10-23 赵甄文的幸福
    秀荣感恩日记Day42[烟花]感恩语录感恩自己有能力有好身体,可以到处走动,做自己想做的事情10.23感恩日记今天做的事情瑜伽一小时户外散步一小时泡脚20分钟学习打卡和孩子沟通[爱心]感动的瞬间今天瑜伽回来,发现老公在厨房里做鱼。每次老公有时间休息的时候都会给我做硬菜。刘姐约我一起去公园散步晒太阳。虽然完美错过,但心里还是暖暖的。每天睁开眼打开手机,先去自己的群里逛一逛,每每发现有人点赞或者互动都
  • 孤独的守候 怒吼的生命
    孤独了时光岁月了寂寞带来了惆怅那些孤独的日子里我们珍惜奋斗起来品味人生的真谛做到更好奋斗当中的你是那么努力格外自律学习起来五彩斑斓那些日子时光匆匆人生的机会很多需要把握痛苦的回忆记得住那些忧愁孤苦五一的日子寂寞当中的你时光荏苒独自带给我荒草学习起来努力奋斗可是我们做的还不够把握发展生活带给我们更多希望静静的述说你的故事你的精彩人生当中我们总是努力把握生活带给我们更多的学习生活当中我们奋斗可是做的还
  • AI模型训练中过拟合和欠拟合的区别是什么? workflower 人工智能算法人工智能数据分析
    在AI模型训练中,过拟合和欠拟合是两种常见的模型性能问题,核心区别在于模型对数据的学习程度和泛化能力:欠拟合(Underfitting)-定义:模型未能充分学习到数据中的规律,对训练数据的拟合程度较差,在训练集和测试集上的表现都不好(如准确率低、损失值高)。-原因:-模型结构过于简单(如用线性模型解决非线性问题);-训练数据量不足或特征信息不充分;-训练时间太短,模型尚未学到有效模式。-表现:训练
  • 2018-08-29精进打卡 米兰王
    姓名:王兰英【日精进打卡第25天】【知~学习】《六项精进》1遍共39遍《大学》1遍共50遍【经典名句分享】一切都是最好的安排。【行~实践】一、修身:(对自己个人)1,散步1小时。2,每天坚持读书。二、齐家:(对家庭和家人)1,指导孩子开车。2,和家人一起逛超市。三、建功:(对工作)用心做好每件事。{积善}:发愿从2018年8月5日起1年内365个善事。今日1善,累计27善。【省~觉悟】正人先正己。
  • 陶勇:要不要参加分班考试学习?看完再说。 陶勇
    每年到了升学季,有很多培训机构都特别忙,为什么呢?因为有成千上万的学生,会选择升学前的分班考试的培训。比如说,小升初的孩子,到了暑假,很多孩子都会去选择一个初中,初一的分班考试的培训,那考入高中的孩子也有很多孩子会选择这种新高一的分班考试的培训。当然了,我个人认为这种选择并不是孩子自身的选择,主要还是家长的选择。当然也有少数孩子会对自己有比较高的要求,他们也会主动的去选择。为什么要去上分班考试的这
  • Anaconda 和 Miniconda:功能详解与选择建议 古月฿ python入门pythonconda
    Anaconda和Miniconda详细介绍一、Anaconda的详细介绍1.什么是Anaconda?Anaconda是一个开源的包管理和环境管理工具,在数据科学、机器学习以及科学计算领域发挥着关键作用。它以Python和R语言为基础,为用户精心准备了大量预装库和工具,极大地缩短了搭建数据科学环境的时间。对于那些想要快速开展数据分析、模型训练等工作的人员来说,Anaconda就像是一个一站式的“数
  • 求解——妊娠纹霜哪个牌子好?皮肤专家推荐的热门秘诀! zhangxing0100
    妊娠纹会严重影响女性的美观,那孕期的女性朋友该如何避免减少妊娠纹的出现呢?下面美腹丽人小编为大家分享了预防妊娠纹的方法,赶紧一起来学习吧!一、预防妊娠纹的饮食习惯1、多食用对皮肤内胶原纤维有利的食品来增强皮肤的弹性。2、控制糖分摄入,少吃色素含量高的食物。3、早晚两杯脱脂牛奶,多食用维丰富的蔬菜、水果和富含维生素及矿物质的食物,增加细胞膜的通透性和皮肤的新陈代谢功能。4、正确的喝水习惯可以提速皮肤
  • 2023-01-07 阿诗玛_6209
    姓名:赵丽娟【日精进打卡第1783天】【知~学习】读书《经营与会计》ok《活法》3-47-8【经典名句】执着追求并从中得到最大快乐的人,才是成功者。——梭罗一、修身:(对自己个人)1、保持心态平和.2、坚持打卡.坚持读书。3、早晨喝杯温水.4、坚持烫脚,养成早睡早起的习惯.二、齐家:三、建功:(对工作){积善}:发愿从2018年1月28日起见善行善,今日0善。【省~觉悟】1,睡觉时把手机放到离自己
  • 认命修运 每日一省(16) 星_6329
    命每个人的命都是父母带来的,我们每个人都没有权利选择父母,没有权利选择自己的出生。一个人从出生的那一刻就注定了你的命。我所说的认命,就是客观的接受自己的父母,接受自己的家庭。不对抗,不较劲。有些人是含着金汤匙出生的,有些人刚一出生拥有的财富可能是我们一生都得不到的。有些人是踩着泥坑出生的。有些人一出生就是等着继承皇位的。运在我们成长的过程当中,我们付出努力,学习知识,成长自己,帮助他人。我们有权利
  • 学C++的五大惊人好处
    为什么要学c++学c++有什么用学习c++的好处有1.中考可以加分2.高考可能直接录取3.就业广且工资高4.在未来30--50年c++一定是一个很受欢迎的职业5.c++成功的例子deepsick等AI智能C++语言兼备编程效率和编译运行效率的语言C++语言是C语言功能增强版,在c语言的基础上添加了面向对象编程和泛型编程的支持既继承了C语言高效,简洁,快速和可移植的传统,又具备类似Java、Go等其
  • 机器学习必备数学与编程指南:从入门到精通 a小胡哦 机器学习基础机器学习人工智能
    一、机器学习核心数学基础1.线性代数(神经网络的基础)必须掌握:矩阵运算(乘法、转置、逆)向量空间与线性变换特征值分解与奇异值分解(SVD)为什么重要:神经网络本质就是矩阵运算学习技巧:用NumPy实际操作矩阵运算2.概率与统计(模型评估的关键)核心概念:条件概率与贝叶斯定理概率分布(正态、泊松、伯努利)假设检验与p值应用场景:朴素贝叶斯、A/B测试3.微积分(优化算法的基础)重点掌握:导数与偏导
  • 解读Servlet原理篇二---GenericServlet与HttpServlet 周凡杨 javaHttpServlet源理GenericService源码
    在上一篇《解读Servlet原理篇一》中提到,要实现javax.servlet.Servlet接口(即写自己的Servlet应用),你可以写一个继承自javax.servlet.GenericServletr的generic Servlet ,也可以写一个继承自java.servlet.http.HttpServlet的HTTP Servlet(这就是为什么我们自定义的Servlet通常是exte
  • MySQL性能优化 bijian1013 数据库mysql
            性能优化是通过某些有效的方法来提高MySQL的运行速度,减少占用的磁盘空间。性能优化包含很多方面,例如优化查询速度,优化更新速度和优化MySQL服务器等。本文介绍方法的主要有:         a.优化查询         b.优化数据库结构  
  • ThreadPool定时重试 dai_lm javaThreadPoolthreadtimertimertask
    项目需要当某事件触发时,执行http请求任务,失败时需要有重试机制,并根据失败次数的增加,重试间隔也相应增加,任务可能并发。 由于是耗时任务,首先考虑的就是用线程来实现,并且为了节约资源,因而选择线程池。 为了解决不定间隔的重试,选择Timer和TimerTask来完成 package threadpool; public class ThreadPoolTest {
  • Oracle 查看数据库的连接情况 周凡杨 sqloracle 连接
    首先要说的是,不同版本数据库提供的系统表会有不同,你可以根据数据字典查看该版本数据库所提供的表。 select * from dict where table_name like '%SESSION%'; 就可以查出一些表,然后根据这些表就可以获得会话信息 select sid,serial#,status,username,schemaname,osuser,terminal,ma
  • 类的继承 朱辉辉33 java
    类的继承可以提高代码的重用行,减少冗余代码;还能提高代码的扩展性。Java继承的关键字是extends 格式:public class 类名(子类)extends 类名(父类){ } 子类可以继承到父类所有的属性和普通方法,但不能继承构造方法。且子类可以直接使用父类的public和 protected属性,但要使用private属性仍需通过调用。 子类的方法可以重写,但必须和父类的返回值类
  • android 悬浮窗特效 肆无忌惮_ android
    最近在开发项目的时候需要做一个悬浮层的动画,类似于支付宝掉钱动画。但是区别在于,需求是浮出一个窗口,之后边缩放边位移至屏幕右下角标签处。效果图如下:   一开始考虑用自定义View来做。后来发现开线程让其移动很卡,ListView+动画也没法精确定位到目标点。   后来想利用Dialog的dismiss动画来完成。   自定义一个Dialog后,在styl
  • hadoop伪分布式搭建 林鹤霄 hadoop
    要修改4个文件    1: vim hadoop-env.sh  第九行    2: vim core-site.xml            <configuration>     &n
  • gdb调试命令 aigo gdb
    原文:http://blog.csdn.net/hanchaoman/article/details/5517362   一、GDB常用命令简介   r run 运行.程序还没有运行前使用 c             cuntinue 
  • Socket编程的HelloWorld实例 alleni123 socket
    public class Client { public static void main(String[] args) { Client c=new Client(); c.receiveMessage(); } public void receiveMessage(){ Socket s=null; BufferedRea
  • 线程同步和异步 百合不是茶 线程同步异步
    多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法   多线程和异步:多线程可以做不同的事情,涉及到线程通知     &
  • JSP中文乱码分析 bijian1013 javajsp中文乱码
            在JSP的开发过程中,经常出现中文乱码的问题。         首先了解一下Java中文问题的由来:         Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,
  • js实现页面跳转重定向的几种方式 bijian1013 JavaScript重定向
            js实现页面跳转重定向有如下几种方式: 一.window.location.href <script language="javascript"type="text/javascript"> window.location.href="http://www.baidu.c
  • 【Struts2三】Struts2 Action转发类型 bit1129 struts2
     在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下   <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configurat
  • 【HBase十一】Java API操作HBase bit1129 hbase
    Admin类的主要方法注释:   1. 创建表 /** * Creates a new table. Synchronous operation. * * @param desc table descriptor for table * @throws IllegalArgumentException if the table name is res
  • nginx gzip ronin47 nginx gzip
    Nginx GZip 压缩 Nginx GZip 模块文档详见:http://wiki.nginx.org/HttpGzipModule 常用配置片段如下: gzip on; gzip_comp_level 2; # 压缩比例,比例越大,压缩时间越长。默认是1 gzip_types text/css text/javascript; # 哪些文件可以被压缩 gzip_disable &q
  • java-7.微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如 h1 , h2 ,判断这俩个链表是否相交 bylijinnan java
    public class LinkListTest { /** * we deal with two main missions: * * A. * 1.we create two joined-List(both have no loop) * 2.whether list1 and list2 join * 3.print the join
  • Spring源码学习-JdbcTemplate batchUpdate批量操作 bylijinnan javaspring
    Spring JdbcTemplate的batch操作最后还是利用了JDBC提供的方法,Spring只是做了一下改造和封装 JDBC的batch操作: String sql = "INSERT INTO CUSTOMER " + "(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";
  • [JWFD开源工作流]大规模拓扑矩阵存储结构最新进展 comsci 工作流
        生成和创建类已经完成,构造一个100万个元素的矩阵模型,存储空间只有11M大,请大家参考我在博客园上面的文档"构造下一代工作流存储结构的尝试",更加相信的设计和代码将陆续推出.........     竞争对手的能力也很强.......,我相信..你们一定能够先于我们推出大规模拓扑扫描和分析系统的....
  • base64编码和url编码 cuityang base64url
    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.StringWriter; import java.io.UnsupportedEncodingException;
  • web应用集群Session保持 dalan_123 session
    关于使用 memcached 或redis 存储 session ,以及使用 terracotta 服务器共享。建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单个对象比较大,而且数据类型丰富,不只是缓存 session,还可以做其他用途,一举几得啊。1、使用 filter 方法存储这种方法比较推荐,因为它的服务器使用范围比较多,不仅限于tomcat ,而且实现的原理比较简
  • Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式'] dcj3sjt126com 数据库
        public function getMinLimit () {        $sql = "...";        $result = yii::app()->db->createCo
  • solr StatsComponent(聚合统计) eksliang solr聚合查询solr stats
    StatsComponent 转载请出自出处:http://eksliang.iteye.com/blog/2169134 http://eksliang.iteye.com/ 一、概述        Solr可以利用StatsComponent 实现数据库的聚合统计查询,也就是min、max、avg、count、sum的功能   二、参数
  • 百度一道面试题 greemranqq 位运算百度面试寻找奇数算法bitmap 算法
    那天看朋友提了一个百度面试的题目:怎么找出{1,1,2,3,3,4,4,4,5,5,5,5}  找出出现次数为奇数的数字.   我这里复制的是原话,当然顺序是不一定的,很多拿到题目第一反应就是用map,当然可以解决,但是效率不高。   还有人觉得应该用算法xxx,我是没想到用啥算法好...!   还有觉得应该先排序...   还有觉
  • Spring之在开发中使用SpringJDBC ihuning spring
      在实际开发中使用SpringJDBC有两种方式:   1. 在Dao中添加属性JdbcTemplate并用Spring注入;     JdbcTemplate类被设计成为线程安全的,所以可以在IOC 容器中声明它的单个实例,并将这个实例注入到所有的 DAO 实例中。JdbcTemplate也利用了Java 1.5 的特定(自动装箱,泛型,可变长度
  • JSON API 1.0 核心开发者自述 | 你所不知道的那些技术细节 justjavac json
    2013年5月,Yehuda Katz 完成了JSON API(英文,中文) 技术规范的初稿。事情就发生在 RailsConf 之后,在那次会议上他和 Steve Klabnik 就 JSON 雏形的技术细节相聊甚欢。在沟通单一 Rails 服务器库—— ActiveModel::Serializers 和单一 JavaScript 客户端库——&
  • 网站项目建设流程概述 macroli 工作
    一.概念 网站项目管理就是根据特定的规范、在预算范围内、按时完成的网站开发任务。 二.需求分析 项目立项   我们接到客户的业务咨询,经过双方不断的接洽和了解,并通过基本的可行性讨论够,初步达成制作协议,这时就需要将项目立项。较好的做法是成立一个专门的项目小组,小组成员包括:项目经理,网页设计,程序员,测试员,编辑/文档等必须人员。项目实行项目经理制。 客户的需求说明书   第一步是需
  • AngularJs 三目运算 表达式判断 qiaolevip 每天进步一点点学习永无止境众观千象AngularJS
    事件回顾:由于需要修改同一个模板,里面包含2个不同的内容,第一个里面使用的时间差和第二个里面名称不一样,其他过滤器,内容都大同小异。希望杜绝If这样比较傻的来判断if-show or not,继续追究其源码。 var b = "{{", a = "}}"; this.startSymbol = function(a) {
  • Spark算子:统计RDD分区中的元素及数量 superlxw1234 sparkspark算子Spark RDD分区元素
    关键字:Spark算子、Spark RDD分区、Spark RDD分区元素数量     Spark RDD是被分区的,在生成RDD时候,一般可以指定分区的数量,如果不指定分区数量,当RDD从集合创建时候,则默认为该程序所分配到的资源的CPU核数,如果是从HDFS文件创建,默认为文件的Block数。   可以利用RDD的mapPartitionsWithInd
  • Spring 3.2.x将于2016年12月31日停止支持 wiselyman Spring 3
                  Spring 团队公布在2016年12月31日停止对Spring Framework 3.2.x(包含tomcat 6.x)的支持。在此之前spring团队将持续发布3.2.x的维护版本。          请大家及时准备及时升级到Spring
  • fis纯前端解决方案fis-pure zccst JavaScript
    作者:zccst FIS通过插件扩展可以完美的支持模块化的前端开发方案,我们通过FIS的二次封装能力,封装了一个功能完备的纯前端模块化方案pure。 1,fis-pure的安装 $ fis install -g fis-pure $ pure -v 0.1.4 2,下载demo到本地 git clone https://github.com/hefangshi/f
按字母分类: ABCDEFGHIJKLMNOPQRSTUVWXYZ其他
首页 - 关于我们 - 站内搜索 - Sitemap - 侵权投诉
版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.