day-54前端

javaSript

什么是js:

  前台脚本编程弱语言,完成页面业务逻辑及页面交互

js作用:

1、可以自己生成页面数据
2、可以请求后台数据
3、可以接受用户数据 - 可以渲染给页面的其他位置;提交给后台
4、修改页面标签的 内容、样式、属性、事件(页面通过js可以完成与电脑的输入输出设备的交互)

学习方向:js代码书写位置、js基础语法、js选择器、js页面操作来学习

学习目的:完成页面标签与用户的人机交互以及前台数据处理的业务逻辑

书写位置

1.行间式: 写在标签的 事件属性 中

<div id="dd" onclick="alert('hello js')"></div>

2.内联式:写在script标签中,script标签应该出现在body的最下方(可以将其放在body结束后)

<script>

dd.onclick = function () {
alert('hello js')
}
</script>

3.外联式:通过script标签的src属性,链接外部js文件

<script src="js/js导入.js">                             一个script标签拥有src引入外部js文件后,就相当于单标签,所以内部的代码会被自动屏蔽
</script>

三种输出方式

1. 控制台输出语句
console.log('你丫真帅')

2.弹出框提示信息
alert('你丫确实帅')

3.将内容书写到页面
document.write('<h2 style="color: red">你丫帅掉渣</h2>')

变量与常量

let num = 123;   关键字变量赋值
num++;

const str = '123';
str = '456';      常量声明时必须赋初值,且一旦赋值,不可改变

数据类型

 值类型
1) 数字类型(只有整数)
let a = 123;
console.log(a, typeof(a));
a = 3.14;
console.log(a, typeof(a));

2) 布尔类型
let b = false;
console.log(typeof(b), b);


 3) 字符串类型:''    ""    ``
let c = `123
456
789`;
console.log(c, typeof(c));

 4) 未定义类型:未初始化的变量
let d;
console.log(d, typeof(d));

引用类型
 5) 数组(相当于list):
let arr = [1, 2, 3];
console.log(arr, typeof(arr));

6) 对象(相当于dict):      所有的key必须是字符串
let sex = '男';
let dic = {
name: 'Owen',
age: 17.5,
sex,              value如果是变量,变量名与key同名,可以简写
};
console.log(dic, typeof(dic));

7) 函数类型
function fn() { }
console.log(fn, typeof(fn));

8) null类型
let x = null;
console.log(x, typeof(x));

弱语言类型

let aaa = 123;
let bbb = '123';

console.log(aaa == bbb);          == 只做数据比较
console.log(aaa === bbb);          === 做数据与类型比较

 弱语言类型:会自己根据环境决定如何选择类型存储数据
console.log(1 + 2);     // 3
console.log('1' + '2');     // 12
console.log(1 + '2');     // 12
console.log(1 - '2');     // -1

js运算符

算数运算符:

+(加法)、-(减法)、*(乘法)、/(除法,得到浮点型)、%取模(除完没除尽的整数)、++(自增)、--(自减) 

  js没有整数浮点数之分,所以要想浮点数转整数,通过 res = parseInt(任何数字开头,只拿整数数字);

                            res=parseFloat(任何数字开头,只拿到浮点型数字);


  res = n1++;    先将n1的值赋值给res,自己再自增1
  res = ++n1;    先自己自增1, 再将n1的值赋值给res

  ++在前优先级最高,++在后优先级最低(比赋值符,还低)

赋值运算符:


前提:x=5,y=5

| 运算符 | 例子 | 等同于 | 运算结果 |
| :----- | :--- | ------ | -------- |
| =   | x=y | | 5 |
| +=    | x+=y | x=x+y | 10 |
| -=     | x-=y | x=x-y | 0 |
| *=     | x*=y | x=x*y | 25 |
| /=     | x/=y | x=x/y | 1 |
| %     | x%=y | x=x%y | 0 |

比较运算符:

前提:x=5

| 运算符 | 描述 | 比较 | 结果 |
| ------ | ---------- | ------- | ----- |
| ==   | 等于 | x=="5" | true |
| === | 绝对等于 | x==="5" | false |
| !=    | 不等于 | x!="5" | fales |
| !==  | 不绝对等于 | x!=="5" | true |
| >     | 大于 | x>5 | false |
| <     | 小于 | x<5 | false |
| >=   | 大于等于 | x>=5 | true |
| <=   | 小于等于 | x<=5 | true |

逻辑运算符:

前提:n=5

| 运算符 | 描述 | 例子 | 结果 |
| ------ | ---- | ------------- | ------------------- |
| &&   | 与 | x=n>10&&++n | x=false,n=5(短路) |
| ||    | 或 | x=n<10||n-- | x=true,n=5(短路) |
| !       | 非 | x=!n | x=false,x=5 |

与短路:有一个为假,就短路

或短路:有一个为真,就短路 

 如果 !    为真,!!就为假

三目运算符:

条件 ? 结果1 : 结果2(表达式成力取前面,不成立取后面)
res = 10 == '10' ? '相等' : '不等';

console.log(res);

js流程控制

if判断:

if (条件表达式) {
  代码块;
}

==================================

if (表达式1) {
  代码块1;
} else {
  代码块2;
}

==================================

if (表达式1) {

} else if (表达式2) {

}
...
else if (表达式2) {

} else {

}

=================================

if (表达式1) {
  if (表达式2) {

  }
}

================================

while、for循环:

for (循环变量①; 条件表达式②; 循环变量增量③) {
  代码块④;
}
for循环执行的顺序:①   ②④③ ... ②④③    ②,入口为①,出口为②,②④③就是循环过程

 案例:
for (var i = 0; i < 5; i++) {
  console.log(i);
}

==================================

while (条件表达式) {
  代码块;
}

================================

do {  代码块;

} while (条件);

先执行代码块,在执行条件

===============================

for…in迭代器:

 得到的是索引

var arr = [1, 2, 3, 4, 5]
for (num in arr) {
  console.log(num);
}

结果:0,1,2,3,4,

随机数推导过程:

  Math.random()的随机数是  [0, 1) 

 
  [0, 1) * 11 => [0, 11)  parseInt() => [0, 10] + 5 => [5, 15]
  [0, 1) * (n - m + 1) => [0, n - m + 1) parseInt() => [0, n - m] + m => [m, n]


     公式:parseInt(Math.random() * (max - min + 1)) + min


  案例:let num = parseInt(Math.random() * (40 - 10 + 1)) + 10;
       console.log(num);

  

函数

函数的关键字:

  function

函数的函数名:

  fn 

  是使用函数的依据,就是一个变量,可以赋值给其他变量,也可以存储在容器中,也可以作为函数的参数与返回值

函数的参数:

  都是按位置传(没有关键字传参),形参与实参个数不需要统一,但是一定是按位赋值 (你传你的,我收我的)

通过...语法接收多个值

function fn (a, ...b) {       //...变量必须出现在参数列表最后
  console.log(a, b)        // 100 [200 300]
}
fn(100, 200, 300)      
 

函数的返回值:

function fn () {
  return 返回值;
}

  1.可以空return操作,用来结束函数
  2.返回值可以为任意js类型数据
  3.函数最多只能拥有一个返回值,如果多个,取最后一个,所以返回值用[]包裹,返回出来

函数之匿名函数

没有名字的函数就是匿名函数

function () {
        
}

使用场景:

1.需求需要一个函数地址,就可以传入一个匿名函数

function fn100(fn) {
  fn()
}

fn100( function () { console.log('传进去的匿名函数') } )

2.用变量接收匿名函数(第二种声明函数的方式)

let f = function (a, b) {
  console.log('ffffffffff')
};
f();

3.为事件提供方法体

hhh.onclick = function () {                  / hhh是标签id,所以可以直接引用
  console.log('hhh 被点击了')
};

4.匿名函数自调用:一次性使用,并且产生了一个局部作用域,里面的属性外面无法访问

(function (a, b) {
  console.log('匿名函数自调用:', a, b)
})(10, 20, 30);

四种变量

if (true) {         // 块级作用域
    let a = 10;
   const b = 20;
     var c = 30;
    d = 40;
 }

 console.log(a);       有{}就不能被外界访问(推荐使用)
 console.log(b);     let和const有块级作用域,不允许重复定义
 console.log(c);       var没有块级作用域, 但有局部作用域,不能被外界访问,可以重复定义
 console.log(d);      没有关键字声明的变量是全局变量,在函数内部声明的外部也可以用

数据类型的运用

字符串的运用:

1)定义:
  let ss = '123abc呵呵';

 2)索引
  res = ss[0];
 3)切片
  res = ss.slice(3, 6);
 4)替换
res = ss.replace('abc', 'ABC');
 5)拆分:     字符串 => 列表
res = ss.split('');  按空格/指定的拆
 6) 拼接
res = ss + ss;
 7) 迭代
for (s of ss) {
console.log(s);
}

数组的运用:

1)拼接

let arr = [3, 1, 2, 4, 5];          列表转字符串
res = arr.join('');             默认按,拼/按‘’拼一起/自定义拼

2)迭代

for (a of arr) {
  console.log(a);
}

3)排序

 arr.sort();
 arr.reverse();

 console.log(arr[4]);

增删改

  开始操作的索引 操作的长度 操作后的结果(不定长0~n个)
  arr.splice(2, 1, 222);    或者(2,1)删除

字典的运用:

增删改查

dic = {};



dic.age = 18;


 改
dic.age = 20;


 对象的删除
delete dic.age;

 查
console.log(dic.name);

字典的迭代用 for in
for (k in dic) {
  console.log(k);
}

js选择器

querySelect系列

1.通过id名获取唯一满足条件的页面元素

  document.getElementById('id名');

 2、通过class名获取所有满足条件的页面元素

  document.getElementsByClassName('class名');

  返回值是一个类数组结果的对象,使用方式同数组

 3.通过tag名获取所有满足条件的页面元素

  document.getElementsByTagName('tag名');

  返回值是一个类数组结果的对象,使用方式同数组

 querySelect系列

1.获取第一个匹配到的页面元素

  document.querySelector('css3语法选择器');

 2.获取所有匹配到的页面元素

  document.querySelectorAll('css3语法选择器');

  返回值是一个类数组结果的对象,使用方式同数组

事件的绑定

 获取标签样式、内容、属性

 let h1 = document.querySelector('h1');

只能获取行间式样式

  标签.style.属性名 

    let fontSize = h1.style.fontSize;

getComputedStyle(ele_name, 伪类选择器通常用null填充) 能获取所有方式的样式(内联与外联叫计算后样式)

   let bgColor = getComputedStyle(h1, null).backgroundColor;

获取标签的内容

  console.log(h1.innerText);
  console.log(h1.innerHTML);

获取标签的属性

  console.log(h1.getAttribute('id'));

修改样式、内容、属性

修改样式

  可以直接修改样式 - 修改的是行间式

   h1.style.color = 'red';  

  css的 - 链接语法对应 js的 小驼峰命名法

   h1.style.borderRadius = '50%';  

修改内容 

  h1.innerText = '修改过后的内容';
  h1.innerHTML = '<i>修改过后的内容</i>';

修改属性

    h1.setAttribute('owen', 'oooooooooooooooo');

表单内容的查、改

  let inp = document.querySelector('input');
  console.log(inp.value);        查
  inp.value = 67890;          改

  // console.log(inp.getAttribute('value'));
  // inp.setAttribute('value', '0000000000000');

鼠标事件

 onclick、ondblclick、onmouseover、onmouseleave、onmousemove、onmousedown、onmouseup

   单击    双击           悬浮                   离开悬浮             鼠标在里面移动    鼠标按下          鼠标松开

let h1 = document.querySelector('h1');

h1.onclick = function (ev) {
  console.log(ev);            // 包含着鼠标的相关信息

  console.log(ev.clientX, ev.clientY);  // 鼠标点击点

  console.log(ev.altKey, ev.ctrlKey, ev.shiftKey);  // 特殊按键
};

案例:

h2 = document.querySelector('h2');


h2.onmouseover = function () {
  h1.innerText = 'h2被悬浮了';
  h1.style.color = 'green';
};


h2.onmouseleave = function () {
  h1.innerText = 'h2被放开了';
  h1.style.color = 'red';
};


let count = 1;
h2.onmousemove = function () {
  ++count;
  h1.innerText = '鼠标在h2身上游走' + count + '下';
  this.innerText = '鼠标在h2身上游走' + count + '下';    为某个标签绑定事件,去控制页面中任何一个标签(绑定事件中的this就代表自身)
};

键盘事件

  只要在窗口下,按下键盘就可以触发

   onkeydown、onkeyup、onkeypress

  let inp = document.querySelector('input');
  inp.onkeydown = function (ev) {
     console.log(ev.keyCode)
}

案例:

document.onkeydown = function (ev) {
  console.log(ev.keyCode);
  if (ev.keyCode == 37) {
    console.log('你按了左键');
  } else if (ev.keyCode == 38) {
    console.log('你按了上键');
}
console.log(ev.altKey);
if (ev.ctrlKey && ev.keyCode == 13) {
console.log('留言');
}

表单事件

let inp = document.querySelector('input');
let h22 = document.querySelector('h2:nth-of-type(2)');

inp.oninput = function () {        // onchange当input失去焦点才会触发    oninput 内容改变时触发
  h22.innerText = this.value;
};

原文地址:https://www.cnblogs.com/klw1/p/11134768.html