js写入的方式有两种

①引入外部的js—即引入index.js文件—-常用
image.png
②在html文件中写script
image.png

数据类型

弱类型自动推断类型

数字(number)
字符串(string)
布尔型(boolean)

null(空)&undefined(未定义)

注意:空和未定义不是一回事
null是有值但为空,undefined是根本没有被定义

定义变量—var&let(const定义常量)

弱类型—不需要申明这个变量的类型,统一用var

  1. <script>
  2. // 数字
  3. var num=3;
  4. var money=20.5;
  5. // 字符串
  6. var str='hello';
  7. // 布尔型
  8. var flag=true;
  9. // 空
  10. var nul=null;
  11. // 未定义
  12. var person;
  13. console.log('hello js')
  14. console.log(num)
  15. console.log(money)
  16. console.log(str)
  17. console.log(flag)
  18. console.log(nul)//null
  19. console.log(person)//undefined
  20. </script>

注意:建议js中使用‘ ‘;
用var定义可以重复使用相同的名字,但是会被后者覆盖;用let定义不能重复,会报错,但是使用变量可以重新赋值;用const定义的变量不能被修改,且定义变量时必须要初始化。

  1. // 数字
  2. let nums=3;
  3. let nums=618;
  4. console.log(nums)//会报错
  5. nums=255;
  6. var num=100;
  7. var num=200;
  8. console.log(num)//输出结果:200

运算符

算术运算符( + - * / % )

  • 两边都先转换为number,再运算

    1. // + - * / %
    2. var a =3;
    3. var b = 3.3;
    4. var c = 4;
    5. console.log(a/c);//0.75
    6. console.log(a*b) // 9.899999999999999
    7. console.log(b/a) // 1.0999999999999999
    8. console.log(c%a) // 1

    比较运算符( >,<,==,>=,<=,!= )

  • 两边都先转换为number,再比较,返回的是 boolean

    1. var a = true
    2. var b = 1;
    3. console.log(a==b) // true
    4. console.log(a=="1") //true 两边都先转为number
    1. //在js中判断变量相等
    2. var a = '5';
    3. var b = 5;
    4. // 只要求内容相等,不要求数据类型相同
    5. console.log(a == b); //true
    6. // 要求内容相等,要求数据类型相同
    7. console.log(a === b); //false
  • 注意: null == undefined

null 和 undefined 不能转化为其他值
** Number(""),Number(" "),Number(null) => 输出 0**

  1. // Number(""),Number(" "),Number(null) => 输出 0
  2. console.log(false == ""); // true
  3. console.log(true == 1); // true
  4. console.log(null == undefined); // true
  5. console.log(undefined == false); // false
  6. console.log(1 == "1"); // true
  7. console.log(null == false); // false
  8. /* 1.只有有一边为 boolean 先两边转为number
  9. 2.一边为string,一边为number,先将两遍转为number
  10. // 两边都先转为number
  11. 3. null == undefined
  12. 4. null 和 undefined 不能转化为其他值
  13. */

逻辑运算符( &&,||,! )

  • 两边都先转换为boolean,再判断,返回的是 boolean值 ```javascript // && 逻辑与 两个为true,结果才为true // || 或 只要有一个为true,结果就为true // ! 非
    console.log(3>2 && 4>3) // true && true 结果为true console.log(3>2 && 4<3) // true && false 结果为false

console.log(11>5 || 3<4) // true || false 结果为true

console.log(!(3>4)) //!false 结果为true

  1. ```javascript
  2. /* var a = 0;
  3. var b = 1;
  4. console.log(a && b);//0
  5. console.log(b && a);//0
  6. console.log(a || b);//1
  7. console.log(b || a);//1 */
  8. var a = 3;
  9. var b = 1;
  10. console.log(a && b);//1
  11. console.log(b && a);//3
  12. console.log(a || b);//3
  13. console.log(b || a);//1

或运算的注意点

  • || 有一边为true,结果就为 true,遇到true就会返回

    1. var b = 0 || "abc"
    2. var c = "abc" || 1;
    3. var d = 0 || NaN
    4. console.log(b) // abc
    5. console.log(c) // abc
    6. console.log(d) // NaN

    与运算的注意点

  • **两边都为true,结果才为true 遇到false的情况,直接返回**

    1. console.log("abc" && 10) // 10
    2. console.log(0 && "abc") // 0

    三元运算符

    1. // true 输出问号后面的第一段语句
    2. // false 输出问号后面的第二段语句
    3. var a = (4>5)?"4大于5":"4小于5";
    4. console.log(a)

    赋值运算(+=,-=)

    1. // +=,-=
    2. var a = 2;
    3. //a=a+4;
    4. a+=4;
    5. var b = 4;
    6. b-=4; // b=b-4;
    7. console.log(a) // 6
    8. console.log(b) // 0

    数组—三种方式

    ①var array=Array();
    ②var array=new Array();
    ③var array=[1,2,3];

    1. //数组
    2. var array=Array();
    3. array[0]=1;
    4. // console.log(array);//[1]
    5. array[1]=618;
    6. console.log(array);//[1,618]
    7. var array=new Array();
    8. array[0]=618;
    9. console.log(array);//[618]
    10. var array=[1,2,3];
    11. console.log(array);//[1,2,3]
    12. array[8]=8;
    13. console.log(array);//[1, 2, 3, empty × 5, 8]
    14. for(var i=0;i<array.length;i++){
    15. console.log(array[i])
    16. }

    方法—直接用function+方法名(){方法体}

    注意:
    如果方法有返回值,直接在方法体中加入return;如果没有则不需要在意。
    参数不需要写类型

    1. //方法1
    2. function plus(a,b){
    3. console.log(a+'+'+b+'='+(a+b))//1+4=5
    4. return a+b;//有返回值
    5. }
    6. var c=plus(1,4)
    7. console.log(c)//5
    8. //方法2
    9. var minus=function(a,b){
    10. console.log(a+'-'+b+'='+(a-b))//1-4=-3
    11. return a-b;//有返回值
    12. }
    13. minus(8,4);
    14. var sc=minus(1,4)
    15. console.log(sc)//-3
    16. //方法3
    17. ;(function(a,b){
    18. console.log(a+'-'+b+'='+(a-b))//8-8=0
    19. return a-b;
    20. })(8,8)

    对象(Object)

    注意:
    js中{ }表示对象;[ ]表示数组。

    1. //对象
    2. var dog=new Object();
    3. //属性
    4. dog.color='red';
    5. // console.log(dog)//color: "red"
    6. //方法
    7. dog.eat=function(){
    8. console.log('我要吃骨头')
    9. }
    10. dog.eat();
    11. console.log(dog)

    构造方法

    1. //构造方法
    2. function User(name,age){
    3. //this相当于创建的对象user
    4. this.name=name;
    5. this.age=age;
    6. }
    7. var user=new User('嘎嘎',27);
    8. // console.log(user)//User {name: "嘎嘎", age: 27}
    9. //添加方法
    10. user.eat=function(){
    11. console.log('干饭啦')
    12. }
    13. //调用方法
    14. user.eat();
    15. console.log(user)

    json

    1. //构造方法
    2. //一个人养了一条狗
    3. function User(name,age,dog){
    4. //this相当于创建的对象user
    5. this.name=name;
    6. this.age=age;
    7. this.dog=dog;
    8. }
    9. function Dog(name,color){
    10. //this相当于创建的对象user
    11. this.name=name;
    12. this.color=color;
    13. }
    14. var dog1=new Dog('teddy','green');
    15. var user=new User('嘎嘎',27,dog1);
    16. // console.log(user)//User {name: "嘎嘎", age: 27}
    17. //添加方法
    18. user.eat=function(){
    19. console.log('干饭啦')
    20. }
    21. //调用方法
    22. user.eat();
    23. console.log(user)

    数组中可以定义多个对象 ```java //构造方法

    1. //一个人养了一条狗
    2. function User(name,age,dog){
    3. //this相当于创建的对象user
    4. this.name=name;
    5. this.age=age;
    6. this.dog=dog;
    7. }
    8. function Dog(name,color){
    9. //this相当于创建的对象user
    10. this.name=name;
    11. this.color=color;
    12. }
  1. //定义多条狗
  2. var dogs=[
  3. {
  4. name:'teddy',
  5. color:'red'
  6. },
  7. {
  8. name:'teddy2',
  9. color:'red'
  10. }
  11. ]
  12. console.log(dogs)
  13. //定义多个人
  14. var users=[
  15. {
  16. name:'王嘉尔',
  17. age:27,
  18. hobbies:['唱歌','跳舞'],
  19. dog:{name:'teddy',color:'gray'},
  20. eat:function(food){
  21. console.log('多吃点'+food)
  22. }
  23. },
  24. {
  25. name:'白敬亭',
  26. age:27
  27. }
  28. ]
  29. // console.log(users[0])
  30. console.log(users[0].hobbies[1])//跳舞
  31. users[0].eat('肉');//多吃点肉
  32. //添加一个游泳的方法
  33. /* person.swmming=function(){
  34. console.log('我会游泳')
  35. } */
  36. //遍历hobbies
  37. for(var i=0;i<users[0].hobbies.length;i++){
  38. console.log(users[0].hobbies[i])
  39. }
  1. **方法中可以传入方法**
  2. ```java
  3. var f1=function(){
  4. console.log(111)
  5. }
  6. var f2=function(f){
  7. f();
  8. }
  9. f2(f1);//111

判断与循环—与java一样

注意:undefined——false;
0———————false;
null——————false;
false—————-false;
‘ ‘(空字符串)—-false
除此以外都是真——[](空数组)—true;{}(空对象)—true

if语句(略)

switch语句(略)

循环数组(略)

遍历对象属性

注意:
获取对象属性的方法:对象名.属性名;对象名[‘属性名’];对象名[key]

  1. //获取pig的值的方式
  2. var pig={name:'teddy',color:'red'}
  3. //第一种
  4. console.log(pig.name);//teddy
  5. //第二种
  6. console.log(pig['name']);//teddy
  7. console.log(pig.color);//red
  8. //遍历
  9. for(var key in pig){
  10. //拿到pig对象的属性
  11. console.log(key);//name,color
  12. //获取值--第三种
  13. console.log(pig[key])//name teddy color red
  14. }

遍历类数组

  1. // 类数组
  2. var obj={
  3. 0:123,
  4. 1:234,
  5. 2:456,
  6. length:3
  7. }
  8. console.log(obj[0])
  9. //遍历
  10. for(var i=0;i<obj.length;i++){
  11. console.log(obj[i])//123,234,456
  12. }

内置参数—arguments

arguments表示传入的参数(可变参数)—本质上是一个数组

  1. //内置参数
  2. function name(){
  3. //arguments-代表传入的参数(可变参数)--
  4. //本质是一个数组
  5. // console.log()
  6. var sum=0;
  7. for(var i=0;i<arguments.length;i++){
  8. // console.log(arguments[i])
  9. sum+=arguments[i];
  10. }
  11. return sum;
  12. }
  13. var i=name(1,2,3,4)
  14. console.log(i)//10

内置对象

数组对象

数组的常用方法

  1. //数组对象
  2. let arr = [1, 2, 34, 56];
  3. //数组中有没有6
  4. console.log(arr.includes(6)); //false
  5. //连接
  6. console.log(arr.concat([2, 3, 4])); //[1, 2, 34, 56, 2, 3, 4]
  7. //获取数字对应的下标
  8. console.log(arr.indexOf(2)); //1
  9. //用-连接,返回的是一个字符串,jion方法不传参数默认的是,
  10. console.log(arr.join("-")); //1-2-34-56
  11. //从尾部添加4,返回的是新数组的长度
  12. console.log(arr.push(4)); //5
  13. console.log(arr); //[1, 2, 34, 56,4]
  14. //pop方法是从尾部删除元素
  15. console.log(arr.pop(4)); //弹出4
  16. console.log(arr); //[1, 2, 34, 56]
  17. //shift方法是从首位删除元素
  18. console.log(arr.shift()); //删除1
  19. console.log(arr); //[2, 34, 56]
  20. console.log(arr.shift(5)); //删除2
  21. console.log(arr); //[34, 56]
  22. //unshift方法从首位开始添加元素
  23. console.log(arr.unshift(618)); //添加618
  24. console.log(arr); //[618,34, 56]

数组的排序

  1. //数组的排序
  2. function sort(array, fn) {
  3. for (var i = 0; i < array.length - 1; i++) {
  4. for (var j = 0; j < array.length - 1 - i; j++) {
  5. if (fn(array[j],array[j+1])>0) {
  6. var temp = array[j];
  7. array[j] = array[j + 1];
  8. array[j + 1] = temp;
  9. }
  10. }
  11. }
  12. }
  13. var array=[1,2,8,4,3,2];
  14. console.log(array);//[1, 2, 8, 4, 3, 2]
  15. /*console.log(array);//[1, 2, 8, 4, 3, 2]
  16. sort(array);
  17. console.log(array)//[1, 2, 2, 3, 4, 8]*/
  18. sort(array,function(num1,num2){
  19. //num1>num2,前面的比后面的大,就交换位置--正序
  20. // return num1-num2;//[1, 2, 2, 3, 4, 8]正序
  21. //num2>num1,后面的比前面的大,就交换位置--倒序
  22. return num2-num1;//[8, 4, 3, 2, 2, 1]
  23. })
  24. console.log(array)

filter()方法和map方法

  1. //filter()--过滤--将数组中元素>10的过滤出来
  2. var myArr = [1, 2, 4, 5, 12, 2, 14, 5];
  3. console.log(myArr.filter(function (a) {
  4. return a > 10;
  5. })) //12,14
  6. function filter(array, fn) {
  7. var temp=[];
  8. for (var i = 0; i < array.length; i++) {
  9. if(fn(array[i])) {
  10. temp.push(array[i])
  11. }
  12. }
  13. return temp;
  14. }
  15. var array = [1, 2, 8, 4, 3, 2];
  16. console.log(array); //[1, 2, 8, 4, 3, 2]
  17. var f = filter(array, function (num) {
  18. return num <= 5; //[1, 2, 4, 3, 2]
  19. })
  20. console.log(f)
  1. //map()方法--映射,将一个数组中的元素映射成一个新的元素
  2. function map(array, fn) {
  3. var temp=[];
  4. for (var i = 0; i < array.length; i++) {
  5. temp.push(fn(array[i]))
  6. }
  7. return temp;
  8. }
  9. var array = [1, 2, 8, 4, 3, 2];
  10. console.log(array); //[1, 2, 8, 4, 3, 2]
  11. var f = map(array, function (num) {
  12. return num +5; //[6, 7, 13, 9, 8, 7]
  13. })
  14. console.log(f)

字符串对象

数值对象

数学对象

日期对象

DOM编程—document—文档对象模型

元素节点

image.png
image.png
image.png
image.png
image.png
image.png

属性节点

image.png
image.png

BOM编程—browser—浏览器对象模型

常用方法

回调函数—之前的filter和map里面使用了

setTimeout—延时定时器&&setInterval—周期性定时器

  1. //一次性定时器--延时
  2. setTimeout(function(){
  3. //延时一秒钟产生一个20-30之间的随机数
  4. console.log(Math.random()*10+20)
  5. },2000)
  6. //周期性定时器
  7. setInterval(function(){
  8. console.log(Math.random()*10+20)
  9. },1000)
  10. console.log('before');
  11. setTimeout(function(){
  12. //延时一秒钟产生一个20-30之间的随机数
  13. console.log('middle');
  14. },2000)
  15. console.log('after');
  16. 结果:before-->after-->middlejs是单线程,控制台会依次输出,
  17. 当执行到定时器,先执行后面的after,当时间到了就输出middle
  18. var num=10;
  19. setTimeout(function(){
  20. //延时一秒钟产生一个20-30之间的随机数
  21. console.log(num);
  22. },2000)
  23. num=15;
  24. 结果:15

浏览器自带小型数据库—常用

image.png

history

image.png

事件

定义事件的三种方式—第一种最常用—单击事件—click

  1. //事件方式(1)--常用
  2. //拿到div--添加点击事件
  3. var btn=document.querySelector('.item');
  4. btn.addEventListener('click',function(){
  5. //弹窗
  6. // alert(1);
  7. //重置
  8. btn.setAttribute('class','newitem')
  9. })
  10. //第二种方式
  11. btn.onclick=function(){
  12. alert(1);
  13. }
  14. //第三种方式--在div中添加onclick=""
  15. function fn(num){
  16. alert(num);
  17. }

双击事件—dblclick

消除事件

image.png

事件分类

鼠标事件

image.png

键盘事件

image.png

表单事件

image.png

(文档、浏览器)对象事件

image.png

小案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>标签的主题</title>
  7. <style>
  8. *{
  9. margin: 0;
  10. padding: 0;
  11. }
  12. .nav{
  13. list-style-type: none;
  14. width: 1005px;
  15. height: 50px;
  16. text-align: center;
  17. border-bottom: 1px solid black;
  18. margin: auto auto;
  19. }
  20. .item{
  21. width: 200px;
  22. height: 50px;
  23. list-style: none;
  24. float: left;
  25. background-color: green;
  26. line-height: 50px;
  27. border-right: 1px solid black;
  28. }
  29. .item:hover{
  30. cursor: pointer;
  31. background-color: mediumturquoise;
  32. }
  33. .active{
  34. background-color: pink !important;
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <ul class="nav">
  40. <li class="item" data-index="1">服装</li>
  41. <li class="item" data-index="2">鞋子</li>
  42. <li class="item" data-index="3">电子产品</li>
  43. <li class="item" data-index="4">裤子</li>
  44. <li class="item" data-index="5">视频</li>
  45. </ul>
  46. </body>
  47. <script src="./js/event.js"></script>
  48. </html>
  1. //添加事件--index2中的li
  2. var lis=document.querySelectorAll('.item');
  3. for(let i=0;i<lis.length;i++){
  4. lis[i].addEventListener('click',function(){
  5. for(let i=0;i<lis.length;i++){
  6. lis[i].className="item";
  7. }
  8. this.className='item active';
  9. })
  10. }
  11. //给ul添加事件
  12. var ul=document.querySelector('.nav');
  13. ul.addEventListener('click',function(event){
  14. event.target.className='item active'
  15. })

事件冒泡与事件捕获—-先捕获再冒泡

this关键字

this的使用

注意:任何的方法里面的this都指向调用的这个方法的实例对象

  1. //this
  2. /* let dog={
  3. name:'teddy',
  4. say:function(){
  5. //this指的是dog对象
  6. console.log('my name is:'+this.name);//my name is:teddy
  7. }
  8. }
  9. dog.say(); */
  10. /* function fn(){
  11. setTimeout(function(){
  12. //this指的是window
  13. //注意:在window中不要使用name,因为window自带有name属性,是空串
  14. console.log(this.name);
  15. },1000)
  16. }
  17. fn(); */
  18. let dog={
  19. name:'teddy',
  20. //say是dog调用的
  21. say:function(){
  22. /* setTimeout(function(){
  23. //funcion是window调用的,this指的是window
  24. console.log('my name is:'+this.name);//my name is:
  25. },1000) */
  26. //使this.name=teddy,在function里面定义
  27. //that指的是dog
  28. var that=this;
  29. setTimeout(function(){
  30. console.log('my name is:'+that.name);//my name is:teddy
  31. },1000)
  32. }
  33. }
  34. dog.say();

改变this指向call,apply,bind

  1. /* let dog={
  2. name:'teddy',
  3. //say是dog调用的
  4. say:function(){
  5. //让this指向别的--call中的对象,打印结果是call对象中的属性值
  6. var that=this;
  7. setTimeout(function(){
  8. console.log('my name is:'+that.name);//my name is:erha
  9. },1000)
  10. }
  11. }
  12. // dog.say.call({name:'erha'});
  13. // dog.say.apply({name:'erha'});//打印结果--my name is:erha
  14. //bind有返回值
  15. var fn=dog.say.bind({name:'erha'});//打印结果--my name is:erha
  16. fn(); */
  17. let dog={
  18. name:'teddy',
  19. //say是dog调用的
  20. say:function(a,b){
  21. //让this指向别的--call中的对象,打印结果是call对象中的属性值
  22. var that=this;
  23. console.log(a,b);
  24. setTimeout(function(){
  25. console.log('my name is:'+that.name);//my name is:erha
  26. },1000)
  27. }
  28. }
  29. dog.say.call({name:'erha'},12,23);//12 23 my name is:erha
  30. //apply要传数组
  31. dog.say.apply({name:'erha'},[45,67]);//45 67 my name is:erha
  32. var fn=dog.say.bind({name:'erha'},89,34);//89 34 my name is:erha
  33. fn();

作用域

  1. //函数作用域
  2. /* function fn(){
  3. var num=3;
  4. }
  5. //外面的作用域不能访问里面的作用域
  6. console.log(num);//Uncaught ReferenceError: num is not defined */
  7. /* //块作用域
  8. //用var定义变量不会形成块作用域
  9. {
  10. var num=3;
  11. }
  12. {
  13. var num=4;
  14. }
  15. console.log(num);//4 */
  16. /* //用let定义变量会形成块作用域
  17. {
  18. let num=3;
  19. }
  20. {
  21. let num=4;
  22. }
  23. console.log(num);//Uncaught ReferenceError: num is not defined */
  24. /* for(var i=0;i<10;i++){
  25. }
  26. // console.log(i);//10
  27. for(;i<20;i++){
  28. console.log(i);//10 11 ... 19
  29. } */
  30. /* //let不能重复定义;let定义的变量能形成独立的作用域
  31. for(let i=0;i<10;i++){
  32. }
  33. // console.log(i);//event.js:180 Uncaught ReferenceError: i is not defined */
  34. var num1=10;
  35. function f1(){
  36. var num2=11;
  37. function f2(){
  38. var num2=12;
  39. console.log('f2-->'+num2);//12
  40. }
  41. f2();
  42. console.log('f1-->'+num2);//11
  43. }
  44. f1();
  45. // console.log('out'+num2);//event.js:195 Uncaught ReferenceError: num2 is not defined
  46. console.log('out'+num1);//10

变量和函数声明提升

  1. /* console.log(a);//undefined--a声明了没有被定义
  2. var a=10; */
  3. // console.log(a);//event.js:199 Uncaught ReferenceError: a is not defined
  4. //变量的声明提升--在执行过程中,会先声明var a;var b;
  5. /* console.log(b);//undefined--
  6. var a=10;
  7. var b=12; */
  8. //函数提升,变量提升
  9. //执行顺序:声明var a;声明函数ƒ a(){console.log(a);}-->调用a()-->console.log(a);-->a=10;
  10. a();
  11. console.log(a);////ƒ a(){console.log(a);}
  12. var a=10;
  13. function a(){
  14. console.log(a);//ƒ a(){console.log(a);}
  15. }

闭包以及实现累机器和缓存

闭包使用

image.png

  1. //闭包累加器
  2. /* function count(){
  3. var num=0;
  4. return function(){
  5. return num++;
  6. }
  7. }
  8. var adder=count();
  9. console.log(adder());//0
  10. console.log(adder());//1
  11. console.log(adder());//2
  12. //释放内存空间,用完了就释放
  13. adder=null; */

原型

  1. //原型
  2. function User(name,age){
  3. this.name=name;
  4. this.age=age;
  5. }
  6. console.log(User.prototype);
  7. User.prototype.eat=function(){
  8. console.log(this.name+'在吃饭');
  9. }
  10. User.prototype.gander='男';
  11. console.log(User.prototype);
  12. let user1=new User("嘎嘎",27);
  13. console.log(user1);
  14. let user2=new User("嘉尔",27);
  15. console.log(user2);

原型检测—instanceof

image.png

  1. //原型检测
  2. //判断user1是否是User
  3. console.log(user1 instanceof User);//true

类型检测—typeof

  1. //类型检测
  2. console.log(typeof('abc'));//string
  3. console.log(typeof(123));//number
  4. console.log(typeof(user1));//object
  5. console.log(typeof({}));//object
  6. console.log(typeof(true));//boolean
  7. let a=123;
  8. console.log(typeof(a)=='string');//false
  9. console.log(typeof([]));//object
  10. console.log(typeof(null));//object
  11. console.log(typeof(undefined));//undefined
  12. let b=[];
  13. console.log(b instanceof Array);//true

正则表达式

image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png