JavaScript基础学习笔记

javascript

一、变量与数据类型

变量:存储数据的容器。

//var 声明变量
var s = "hello world";
console.log(s);

//定于多个变量,可以使用逗号分开
var s1="hello", s2="world";
console.log(s1);
console.log(s2);

变量命名规范:

变量名要见名知意;

变量名可以是字母、下划线、$、还有数字;但是不能以数字开头;

小写字母开头、多个单词、第二个单词首字母大写(驼峰命名);

不可以与关键字、保留字重复;

1、数据类型

数值(Number)	//100,1,2,3
字符串(String)//"hello world" "你好世界"
布尔(Boolean)	//true false
未定义(Undefined)	//undefined	
空(Null)	//null	空
对象(Object)	//{}

二、表达式与运算符

1、字面量和表达式

var str1 = "hello";		//将字面量赋值给变量
var str2 = "world";
var result = str1 + str2;//将表达式赋值给变量
console.log(result);

2、数字运算符

运算符描述示例结果
+加法20+1030
-减法20-1010
*乘法20*10200
/除法20/102
%求余11%21
++自增1++7 或 7++8
自减–7 或7–6

3、比较运算符

运算符描述示例结果
>大于20>10true
<小于20<10false
>=大于等于20>=10true
<=小于等于20<=10false
==等于20==“20”true
!=不等20!=10true
===恒等于(全等于)20===“20”false
!==非恒等于20!==“20”true

4、逻辑运算符

运算符描述示例结果
&&true && falsefalse
||true || falsetrue
!truefalse

5、赋值运算符

运算符描述示例等同于
=赋值x=10
+=加并赋值x+=yx=x+y
-+减并赋值x-=yx=x-y
*=乘并赋值x*=yx=x*y
/=除并赋值x/=yx=x/y

三、条件语句

程序执行流程主要分为三种:

1.按顺序执行

2.按条件执行

3.循环执行

1、if语句

if(boolean){
    //语句块
}

if(boolean){
    //语句块1
}else{
    //语句块2
}

2、switch语句

可以实现多重选择,某些情况相对于if语句更简洁。

switch(){
    case1:语句1;break;
    case2:语句2;break;
    case3:语句3;break;
    default:语句4;
}

3、条件运算符

boolean ? value1 : value2

num1>num2 ? "数字1大于数字2" : "数字1小于或等于数字2"

var num1=10,num2=20;
var str = num1>num2 ? "num1大于num2" : "num1小于或者等于num2";
console.log(str);

四、循环语句

1、while循环

while(条件){
    语句;
    语句;
}

var i =0;
while (i<10){
    console.log(i);
    i++;
}

//计算100以内所有正整数的加和
var i=1,sum=0;
while (i<=100){
    sum+=i;
    i++;
}
console.log(sum);
//在控制台输出100以内所有奇数
var i=0;
while(i<100){
    if(i%2===1){
        console.log(i);
        i++;
    }
}

2、do…while循环

var i=0
do{
    console.log(i);
    i++;
}while(i<10)

3、for循环

for(var i=0;i<10;i++){
	console.log(i);	
}

//计算100以内所有正整数的加和
sum=0;
for(var i=1;i<=100;i++){
    sum+=i;
}
console.log(sum);
//在控制台输出100以内所有奇数
for(var i=0;i<100;i++){
    if(i%2===1){
        console.log(i);
    }
}

4、中断循环

break; 跳出循环(结束循环)

continue; 跳出当前循环,继续执行后续循环

for(var i=0;i<10;i++){
    if(i===5){
        break;
    }
    console.log(i);
}

五、函数基础

函数是一个可执行的语句块(通过function关键字声明)

声明的时候不执行语句块

调用函数时执行

//声明函数
function fun(){
    语句块
}
//调用函数
fun();

传递参数:

通过参数可以让函数的功能更具扩展性。

形参:声明函数的时候可以定义;

实参:调用函数的时候传递实参;

function fun(x,y){
    var result=3*x+4*y;
    console.log(result);
}
fun(2,3);

返回值:

返回值表示函数运行之后的结果。

将返回值赋值给变量。

function fun(x,y){
    var result=3*x+4*y;
    return result;
}
console.log(fun(2,3));

六、对象

var cat={
    name:"miaomiao",
    age:2
}
console.log(cat.name);
console.log(cat["name"]);

1、方法

属性的值是一个函数,则成为方法

var cat={
    name:"mm",
    age:2,
    sayName:function(){
        console.log("我是mm");
    }
}
cat.sayName();

可以传参,返回值

var cat={
    name:"miaomiao",
    sayName:function(){
        console.log("我是miaomiao");
    },
    eat:function(food){
        console.log("吃" +food);
    },
    computed:function(n,m){
        return n+m;
    }
}

var result = cat.computed(1,2);
console.log(result);

2、this

方法中的this可以指向对象本身

var cat={
    name:"mm",
    age:2,
    sayName:function(){
        console.log("我是" +this.name);
    }
}

3、对象的分类

自定义对象(封装)

内置对象(例如Date,获取当前时间)

宿主对象(document)

第三方库的对象(jQuery,vue等)

七、数组

数组是一个特殊的对象,可以按顺序存储数据。

var list = [1,2,3,4,5];
//new 构造函数
var list = new Array("a","b","c");

1、获取数组中的元素

通过下标获取数组中的元素

list[0];

list[1];

获取数组元素的个数:list.length

2、遍历数组

2.1、while循环遍历
var list=["a","b","c","d","e","f"];
var i =0;
while(i < list.length){
    console.log(list[i]);
    i++;
}
2.2、for循环遍历数组
var list=["a","b","c","d","e","f"];
for(var i =0,i<list.length,i++){
    console.log(list[i]);
}
2.3、for in遍历( i 为索引)
var list=["a","b","c","d","e","f"];
for (var i in list){
    console.log(list[i]);
}
2.4、for of遍历( i 为值)
var list=["a","b","c","d","e","f"];
for (var i of list){
    console.log(i);
}
2.5、 map方法遍历
var list=["a","b","c","d","e","f"];
list.map(function(value,index){
    console.log(value);	//value:值,index:索引
});

3、数组常用方法

3.1、map
3.2、push
var list=["a","b","c","d","e","f"];
list.push("g");
console.log(list);//a,b,c,d,e,f,g
3.3、sort(排序)
var list=[1,3,5,4,2];
list.sort();
console.log(list); //1,2,3,4,5
3.4、filter(过滤器)
var list=[1,3,5,4,2];
var newList = list.filter(function(item){
    if(item>=3){
        return item;
    }
});
console.log(newList);	//3,5,4
3.5、join(连接)
var list=["a","b","c","d","e","f"];
var str = list.join("+");
console.log(str);	//a+b+c+d+e+f
3.5.1、split(将字符串拆分为数组)
var str = "2020-1-1";
var list =str.split("-");
console.log(list);	//"2020","1","1"

例题:找出数组[4,6,1,2,3,7,5]中的最大值的索引。

var list =[4,6,1,2,3,7,5];

var max=list[0];
var i =0;
list.map(function(value,index){
    if(value>max){
        max=value;
        i=index;
    }
})
console.log(max);
console.log(i);

八、内置对象

1、Array-数组

2、Math-数学

math.floor();向下取整

var number =3.14;
var result=math.floor(number);
console.log(result);	//3

math.random();0-1的随机数

var result= math.random();
console.log(result);	//0-1随机数

math.abs();绝对值

var number= -3.99;
var result =math.abs(number);
console.log(result);	//3.99

math.sqrt(9);开方

var number=9;
var result=math.sqrt(number);
console.log(result);	//3

math.pow(2,4);乘方

var number=2;
var result=math.pow(number,4);
console.log(result);	//16

例题1:获取1-10之间的随机数。

var result =math.floor(math.random() * 10 +1);
console.log(result);

例题2:随机点名.

var list =["钢铁侠","绿巨人","蝙蝠侠","雷神"];
var index=math.floor((math.random()*list.length));
console.log(list[index]);

3、Date-日期

var d= new Date();
var d_target = new Date("2020-1-1");

d.getFullYear();
d.getMonth();	//月份从0开始
d.getDate();
d.getDay();
d.getHours();
d.getMinutes();
d.getSeconds();
d.getTime();	//时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数
3.1、计时器方法setInterval

setInterval(function(){},ms);

例题:在控制台输出当前时间,每秒输出一次

setInterval(function(){
    var d= new Date()
	var hours=d.getHours();
	var minutes=d.getMinutes();
	var seconds=d.getSeconds();
    console.log(hours +":"+ minutes +":"+ seconds);
},1000)

4、RegExp-正则表达式

正则表达式可以用来匹配字符串

通过正则表达式,可以实现字符串的截取或按规定替换和验证字符串内容。

/^[a-zA-Z0-9_]{5,8}$/
^	//开头
$	//结尾
[]	//范围
{}	//位数
()	//分组
+	//匹配1位或多位,同{1,}
?	//0位或1位,同{0,1}
.	//匹配所有
\	//转义
\d	//数字,同[0-9]
\w	//数字、字母、下划线
\s	//空格或换行

九、ES2015基础语法

1、变量

1、使用let代替varlet str ="hello world";
2、块级作用域。
	{
        let str ="hello world";
    }
3、不存在变量提升。
	console.log(str);
	let str="hello world";	//报错
4、不允许重复声明。

2、常量

1const定义常量;
	const PI =3.14;
2、定义之后不可以修改;
3、不变的值用常量声明;
4、函数表达式可以使用常量;
	const fun = function(){
        console.log("hello world");
    }
    fun();
5、对象声明可以使用常量;
6、引用外部模块使用常量

3、模板字符串

1、支持换行。
	let str = `hello 
	world`;
	console.log(str);
2、支持嵌入变量。
	let year ="2020";
	let month = "10";
	let date = "10";
	let result =`${year}${month}${date}`;
	console.log()

4、结构赋值

1、数组的结构赋值
	let [n,m] =[10,20];
	console.log(n);
	console.log(m);

//调换两个参数的值
方法1let n=10;
let m=20;
let temp;
temp=n;
n=m;
m=temp;
console.log(n);
console.log(m);
方法2let n=10;
let m=20;
[n,m]=[m,n];
console.log(n);
console.log(m);
2、对象的结构赋值
	let {name,age} = {name:"xiaoming",age:10};
	console.log(name);
	console.log(age);
3、通过结构赋值传递参数

十、函数进阶

1、声明函数

1、一次声明、多次调用的语句块

2、参数:形参、实参

3、返回值:函数运行的结果

function fun(){
    return n+m;
}

let result1=fun(10,20);
let result2=fun(100,200);
console.log(result1);
console.log(result2);

2、函数声明提升

let result1=fun(10,20);
let result2=fun(100,200);
console.log(result1);
console.log(result2);

function fun(){
    return n+m;
}

3、匿名函数

function(){
    ....
}

//回调函数:将匿名函数作为参数传递给另一个函数或方法。
setInterval(function(){
    console.log("hello world");
},1000)

4、函数表达式

const fun =function (n,m){
    return n+m;
}
let result =fun(10,20);
console.log(result);

5、方法:属于某一个对象的函数

const cat ={
    name:"miaomiao",
    sayName:function(){
        console.log(this.name);
    }
    //简写
    sayName(){
        console.log(this.name);
    }
}
cat.sayName();

6、设置默认参数值

function fun(x=10,y=20){
    return x+y;
}
let result=fun(100,200);
console.log(result);

7、立即执行函数

(function (){
    //console.log("hello world");
    let a=10;
    let b=20;
    console.log(a+b);
})()

声明之后直接调用;

不可以多次调用;

某些第三方库实现封装;

8、闭包

闭包函数:声明在一个函数中的函数,叫做闭包函数。

闭包:内部函数总是可以访问其所在的外部函数中声明的变量和参数,即使在其外部函数被返回之后。(内部函数被返回,外部函数不会被销毁)

function fun1(){
    let n=10;
    let m=20;
    function fun2(){
        return n+m;
    }
    return fun2;
}

const f=fun1();
const result =f();
console.log(result);
//闭包的特性:内部函数未执行完,外部函数即使执行完成,外部函数中的变量也不会被销毁。

//利用闭包实现代码的封装
const module=(function(){
    let a=10;
    let b=20;
    function add(){
        return a+b;
    }
    return add;
})()

9、箭头函数

const fun = (x) =>{
    return x*x;
}
let result =fun(2);
console.log(result);
//简化
const fun = x=>x*x;
let result =fun(2);
console.log(result);

箭头函数中的this:

使用function定义的函数,this取决与调用的函数。

使用箭头函数,this取决于函数定义的位置。

const cat ={
    name:"miaomiao",
    sayName(){
        setInterval(() =>{
            console.log(this.name); 
        },1000)
    }
}
cat.sayName();

十一、面向对象

基本概念:

类:类型,模板,统称。(狗类,鸟类)

对象:是类的一个实例,会具体到某一个事物上

继承:狗类继承至哺乳动物类,猫类也继承至哺乳动物类,继承后,子类可以使用父类的属性和方法

1、ES5面向对象的知识

构造函数:用于创建对象的函数。

原型对象:prototype

原型链:实现继承

//1、es5是没有类的概念的,通过构造函数来实现类
//构造函数的函数名,首字母大写
//构造函数是用来创造对象用的
function Dog(n,a){
    this.name=n;
    this.age=a;
}
var dog = new Dog("旺财",2);//创造了一个对象,狗类的实例
console.log(dog.name);


//2、prototype
function Dog(name,age){
    this.name=name;
    this.age=age;
}
//通过原型对象,为构造函数生成的对象赋予新的方法
Dog.prototype.sayName=function(){
    console.log(`我的名字是${this.name}`);
}

var dog = new Dog("旺财",2);
var bigDog = new Dog("二哈",3);
dog.sayName();
bigDog.sayName();

//3、原型链实现继承
function Animal(name){
    this.name=name;
}
Animal.prototype.sayName(){
    console.log(`你好,我是${this.name}`);
}
Animal.prototype.sayHello(){
    console.log("hello!!!");
}

function Dog(name){
    this.name=name;
}

Dog.prototype=new Animal();//Dog继承Animal

var dog=new Dog("旺财");
dog.sayName();
dog.sayHello();

2、ES2015面向对象语法

Class关键字

class Dog{
    constructor(name,age){
        this.name=name;
        this.age=age;
    }
    sayName(){
        console.log(`我是${this.name}`);
    }
}
let dog =new Dog("旺财",2);
dog.sayName();

继承

class Animal{
    constructor(name){
        this.name=name;
    }
    sayName(){
        console.log(`我是${this.name}`);
    }
}
class Dog extends Animal{	//extends继承
    
}
let dog =new Dog("旺财");
dog.sayName();
class Animal{
    constructor(name){
        this.name=name;
    }
    sayName(){
        console.log(`我是${this.name}`);
    }
}
class Dog extends Animal{	//extends继承
    constructor(name,age){
        super(name);		//父级属性加进来super
        this.age=age;
    }
}
let dog =new Dog("旺财",2);
console.log(dog.age);

十二、DOM基础

1、获取节点

document.getElementById();
document.getElementByName();
document.querySelector();
document.querySelectorAll();

domObject.innerHTML:获取元素内的所有内容。
<h1 id="title">hello world</h1>

<script>
let h1=document.getElementByid("title");
h1.innerHTML="你好世界";
</script>

2、事件类型

click

mouseenter

mouseleave

let btn =document.querySelector("button");
btn.onclick=function(){
	console.log("hello btn")
}

let box =document.querySelector("#box");
box.onmouseenter=function(){
    console.log("hello");
}
box.onmouseleave=function(){
    console.log("box");
}

3、设置样式

element.style.color

element.style.backgroundColor

通过click、mouseenter、mouseleave事件控制样式

let box =document.querySelector("#box");
box.onmouseenter=function(){
    this.style.backgroundColor="blue";
}
box.onmouseleave=function(){
    this.style.backgroundColor="red";
}

4、设置属性

element.src

element.id

点击数字列表切换图片

<img src="images/1.jpg">
<button>1</button>
<button>2</button>
<button>3</button>
<script>
    let img =document.querySelector("img");
    let imagesSrcList = ["images/1.jpg","images/2.jpg","images/3.jpg"];
    let btns =docunment.squerySelectorAll("button");
    for(let i in btns){
        btns[i].onclick=function(){
            img.src=imagesSrcList[i];
        }
    }
</script>

5、通过class属性设置样式

element.className

点击原始、设置激活的背景色

<style>
    .active{
        background-color:red;
    }
</style>

<h1 class="title">hello world</h1>

<script>
    let h1=document.querySlector("h1");
    h1.onclick=function(){
        this.className="active";
    }
</script>

十三、DOM节点操作

1、元素节点(获取元素节点:querySelector;querySelectorAll)

2、文本节点(innerHTML)

3、属性节点(element.src;element.id)

//在ul中添加li标签

ul.innerHTML =`

<li>香蕉</li>

<li>苹果</li>

<li>鸭梨</li>

`

1、节点操作

创建元素节点:createElement

创建文本节点:createTextNode

添加节点:appendChild

删除节点:removeChild

<input type="text">
<button>按钮</button>
<ul></ul>

<script>
	let btn =document.querySelector('button');
    let ul =document.querySelector('ul');
    let inp =document.querySelector('input');
    btn.onclick =function(){
        let value = inp.value;
        let li=document.createElement("li");//添加元素节点
        let txt=document.createTextNode(value)//添加文本节点
        ul.appendChild(li);//添加节点
        li.appendChild(txt);
    }
</script>
<input type="text">
<button>按钮</button>
<ul>
	<li>香蕉</li>
	<li>苹果</li>
	<li>鸭梨</li>
</ul>

<script>
	let btn =document.querySelector('button');
    let ul =document.querySelector('ul');
    let inp =document.querySelector('input');
    let list =document.querySelectorAll('li')
    btn.onclick =function(){
        let value = inp.value;
        let li=document.createElement("li");//添加元素节点
        let txt=document.createTextNode(value)//添加文本节点
        ul.appendChild(li);//添加节点
        li.appendChild(txt);
    }
    for(let i in list){
        list[i].onclick=function(){
            ul.removeChild(this);//删除节点
        }
    }
</script>

2、事件对象

事件监听函数的形参可以获取事件对象。

通过事件对象可以获取鼠标坐标

1、获取X坐标:event.clientX;

2、获取Y坐标:event.clientY;

<div class="box"></div>
<script>
	let box=document.querySelector(".box");
    box.onclick=function(e){
        console.log(e.clientX);
        console.log(e.clientY);
    }
</script>

十四、事件

### 1、绑定事件

1、addEventListener(“eventType”,fun)

2、element.onEventType =fun

区别:

addEventListener在同一元素上的同一事件类型添加多个事件,不会被覆盖,而onEventType会覆盖。

addEventListener可以设置元素在捕获阶段触发事件,而onEventType不能

<button>按钮</button>
<script>
	let btn = document.querySelector("button");
    //onclick写法
    btn.onclick = function (){
        console.log("hello world");
    }
    //addEventListener写法
    btn.addEventListener("click",function(){
        console.log("hello javascript");
    })
    
</script>

2、事件流

三个div嵌套,都绑定click事件,点击最内层的元素,事件如何执行?

a:只执行最内层

b:从内到外都执行 √

c:从外到内都执行

在这里插入图片描述

2.1、事件捕获与事件冒泡

默认情况下,事件会在冒泡阶段执行

addEventListener(eventType,fun,boolean);默认false:冒泡阶段触发;true:捕获阶段触发

2.2、阻止事件冒泡

e.stopPropagation();

let box =document.querySelector("box");
box.onclick= function (e){
    box.style.display="none";
    e.stopPropagation();//阻止事件冒泡
}
2.3、事件默认行为

为一个可以跳转到百度的a标签设置点击事件

<a href="http://baidu.com"></a>
<script>
	let a= document.querySelector("a");
    a.onclick =function(e){
        console.log("hello world");
        e.preventDefault();//去掉事件默认行为
    }
</script>

<a href="http://baidu.com"></a>
<script>
	let a= document.querySelector("a");
    a.onclick =function(e){
        console.log("hello world");
        return false;//去掉事件默认行为
    }
</script>

3、事件委托

通过e.target将子元素的事件委托给父级处理

<input type="text">
<button>添加</button>
<ul class="fruit-list">
    <li>香蕉</li>
    <li>苹果</li>
    <li>鸭梨</li>
</ul>
<script>
	let btn=document.querySelector("button");
    let ul=document.querySelector(".fruit-list");
    let inp=document.querySelector("input");
    btn.onclick=function(){
        let value=inp.value;
        let li = document.createElement("li");
        let txt = document.createTextNode(value);
        li.appendChild(txt);
        ul.appendChild(li);
    }
    //事件委托
    ul.onclick=function(e){
        ul.removeChild(e.target);
    }
</script>

4、事件类型

1、鼠标事件
2、键盘事件
let box =document.querySelector(".box");

document.onKeydown = function(e){	//onKeydown
    let code = e.keyCode;	//e.keyCode每个键对应的码
    switch(code){
        case 37:box.style.left=box.offsetLeft - 5 +"px";break;//offsetLeft获取左侧偏移量
        case 38:box.style.top=box.offsetTop - 5 +"px";break;
        case 39:box.style.left=box.offsetLeft + 5 +"px";break;
        case 40:box.style.top=box.offsetTop + 5 +"px";break;
    }
}
3、触屏事件
let box = document.querySelector(".box");
box.ontouchstart=function(){//按下屏幕
    console.log("start");
}
box.ontouchend=function(){//离开屏幕
    console.log("end");
}
box.ontouchmove=function(){//滑动
    console.log("I'm moving!");
}

十五、计时器方法

1、setInterval与clearInterval

let timer setInterval(() => {
    console.log("hello world");
},1000)

let btn =document.querySelector("button");
btn.onclick =function(){
    clearInterval(timer);//暂停
}

2、setTimeout与clearTimeout

let timer=null;
document.qyerySelector("button").onclick=function(){
    clearTimeout(timer);//停止
}

//2秒后输出hello world
timer= setTimeout(()=>{
    console.log("hello world");
},2000)
//3秒后跳转到百度
setTimeout(()=>{
    location.href="http://baidu.com";//location跳转
},3000)

3、防抖与节流

解决性能问题,开发中常会遇到。

防抖:对于短时间内多次触发事件的情况,可以使用防抖停止事件持续触发。

节流:防止短时间内多次触发事件的情况,但是间隔事件内,还是需要不断触发。

//window.onscroll 鼠标滚动事件
window.onscroll =function(){
    console.log("hello world");
}

//防抖
let timer =null;
window.onscroll =function(){
    if(timer !== null){
        clearTimeout(timer);
    }
    timer = setTimeout(()=>{
        console.log("hello world");
        timer=null;
    },500)
}

//节流
let mark =true;
window.onscroll =function(){
    if(mark){
        setTimeout(()=>{
            console.log("hello world");
            mark=true;
        },500)
    }
    mark =false;
}

返回顶部效果

1、window.onscroll事件:滚动条滚动事件

2、document.documentElement.scrollTop:页面滚动位置距离顶部距离

3、window.scrollTo(0,0):让页面滚动条返回顶部。

<style>
    button{
        positon:fixed;
        right:100px;
        bottom:100px;
        display:none;
    }
    body{
        height:1000px;
    }
</style>

<h1>hello world</h1>
<button></button>

<script>
    let btn=document.querySelector("button");
	document.querySelector("button").onclick =function(){
        window.scrollTo(0,0);
    }
    
    let timer=null;
    window.onscroll =function(){
        if(timer!==null){
            clearTimeout(timer);
        }
        timer=setTimeout(()=>{
            console.log("计数器");
            if(documnet.documnetElement.scrollTop > 0){
                btn.style.display="block";
            }else{
                btn.style.display="none";
            };
            timer=null
        },500)
        
        
    }
</script>

<!--利用闭包,封装防抖算法-->
<script>
    let btn=document.querySelector("button");
	document.querySelector("button").onclick =function(){
        window.scrollTo(0,0);
    }
    
    function debounce(fn){
        let timer =null;
        function eventFun(){
            if(timer!==null){
                clearTimeout(timer);
            }
            timer= setTimeout(()=>{
                fn();
                timer=null;
            },500)
        }
        return eventFun;
    }
    window.onscroll =debounce(()=>{
        console.log("计数器");
        if(document.documentElement.scrollTop>0){
            btn.style.display="block";
        }else{
         	btn.style.display="none";   
        }
    });
        
    }
</script>
<!--利用闭包,封装节流算法-->
<script>
    let btn=document.querySelector("button");
	document.querySelector("button").onclick =function(){
        window.scrollTo(0,0);
    }
    
    function throttle(fn){
        let mark =true;
        return function(){
            if(mark){
                setTimeout(()=>{
                    fn();
                    mark=true;
                },500)
            }
            mark =false;
        }
    }
    
    window.onscroll =throttle(()=>{
        console.log("计数器");
        if(document.documentElement.scrollTop>0){
            btn.style.display="block";
        }else{
         	btn.style.display="none";   
        }
    });
        
    }
</script>

十六、BOM

DOM:文档对象模型(document对象)

BOM:浏览器对象模型

1、window对象(全局对象)

window对象是全局对象,所有在浏览器可以直接使用的方法,都是window对象的方法。

计时器方法;弹出框方法

1.1、弹出框
1.alert		//alert("hello world");
2.prompt	//let str = prompt("请输入你的名字:");
3.confirm	//let result = confirm("确定是否删除此条记录?");

猜数字:

let target = Math.floor(Math.random()*100+1);

//递归函数:在函数体内调用自己
function guessNumber(){
    let number = prompt("请输入你猜的数字");
    if(number == target){
        alert("恭喜你回答正确!");
    }else if(number>target){
        alert("大于目标结果!")
        guessNumber();
    }else if(number<target){
        alert("小于目标结果!")
        guessNumber();
    }
}
guessNumber();

水果列表删除提示功能:

<ul class="fruit-list">
    <li>香蕉</li>
    <li>苹果</li>
    <li>鸭梨</li>
</ul>
<script>
	let ul=document.querySelector(".fruit-list");
    ul.onclick=function(e){
        let mark=confirm("是否删除此水果?");
        if(mark){
          ul.removeChild(e.target);  
        }
    }
</script>

2、screen对象包含有关用户屏幕的信息

3、location对象用于获取当前页面的地址(URL),并把浏览器重定向到新的网页

1、location.href			//属性返回当前页面的URL "https://www.baidu.com"
2、location.hostname		//主机的域名 "www.baidu.com"
3、location.pathname		//当前页面的路径和文件名 "/s"
4、location.prot			//端口	"8080"
5、location.protocol		//协议	"https:"

4、history对象包含浏览器的历史

5、navigator对象包含有关访问者浏览器的信息

navigator.userAgent

检查当前设备,并在控制台输出

十七、原始类型与引用类型

六种数据类型:

数值(Number)、字符串(String)、布尔(Boolean)、空(Null)、未定义(Undefined)、对象(Object)

在这里插入图片描述

1、原始类型与引用类型的区别:

1.1、赋值的区别
//原始类型
let str1="hello";
let str2=str1;
str1="world";
console.log(str1);//world
console.log(str2);//hello
//引用类型
let obj1={name:"小明"};
let obj2=obj1;
obj1.name="小红";
console.log(obj1.name);//小红
console.log(obj2.name);//小红

原始类型赋值、引用类型的是引用

1.2、比较的区别
//原始类型
let str1="hello";
let str2="hello";
console.log(str1===str2);//true

//引用类型
let obj1={name:"小明"};
let obj2={name:"小明"};
console.log(obj1===obj2);//false;

原始类型比较的是值,引用类型比较的是引用是否指向同一个对象。

1.3、传参的区别
//原始类型
function fun(x){
    x=100;
    console.log(`x的值是${x}`);//x的值是100
}
let number=10;
fun(number);
console.log(`number的值是${number}`);//number的值是10


//引用类型
let obj ={name:"小明"};
function fun(o){
    o.name="小红";
    console.log(`o的名字是${o.name}`);//o的名字是小红
}
fun(obj);
console.log(`obj的名字是${obj.name}`);//obj的名字是小红

2、原始类型与引用类型的类型检测

2.1、原始类型数据检测:typeof(值)
//原始类型
let num=100;
let str="hello world";
let und;
let nu=null;
let bool=ture;
console.log(typeof(num));//number
console.log(typeof(str));//string
console.log(typeof(und));//undefind
console.log(typeof(nu));//object
console.log(typeof(bool));//boolean
2.2、引用类型数据检测:值instranceof类型
//引用类型
let arr=[1,2,3];
let reg=/123/;
let date=new Date();

console.log(arr instanceof Array);//true
console.log(reg instanceof RegExp);//true
console.log(date instanceof Date);//true

实例:数组存储学生列表

<input type="text" class="name" placeholder="姓名">
<input type="text" class="age" placeholder="年龄">
<button>添加</button>

<script>
	let inputName=document.querySelector(".name");
    let inputAge=document.querySelector(".age");
    let btn=docunment.querySelector("button");
    let studentList=[];
    //let student={};
    class Student{
        constructor(name,age){
            this.name=name;
            this.age=age;
        }
    }
    btn.onclick =function(){
        //student.name=inputName.value;
        //student.age=inputAge.value;
        let stydent = new Student(inputName.value,inputAge.value);
        studentList.push(student);
        console.log(studentList);
    }
</script>

十八、异步编程

1、同步与异步

//同步
console.log("给1打电话");
console.log("给2打电话");
console.log("给2打电话");

//异步
setTimeout(()=>{console.log("给1发短信")},200);
setTimeout(()=>{console.log("给2发短信")},500);
setTimeout(()=>{console.log("给3发短信")},2000);
setTimeout(()=>{console.log("给4发短信")},100);
setTimeout(()=>{console.log("给5发短信")},900);

posted @ 2025-12-18 16:52  叶小格  阅读(0)  评论(0)    收藏  举报  来源