js笔记

js简介

Js是一种基于事件和对象驱动的解释性、松散性的语言。

一切皆对象

javascript 布兰登艾奇 创建

ECMAscript
  • BOM
  • DOM
js的作用
  • 写网页的动态效果
  • 写网页的游戏
  • 使用cookie、session
  • 实现交互
  • 发送表单form
  • 发送ajax

变量、常量

变量是计算机内存里的一块地址单元

  • 变量的命名要有意义

  • 命名不能以数字开头,可以用数字、字母、下划线、$构成。

  • 命名不能以关键字或者是保留字构成

  • 命名以首字母大写或者是以驼峰命名法来命名

  • 严格区分大小写

    var NUM=200;
    var num=200;
    

    (以上两个变量是不同的)

基础数据类型

number 数值类型
  • 二进制;

  • 八进制;

  • 十六进制 -0xff ;

  • string

  • \n换行

  • \r回车

  • \t制表符

  • \f换页

  • \v垂直制表符

  • 模版字符串template

  • NaN not a number 属于数值类型

    var num1=5,
    num2=40;
    console.log(`我们班一共是${num1+num2}为学生,其中女生${num1}位,男生${num2}位`);
    
boolean
  • true
  • false
    • ""
    • 0
    • null
    • undefined
    • false
    • NaN
null(本身是一个空对象)
  • null占位符空
    • typeof(null)=object;
undefined
  • undefined 未定义
symbol
  • symbol 不重复的值

引用数据类型

function函数
object对象
array数组

数组就是一系列有直接或者是间接联系的数据的集合

console.log(arr.length);

console.log(arr['length']);

console.log(arr[arr.length-1]);

  • 遍历

    for(var i=0;i<arr.length;i++){
      console.log(arr[i]);
     }
    
  • 在数组中选最大值/最小值

    • 打擂台法

      var arr=[1,23,23,5,5,34,26];
      var max=arr[0];
      for(var i=1;i<arr.length;i++){
          if(arr[i]>max){
               max=arr[i];
             }
      }
      console.log(max);
      

    表达式(一切有值的)

    • typeof(); 只能用来检测基础数据类型
  • instanceof 判断是否是数组对象Array的实例

    • 用法:

      var arr=[];
      var result=arr instanceof Array;
      console.log(result);
      

  • 引用数据类型传址

    function fun(){
        
    }
    var aa=fun;    fun是函数的引用地址,现在把fun的地址传给                了aa
    

运算符

算数运算符

  • ➕号

    任何数据类型和string连接的结果类型都为string

  • ➗号

  • %取余

    整数取余数

  • ++nub、nub++、- -nub、nub- -

  • +=、- =、*=、/=、%=

逻辑运算符

  • &&与


    console.log(1&&2); 值:2

    console.log(1&&0); 值:0

    console.log(0&&1); 值:0

    console.log(0&&0); 值:0

    console.log(200&&1);值:1


    var num=2;

    console.log(1&&num++); 值:2

    console.log(num); 值:3

    var num=2;

    console.log(1&&++num); 值:3

    console.log(num); 值:3

    var num=2;

    console.log(0&&num++); 值:0

    console.log(num); 值:2

    var num=2;

    console.log(0&&++num); 值:0

    console.log(num); 值:2

    var num=2;

    console.log(num++&&1); 值:1

    console.log(num); 值:3

    var num=2;

    console.log(++num&&1); 值:1

    console.log(num); 值:3

    var num=2;

    console.log(num++&&0); 值:0

    console.log(num); 值:3

    var num=2;

    console.log(++num&&0); 值:0

    console.log(num); 值:3

  • //或

    console.log(1||2); 值:1

    console.log(1||0); 值:1

    console.log(0||1); 值:1

    console.log(0||0); 值:0

    console.log(200||1);值:200


    var num=2;

    console.log(1||num++); 值:1

    console.log(num); 值:3

    var num=2;

    console.log(1||++num); 值:1

    console.log(num); 值:3

    var num=2;

    console.log(0||num++); 值:2

    console.log(num); 值:3

    var num=2;

    console.log(0||++num); 值:3

    console.log(num); 值:3

    var num=2;

    console.log(num++||1); 值:2

    console.log(num); 值:3

    var num=2;

    console.log(++num||1); 值:3

    console.log(num); 值:3

    var num=2;

    console.log(num++||0); 值:2

    console.log(num); 值:3

    var num=2;

    console.log(++num||0); 值:3

    console.log(num); 值:3

  • !非

比较运算符

(ASCII码------美国标准信息交换码;

EASCII码————欧洲扩展的;

GB2312码—————中国制定的;

GBK码

unicode码——国际规定的----UTF-8)

  • 0————48

  • A——————65

  • a—————————97

  • <、>、<=、>=、==、===、!=、!==

    例:console.log("a">"b"); 值:false;

  • 一元运算符

    • new用来创建对象
    • delete 删除对象的属性
    • typeof 检测对象属性
  • 三元运算符(写法格式固定)

    var nub=3>4?200:100;
    console.log(nub); 值为100;
    如果3大于4,则值为200;
    如果3小于4,则值为100;
    
  • 特殊运算符

  • 扩展运算符

    • ...

7.流程控制

  • 顺序结构

    • 默认是顺序结构
  • 条件结构

    • if条件语句
    var grade=90;
    if(grade>80){
         console.log('良好')
       }
    
    var result=prompt('请输入您的成绩',123);
    if(result>80&&result<90){
        document.write('良好');
    }else{
        document.write('一般');
    }
    
    var result=prompt();
    if(){
         else if(){
         
       }
       }else(){
         
       }
    

    • switch判断语句

      var num1=prompt("请输入第一个数字");
          num2=prompt("请输入第二个数字");
          fu=prompt("请输入运算符");
      switch(fu){
            case"+":
          console.log(Number(num1)+Number(num2));
          break;
          case"-":
          console.log(num1-num2);
          break;
          case"*":
          console.log(num1*num2);
          break;
          case"/":
          console.log(num1/num2);
          break;
        default:
          console.log("输入有误");
          break;
      }
      

  • 循环结构

    • for循环

    • while循环

      var 
      

    • do while循环

团队

1.确定自己的需求是否和团队一致

2.提高自己的能力

3.德行

4.信任

函数function

将实现某一特定功能的代码块,封装起来以便重复使用

函数定义方式

  • 以字面量的方式去定义函数

    var fun=function(){
        
    }
    
  • 以关键字function的方式定义函数

    function fun(){
        
    }
    

函数调用

var fun=function(){
    代码块;
}
fun();
  • 匿名函数的运行

    (function(){
        alert(1);
    })()
    

函数参数

var fun=function(形式参数,形式参数){
    代码块;
}
fun(实际参数,实际参数);
//形式参数的作用就是为了接收实际参数;
//形式参数和实际参数的个数可以不同
//形式参数和时机蚕食对应一一赋值
//没有传值的形式参数默认是undefined
//所有的时机参数会被arguments集合接收

例子:

    function fun(arr){
        for(var i=0;i<arr.length;i++){
            for(var j=i+1;j<arr.length;j++){
                if(arr[i]<arr[j]){
                    var tem=arr[i];
                    arr[i]=arr[j];
                    arr[j]=tem;
                }
            }
        }
        console.log(arr);
    }
    fun([1,445,23,44,56]);

函数的返回值

​ return;

函数的作用域

js运行依赖于浏览器,浏览器是js的宿主环境

执行环境

全局环境

定义在全局环境中的变量、函数,称为全局变量

局部环境

定义在局部环境中的变量、函数,称为局部变量

作用域

变量在某个范围内有意义

var nub=200;
function aa(){
    nub=300;
  function bb(){
      nub=400;
    consoloe.log(nub);
  }
  bb();
  console.log(nub);
}
aa();
console.log(nub);

结果为:400
400
400;

  • 块级作用域

  • 作用域链

    当函数在运行的时候会自动的创建一个集合来保存可见范围内所有的变量、对象

回调函数

当一个函数作为另外一个函数的参数的时候,这个函数就是回调函数

function fun(m,n,nub){
  nub(m,n);
}
fun(1,2,function(a,b){
  
});

递归函数

函数自己调用自己

例子1:求5的阶乘 5*4!

function jiecheng(n){
    if(n==0){
         return 1;
       }
  return n*jiecheng(n-1);
}
console.log(jiecheng(5));

例子2: 1 2 3 5 8 13 21 44 …….n,求n等于多少

​ 斐波那契数列

​ n=(n-1)+(n-2)

function fun(n){
    if(n==1){
         return 1;
       }
    if(n==2){
         return 2;
       }
    return fun(n-1)+fun(n-2);
}
console.log(fun(7));

例子3:把数组里面的元素拷贝到一个新的数组


闭包

当一个函数嵌套另外一个函数,在内部函数中使用了外部的局部变量,在外部去访问内部函数的时候,就形成了闭包

闭包的作用:保存局部变量

function aa(){
    var nub=200;
  function bb(){
      console.log(nub);
  }
  return bb();
}
var fun=aa();
console.log(fun);

预解析

在程序真正开始运行之前,js会将以var声明的变量和以function关键字声明的函数,提前加载到相对应的环境里面

fun();
var fun=function(){
    console.log(1);
}
结果是报错,因为var声明的变量会提前解析但为赋值

fun();
function fun(){
    console.log(1);
}   
结果为1;

垃圾处理机制

1.当一个函数运行结束以后,局部变量会被删除

2.当一个对象不再被引用的时候,这个对象将在某一个时刻被删除

函数重载

内置顶层函数

1.Number

2.String

3.Boolean

4.parseInt( ); 将字符串转化为整数(必须是数字开头的)

5.parseFloat( ); 将字符串转化为小数(必须是数字开头的)

6.isNaN(); 是 不是一个数字

console.log(Number(true));    值为1

null==undefined 为真

null==false 为假

对象

面向对象

面向对象的编程方式

研究的一切事物都是对象

class 类是对象的抽象

​ 对象是类的实例化;

键值对

以json格式去创建对象

var obj={
    name:
}
  • 属性的访问方式

    • obj.name
    • obj['name']
  • 属性的定义方式

以构造函数的方式去创建对象

提供对象的初始化

function person(name,age){
    this.name=name;
    this.age=age;
}
var xiaoming=new person('xiaoming',18);
var xiaohua=new person('xiaohua',20);
console.log(xiaoming,xiaohua);

结果
person {name: "xiaoming", age: 18}
person {name: "xiaoming", age: 18}

通过object的方式创建对象

任何一个对象都可以看作是object方式创建而来的

var obj=new Object();

instanceof 用来检测某一个对象是否是某一个构造函数的实例化

对象的继承

prototype

每一个函数都有prototype属性

prototype的值为对象

function Person(name,age){
    this.name=name;
    this.age=age;
}
Person.prototype.fun=function(){
    console.log(1);
};
console.log(Person.prototype.fun());

new

new 发生了三件事

创建一个空对象 obj

obj_proto_==Person.prototype

Person.call(obj);

继承链

继承链(原型继承链)

var obj=new Person();
obj.__proto__=Person.prtotype
Person.prototype._proto_=Object.prototype
Objcet.prototype.__proto__==null;

this指针

谁调用这个函数,this指向谁

call方法

每个call里面的第一个参数就决定了this指针指向谁

fun.apply(obj,'lisi',18);      //第一个参数:实例化对象;第二、三个参数:传值

apply方法

每个call里面的第一个参数就决定了this指针指向谁,第二个参数以后的传值方式与call方法不同

fun.apply(obj,['lisi',18]);     //第一个参数:实例化对象;第二、三个参数:传值(传值时需要加方括号)

obj=null

删除一个对象

obj=null;

delete

用来删除某一个对象的属性

delete obj.name;

宿主对象(浏览器对象)

window对象

内置对象

  • Object
  • Function
  • Array
  • String
  • RegExp 正则表达式
  • Date 时间
  • Math 数学

数组对象

arr.push();

push()——在数组的尾部添加一个或多个元素,并返回数组新的长度,修改原始数组

arr.pop();

pop()——在数组的尾部删除一个元素,并返回弹出的元素值,修改原始数组

  • let stack = [];
    stack.push(1,2);    // stack:[1,2],返回2
    stack.push([1,2]);  // stack:[1,2, [1,2]],返回3
    stack.pop();        // stack:[1,2],返回[1,2]
    
arr.unshift();

unshift()——在数组的头部添加,返回新的数组长度,修改原始数组

arr.shift();

shift()——在数组的头部删除,返回删除的数组元素,修改原始数组

  • let a = [1];
    a.unshift(2);           // a:[2, 1],返回2
    a.unshift(3, [4,5]);    // a:[3, [4,5], 2,1],返回4 
    a.shift();              // a:[[4,5], 2, 1],返回3    
    
arr.slice();

slice()——对数组进行分离,并返回一个子数组。不修改原始数组

  • 第1个参数表示起始索引

  • 第2个参数表示结束索引(返回数组不包含结束索引对应的元素值)

    如果没有第2个参数,则表示取值到最后一个索引。正值表示正向索引,负值表示反向索引

    let a = [1,2,3,4,5];
    a.slice(0, 3);          // 返回[1,2,3]
    a.slice(3);             // 返回[4,5]
    a.slice(-3, -1);        // 返回[3,4],反向索引,从倒数第3个到倒数第1个元素
    
arr.splice();

splice()——从数组中删除和插入一些元素。修改原始数组

  • 前2个参数指定了要删除的数组元素
    • 第1个参数表示需要删除元素的起始索引值
    • 第2个参数表示需要删除的个数
      如果省略则表示删除起始索引后的所有元素
  • 后面的参数指定需要插入的元素
  • 返回值是删除的元素组成的数组
let a = [1,2,3,4,5,6,7,8];
a.splice(4);                // 返回[5,6,7,8],a是[1,2,3,4]
a.splice(1,2);              // 返回[2,3],a是[1,4]
a.splice(1,1);              // 返回[4],a是[1]

let b = [1,2,3,4,5];
a.splice(2,0, "a", "b");    // 返回[],a是[1,2, "a","b", 3,4,5]
a.splice(2,2, [1,2], 3);    // 返回["a", "b"],a是[1,2, [1,2],3, 3,4,5]
arr.concat();

concat()——创建并返回一个新数组。不修改原始数组

let a = [1,2,3];
a.concat(4, 5);         // 返回[1,2,3,4,5]
a.concat([4,5]);        // 返回[1,2,3,4,5]
a.concat([4,5],[6,7]);  // 返回[1,2,3,4,5,6,7]
a.concat(4, [5, [6,7]]);// 返回[1,2,3,4,5,[6,7]]
a.join();               // "1,2,3",原始值不发生改变
arr.join();

join()——将数组中的所有元素转化为字符串并连接在一起,返回最后生成的字符串。不修改原始数组

let a = [1, 2, 3];
a.join();               // => "1,2,3",默认使用","隔开元素
a.join("&");            // => "1&2&3",指定分隔符
arr.reverse();

reverse()——将数组中的元素逆序,返回逆序后的数组。修改原始数组

let a = [1, 2, 3];
a.reverse().join();     // => "3,2,1",此时的a是[3, 2, 1]    
arr.some();

some()——方法为数组的每个元素调用指定的函数,并返回true或false。当有一个调用返回true时,some()就会返回true;只有当所有调用都是false时,some()才返回false

let a = [1,2,3,4,5];
a.every(function(x) { return x < 10; });    // => true,所有的值<10
a.every(function(x) { return x % 2 === 0}); // => false,不是所有的值都是偶数
a.some(function(x) { return x % 2 === 0; }) // => true,a含有偶数值
arr.every();

every()——方法为数组的每个元素调用指定的函数,并返回true或false。当有一个调用返回false时,every()就会返回false;只有当所有调用都是true时,every()才返回true

arr.find();
arr.findIndex();
arr.map();

map()——方法为数组的每个元素调用指定的函数,并返回一个新数组,返回什么值,形成什么样的集合;

  • 注意:map()返回的是新数组,它不修改原始数组

    var arr=['衣服','鞋子','裤子'];
    var brr=arr.map(function(value,index){
        return value+'new'
    })
    console.log(brr);
    

    a = [1,2,3];
    b = a.map(function(x) {return x*x; });  // b是[1,4,9]
    
arr.filter();

filter()——方法为数组的每个元素调用指定的函数,并返回筛选出的新数组,对原数组没有影响

a = [5,4,3,2,1];
smallvalues = a.filter(function(x) { return x < 3; });  
// smallvalues是[2, 1]
arr.Foreach();

forEach()——方法从头至尾遍历数组,为每个元素调用指定的函数

  • forEach()没有像for循环中使用的相应的break语句,如果要提前终止,可以做放到try/catch中处理

    Array.prototype.forEach=function(callback){
        for(var i=0;i<this.length;i++){
            callback(this[i],i);
      }
    };
    var arr=[1,2,3,4];
    arr.forEach(function(value,index){
        console.log(value,index);
    });
    
      var arr=[1,2,3];
      arr.forEach(function(value,index){
          console.log(value,index);
      })
    

    let data = [1,2,3,4,5];
    let sum  = 0;
    data.forEach(function(value,index) { sum += value;} );
    sum;         // => 15
    
arr.sort();
  • sort(SortFunction) —— 按照指定的 SortFunction 将数组的元素排序
arr.includes();
arr.toString();

toString()——返回一个字符串

[1,2,3].toString();         // "1,2,3"
[1, [2, "c"]].toString();   // "1,2,c"

arr.reduce();

reduce()——对数组的元素对调用指定的函数,并返回最终生成的单个值

  • 第1个参数指定调用的函数
  • 第2个参数为可选参数,指定传递给函数的初始值,当不指定值时,使用数组的第1个元素作为初始值
let a   = [1,2,3,4,5];
let sum = a.reduce(function(x,y) { return x+y; }, 0);       //15
let max = a.reduce(function(x,y) { return (x>y)?x:y; });    // 5
arr.indexOf();

indexOf()——搜索整个数组中给定值的元素,返回找到的第1个元素的索引,如果找不到,则返回-1

  • 第1个参数为需要搜索的值

  • 第2个参数是可选的,指定开始搜索的索引位置

    let a = [0,1,2,1,0];
    a.indexOf(1);           // =>1: a[1] = 1
    a.lastIndexOf(1);       // =>3: a[3] = 1
    a.indexOf(3);           // =>-1: a中没有值为3的元素
    

字符串对象

charAt();
  • charAt(n) —— 返回该字符串第 n 位的单个字符。(从 0 开始计数)
charCodeAt();
  • charCodeAt(n) —— 返回该字符串第 n 位的单个字符的 ASCII 码
fromCharCode();
indexOf();
  • indexOf() —— 返回查找到的位置
    用法:string_1.indexOf(string_2,n); 从字符串 string_1 的第 n 位开始搜索,查找 string_2,返回查找到的位置,未找到,返回 -1 ( n 可以不填,默认从第 0 位开始查找)
lastIndexOf();
  • lastIndexOf() —— 跟 indexOf() 相似(不过是从后边开始找)
split();
  • split —— 将字符串按照指定的分隔符分离开,返回一个数组

slice();
substr();
  • substr(n,x) —— 返回原字符串从 n 位置开始,长度为 x 的子串

substring();
  • substring(n,m) —— 返回原字符串从 n 位置到 m 位置的子串,不支持负数

concat();
endsWith();
includes();
replace();
startsWith();
toUpperCase();
  • toUpperCase() —— 返回把原字符串所有小写字母都变成大写的字符串

toLowerCase();
  • toLowerCase() —— 返回把原字符串所有大写字母都变成小写的字符串

trim();
trimLeft();
trimRight();

数学对象

Math.abs();

返回 x 的绝对值

Math.ceil();

返回大于等于 x 的最小整数

Math.cos();

返回 x 的余弦

Math.sin();

返回 x 的正弦

Math.tan();

返回 x 的正切

Math.floor();

返回小于等于 x 的最大整数

Math.max();
  • max(a, b) —— 返回 a, b 中较大的数

Math.min();
  • min(a, b) —— 返回 a, b 中较小的数

Math.PI();
Math.pow();
  • pow(n, m) —— 返回 n 的 m 次幂 (nm)

Math.random();
  • random() —— 返回大于 0 小于 1 的一个随机数

Math.round();
  • round(x) —— 返回 x 四舍五入后的值

Math.sqrt();
  • sqrt(x) —— 返回 x 的平方根

Math.trunc();

干什么的,怎么用(参数),返回值是什么,对原对象有无影响

console.dir();     //可以查看这个对象的结构;
console.log();     //可以查看这个对象的输出值;

获取屏幕宽度、高度

var width=document.documentElement.clientWidth;
var height=document.documentElement.clientHeight;

递归拷贝

拷贝数组

浅拷贝
var arr=[1,2,33,[1,6,8]];       //只拷贝[1,2,33,[]]   到二维以上的数组里面的内容都无法拷贝到
深拷贝
function copy(arr,brr){
    for(var i=0;i<arr.length;i++){
        if(arr[i] instanceof Array){
            brr[i]=[];
           copy(arr[i],brr[i]);
        }
        else{
            brr.push(arr[i]);
        }
    }
}
var brr=[];
copy([1,2,['a','b']],brr);
console.log(brr);           //结果为[1,2,['a','b']]

拷贝对象

对象的遍历

Bom

浏览器对象模型

window 顶层对象

location 地址栏

history 历史记录

document 文档

window

confirm

弹出一个是否确定的弹框

window.screen

获取屏幕的宽高

window.screen.width 获取屏幕的宽

window.screen.height 获取屏幕的高

window方法

时间函数

setInterval
setInterval(function(){     //回调函数
    console.log(1);
},1000);        //1000的单位为毫秒    1秒==1000毫秒
clearInterval
setTimeout();
clearTimeout();

location地址栏

Tcp/Ip协议:顶层协议

http://应用层协议

http:// www.baidu.com :80 /aa/bb/index.html ?查询字符串

协议 主机地址 端口号port 页面路径 查询字符串 锚地址

protocol hostname host主机+端口 pathname search hash

网络传输协议

超文本传输协议

location属性

location方法

reload();

重载

reload(true);加载所有缓存

reload(false);不加载缓存

assign();

加载到页面 会留下历史记录

assign();

assign(false);

replace();

替换到页面 不会留下历史记录

history历史记录

history属性

history方法

history.forword

转向下一个页面

与浏览器的点击向前按钮功能一样

history.back

转向上一个页面

与浏览器的点击后退按钮功能一样

history.go(0);

当前页面刷新

Dom

文档对象模型

Document

Document方法

Document.title

Document.documentElement.clientWidth

Document.documentElement.clientHeight

元素的获取方法(旧)

Document.getElementsByTagName();

收到的是一个集合

Document.getElementsByClassName();

收到的是一个集合

在IE浏览器里面不支持ByClassName获取类名的方式

Document.getElementById();

收到的是一个元素

只能用document调用

Document.getElementsByName();

收到的是一个集合

只能用document调用

元素的获取方法(新)

document.querySelector();

默认是选取元素的第一个

document.querySelectorAll();

可以选取到这个元素所有的

事件(初试)

鼠标

click;

dbclick;

mousemove

mousedown

mouseup

mouseover

mouseout

mouseenter

mouseleave

键盘

keydown

keypress 键盘按住

keyup

表单元素

blur 失去焦点

focus 获取焦点

submit 提交

reset 重置

change 改变

dom操作

对元素内容

innerHTML可以获取到标签对

innerText只获取文本

对元素样式css

操作属性

getAttribute('')

标准属性:obj.属性

非标准属性:obj.getAttribute('');可以获取到标签的任何属性

<div><>     //
setAttribute('');

获取css样式属性

getComputedStyle(非行内样式)
getComputedStyle(div,null).height   //对IE浏览器不兼容
getCurrentStyle(非行内样式)
getCurrentStyle.height  //兼容IE浏览器

操作样式(行内样式)

设置单个样式(行内样式)

obj.style.标准属性='height:200px';

设置多个样式(行内样式)

obj.style.cssText=‘height:200px;width:200px’;

对元素html属性

this.classList.add(); 增加类名

this.classList.toggle(); 如果有就增加,如果没有就删除

this.classList.remove(); 移除类名
}

获取元素

获取元素在页面中所占宽、高

offsetWidth

不包括margin

如果这个元素是display:none;那么不会被获取到

offsetHeight

不包括margin

获取元素在页面中实际的位置

offsetLeft

在display:fixed时,距离当前窗口的位置

如果没有fixed时,是遵照body定位

计算的是距离有定位属性的上级元素的距离,如果没有定位属性的父元素,计算的是距离body的值

offsetTop

在display:fixed时,距离当前窗口的位置

如果没有fixed时,是遵照body定位

计算的是距离有定位属性的上级元素的距离,如果没有定位属性的父元素,计算的是距离body的值

获取浏览器滚动条

document.body.scrollTop 谷歌

document.documentElement.scrollTop 火狐

值为数字

调错

先看控制台

如果有错是语法错误

对象的某个属性用的不正确

element

想要添加的类名、style是否添加上,如果没有添加上,就找个添加的这条语句

每行调错

从第一行代码,输入每个表达式的值

节点

html文档中,所有的构成部分都是节点,没有个节点和节点之间的关系构成了整个html文档树模型

nodeName

nodeType

nodeValue

document节点

nodeName #document

nodeType 9

nodeValue null

文本节点

nodeName #text

nodeType 3

nodeValue 文本的内容

元素节点

nodeName 大写的标签名

nodeType 1

nodeValue null

注释节点

nodeName #comment

nodeType 8

nodeValue 注释的内容

属性节点

nodeName 属性名 id="one"中的id

nodeType 2

nodeValue 属性值 id="one"中的one

节点关系

同辈关系

div.previousSibling;    //上一个兄弟节点
div.previousElementSibling;     //上一个元素节点
div.nextSibling;    //下一个兄弟节点
div.nextElementSibling;     //下一个元素节点

父辈关系

div.childNodes;     //所有的节点
div.children;       //所有的元素节点
div.parantNode;     //父辈节点

节点的操作

节点的创建

document.createElement('div');

节点的增加

body.appendchild();     //插入到元素之后
insertBefore(newobj,oldobj);    //插入到元素之前

节点的删除

par.removeChild();

节点的复制

clone=div.cloneNode(true);  //克隆的元素存在内存中,需要在单独对克隆的节点添加到其他节点上,才能在页面中显示

事件

事件源

事件发生在谁的身上,谁就是事件源

事件对象

事件发生的时候,在自动创建的一个对象,用来保存事件发生时候的所有信息

    div.onclick=function(e,way='1'){
        console.log(e,way);
    }   //  e是默认的事件传参;

​ altKey; 验证alt是否被按下;

​ cancelBubble;

​ clientX; 鼠标事件的距离浏览器窗口的X距离

​ clientY; 鼠标事件的距离浏览器窗口的Y距离

​ ctrlKey; 验证ctrl是否被按下;

​ detail;

​ offsetX; 鼠标事件的距离当前事件源的X距离

​ offsetY; 鼠标事件的距离当前事件源的Y距离

​ pageX; 鼠标事件的距离body的X轴距离

​ pageY; 鼠标事件的距离body的Y轴距离

​ screenX; 鼠标事件的距离屏幕的X距离

​ screenY; 鼠标事件的距离屏幕的Y距离

​ srcElement;

​ shiftKey; 验证shift是否被按下;

​ target;

​ type; 事件类型;

​ which;

​ ASCII码值:左37;上38;右39;下40;空格32;回车13;

事件类型

用户的行为

mousewheel

用事件监听的方式添加

transitionend

用事件监听的方式添加


animationend

用事件监听的方式添加

wheelDeltaX

wheelDeltaY

事件处理程序

事件发生之后的响应

事件的添加

obj.addEventListener

    function fun1(){
        alert(1);
    }
    function fun2(){
        alert(2);
    }
    obj.addEventListener('click',fun1,false);
    obj.addEventListener('click',fun2,false);
}
//可以给一个对象添加多个事件;

obj.attachEvent (IE)

obj.attachEvent('onclick',fun1);

事件的删除

obj.removeEventListener

    obj.removeEventListener('click',function(){
        alert(1);
    },false);
    obj.removeEventListener('click',function(){
        alert(2);
    },false);
}
//

obj.detachEvent (IE)

obj.detachEvent('onclick',fun1);

事件的删除

obj.removeEventListener

    obj.removeEventListener('click',function(){
        alert(1);
    },false);
    obj.removeEventListener('click',function(){
        alert(2);
    },false);
}
//

obj.detachEvent (IE)

obj.detachEvent('onclick',fun1);

事件对象

事件发生时自动创建的一个对象用来接收事件发生时的所有信息

e||window.event

事件流

当一个事件触发的时候,当前元素的父元素乃至整个页面,都会以一定的顺序来响应整个事件。响应的顺序叫做事件流。

2、先向下进行捕获,然后再向上冒泡

冒泡型事件流

从当前元素到根元素一级一级往上出发,

除了mouseenter、mouseleave不会触发事件流

捕获型事件流

从根元素向下捕获

阻止事件流

阻止事件流是阻止事件的传递

if(e.stopPropagation){
        e.stopPropagation();    //兼容现代浏览器
   }else{
        e.cancelBubble=true;       //兼容IE
   }

事件委托

1、新添加进来的元素,需要添加事件的时候

2、做事件优化的时候

3、使用ajax的时候

目标事件源:真正触发事件的元素

document.onload=function(){  
    var btn=document.querySelector('button');
    var div=document.querySelector('div');
    btn.onclick=function(){
        var                     newdiv=document.createElement('div');
        document.body.appendChild(newdiv);
        newdiv.innerText="new";
    }
    //目标事件源,真正触发事件的元素
    document.body.onclick=function(e){
        var obj=e.target;
        if(obj.tagName=="DIV"){
            obj.style.backgroundColor='blue'
        }
    }
}

contentidetable="true";

时间对象

MGT时间

格林尼治天文台每天发布的时间

UTC时间

世界协调时间,由原子钟计时;

计算机元年时间:1970年1月1日0时0分0秒,1970年之前为负,1970年之后为正

当前时间计算的是当前时间距离1970年的毫秒数

使用实例化时间

var time=new Date();

var time=new Date("4/21/2017 23:00:00");
var time=new Date(2017,3,21,15,16,08,123);  //月份的设置从0-11

getTime();

获取当前时间距离1970年的毫秒数

getFullyear();

获取4位数的年份

getMonth();

getDay();

0是周日

getHours();

getIMinutes();

getSecond();

getMillisecond();

cookie(本地存储)

是一种字符串,以键值对的结构形式出现

只允许在用户端里面存储4k的大小

1bit=2

1Byte=8Bit

1K=1024B

1M=1024KB

1G=1024MB

1T=1024G

同域原则

不能跨浏览器访问

cookie的访问

document.cookie

cookie的设置

临时性的cookie

浏览器关闭时,自动被删除;

document.cookie=‘’键=值 ‘’;

有生命周期的cookie

var now=new Date();
now.setTime(now.getTime()+30*1000);
document.cookie='aa=bb;expires='+now.toGMTString();

setCookie();

delCookie();

getCookie();

localStroage(永久存储)

只要不删除就不会消失

存储大小为5-10M大小

同域原则

不能跨浏览器

和时间没有关系

存储不安全

值为对象

只能存储字符串

clear();

getItem();

setItem("name","lisi");

sessionStroage(会话级存储)

会话(窗口)关闭就删除了

存储大小为5-10M大小

同域原则

不能跨浏览器

和时间没有关系

存储不安全

JSON.stringify();

将数组转化为字符串

JSON.parse

将字符串转化为数组

正则表达式RegExp()

正则是用来检测某个字符串是否符合语法规范的语言

表单验证

信息过滤

信息检索

定义方式

var reg=/不能有数字/;
var r=new RegExp();

方法

exec();

输出为一个数组对象

结构为[0:,index:,input:]

0 代表匹配到的字符;

index 代表匹配到的字符的索引位置

input 代表检测的字符串

test();

检测是否符合要求,符合为true,不符合为false

模式修正符

i

不区分大小写

var reg=/ /i;   //i代表不区分大小写
var str='abcAdef';
console.log(str);
console.log(reg.exec(str));
m

多行匹配

var reg=/^a\wc$/m;  //m代表多行匹配
var str='abc\ndef';
console.log(str);
console.log(reg.exec(str));
g

全局匹配

var reg=/ /g;   //g代表全局匹配
lastIndex属性

原子

构成正则表达式最小的单位

一个原子只能匹配一个字符

a-z

0-9

字符,.@#¥%

\d 用来匹配0-9的数字

\D 用来匹配除了0-9的数字

\w 用来匹配数字字母下划线0-9 a-z A-Z

\W 用来匹配除了数字字母下划线0-9 a-z A-Z _以外的

\s 匹配空白字符 空格 \n \r \t \v \f

\S 匹配除了空白字符 空格 \n \r \t \v \f以外的

. 匹配除了换行符以外的字符

原子表

自定义的原子

[0-9] \d

[^0-9] \D

[0-9a-zA-Z_] \w

[^0-9a-zA-Z_] \W ^表示!非

转义字符

\

var reg=/http:\/\/www\.[0-9a-z]\.com/

|

var reg=/ab|cb/;
var str='abc';
console.log(reg.exec(str));     //返回值为ab

原子分组

当形成原子分组的时候,括号里面匹配到的东西就会被压入内存(栈区),已备使用

反向引用
var reg=/a(b|c)c(\d)\1/;
var str='abc1b';
console.log(reg.exec(str));     //返回值为abc1b,反向引用只对括号里保存下来的*值*进行匹配。
var reg=/a(b|c)c(\d)\1\2/;
var str='abc1b1';
console.log(reg.exec(str));
//(3) ["abc1b1", "b", "1", index: 0, input: "abc1b1"]
//0:"abc1b1"
//1:"b"
//2:"1"
//index:0
//input:"abc1b1"
//length:3
//__proto__:Array(0)
取消反向引用

括号里面的东西不会被保存下来

var reg=/a(?:b|c)c(\d)\1/;
var str='abc11';
console.log(reg.exec(str));
//(2) ["abc1b", "b", "1", index: 0, input: "abc1b1"]
//0:"abc11"
//1:"1"
//index:0
//input:"abc11"
//length:2
//__proto__:Array(0)

量词

{}
var reg=/\d{3}/;    //匹配三次;
var str='123';
console.log(reg.exec(str));     //返回123;
贪婪匹配

偏向于匹配多的

var reg=/\d{3,5}/;  //匹配3次或者4次或者5次;
var str='12345';
console.log(reg.exec(str));     //返回12345;
吝啬匹配

偏向于匹配少的

var reg=/\d{3,5}?/; //匹配3次或者4次或者5次;
var str='12345';
console.log(reg.exec(str));     //返回123;
匹配多次(吝啬匹配)

匹配成功的前提下,开启尽可能少的匹配

var reg=/\d{3,5}?d/;    //匹配3次或者4次或者5次;
var str='12345d';
console.log(reg.exec(str));     //返回12345d;
var reg=/\d{3,5}??d/;   //第一个?是0次或1次匹配,第二个问号是开启吝啬匹配
var str='12345d';
console.log(reg.exec(str));     //返回5d;
var reg=/\d{3,}/;   //匹配最少3次,上不封顶;
var str='12345';
console.log(reg.exec(str));     //返回12345;
var reg=/\d{0,3}/;  //匹配最多3次;
var str='12345';
console.log(reg.exec(str));     //返回12345;
+

匹配>=1次

var reg=/\d+/;  //匹配>=1次;
var str='12345';
console.log(reg.exec(str));     //返回
?

匹配0次或1次

var reg=/\d?/;  //匹配0次或1次;
var str='12345';
console.log(reg.exec(str));     
//返回["1", index: 0, input: "12345"]
0:"1"
index:0
input:"12345"
length:1
*

匹配>=0次

var reg=/\d*/;  //匹配>=1次;
var str='12345';
console.log(reg.exec(str));     //返回
匹配身份证
var reg=/\d{17}[0-9X]/;
匹配网址
var reg=/(?:http|https):\/\/(?:www\.)?[0-9a-z]{2,}\.com/
边界匹配

^匹配开头$匹配结尾

var reg=/^123\d{2,4}/;  //边界匹配;
var str='123455d';
console.log(reg.exec(str));     //返回

正则

var str='a1b2c3d'
var reg=/\d/;
console.log(str.split(reg));
var str='a1b2c3d'
var reg=/\d/g;
console.log(str.replace(reg,'?'));
var str='a1b2c3d'
var reg=/\d/g;
console.log(str.search(reg));   //返回0;即使用全局g也返回第一个出现的index;

match

不加g

var str='a1b2c3d'
var reg=/\d/;   //不加g和exec的表现一样
console.log(str.match(reg));    //返回['1','1',input:'a1b2c3d'];

加g

var str='a1b2c3d'
var reg=/\d/g;  //加g以数组形式返回所有的匹配到的东西
console.log(str.match(reg));    //返回['1','2','3'];

周末作业

邮箱

var reg=/^[0-9a-z]{6,15}@(?:163|qq|sina|126|139gmail)$/;

电话(座机)

var reg=/^0\d{2,3}-\d{7}$/;

手机

账号

var reg=/^[0-9a-z]{6,20}$/;

密码

var str='huhbgdfo@#';
var reg=/^[0-9a-z./@#$%]{4,17}$/;
console.log(reg.exec(str));

身份证

var reg=/^\d{17}[0-9X]$/;

trim

trimleft

trimright

块级作用域

只要是{}里面的都是块级作用域

独立作用域

let divs=document.querySelectorAll('div');
for(let i=0;i<divs.length;i++){
    divs[i].onclick=function(){
        console.log(i);
    }
}
//此时let是每次循环式都会创建一个独立作用域
    let i=0;    //每次循环,let都会赋值,创建一个独立作用域
    divs[i].onclick=function(){
        console.log(i);
    
    let i=1;
    divs[i].onclick=function(){
        console.log(i);
     
    let i=2;
    divs[i].onclick=function(){
        console.log(i);

扩展运算符

数组或者字符串解析成用空格隔开的字符串

var arr=[1,2,3];
console.log(...arr);    //返回1 2 3;可以把空格当成逗号

rest参数用法

function fun(a,b,c,...arr){     //...arr是逆向的把4,5,6,7,8转化成数组[4,5,6,7,8]的形式
   console.log(arr);    //返回[4,5,6,7,8]
}
fun(1,2,3,4,5,6,7,8);       //函数传实际参数,前面的一一对应,后面的统一对应...arr

解构赋值

目的是为了赋值

let a,b;
[a,b]=[1,2];    //数组两边模式相同,一一对应赋值;
console.log(a,b);   //返回  1 2;


let a=1,b=2;
[a,b]=[b,a];    //等号两边互换赋值;
console.log(a,b);   //返回  2  1;


let a,b;
[a,b,...arr]=[1,2,3,4]
console.log(a,b,arr);   //返回1  2  [3,4];

let a,b,c;
[a,b,c]='abc'   //右边不是数组,程序会尽可能的把右边转化成一个数组,然后结构赋值
console.log(a,b,c);

let str1=[1,2,3];
let str2=['a','b','c'];
console.log([...str1,...str2]);     //...str拓展运算符会把str转化成以空格分开的字符串,然后在外面加上[]就变成了一个数组

暂时性死区

{
                    //暂时性死区
                    //暂时性死区
                    //暂时性死区
                    //暂时性死区
  console.log(nub);
  let nub=200;
}

let

不存在预解析,先声明后使用

const

不存在预解析,先声明后使用

es6对象的写法

写法

let name='lisi';
let age=18;
let obj={
    name,
    age,
};
console.log(obj);   //返回{name: "lisi", age: 18}

解构赋值

var a,b;
({name:a,age:b}={name:'lisi',age:18});  //加括号的原因是{}分别代表一个块级作用域,所以需要加上一个()放在一个块级作用域里面
console.log(a,b);   //返回'lisi'  18;
var {length:len,0:aa}=[1,2,3];
console.log(len,aa);    //返回3 1;

函数扩展

箭头函数

//ES5的写法
var fun=function(){
    
}
//箭头函数写法
var fun=()=>{   //省略function,在()后面加=>
    
}
//ES5写法
var fun2=function(a){
    return a;
}
console.log(fun1(1),fun2(2));
//ES6写法
var fun1=a=>a;      //与上面的意思是一样的

this指针

箭头函数使用this指针时,由定义函数时创建的环境决定的this指针

    let obj=new Object();
    obj.fun=function(){
        let self=this;
        let div=document.querySelector('div');
        div.onclick=function(){
            console.log(self);
        }
    }
    console.log(obj['fun']);

继承

从一个构造函数继承另一个构造函数

子类里面没有this,必须用super();super代表了父类的constructor方法,必须先用super();才能再用this;

class Animal{
    constructor(name){
        this.name=name;
    }
    aa(){
        console.log(this.name);
    }
}
var obj1=new Animal('lisi');

class Dog extends Animal{
    constructor(box){
        super('lisi');
        this.box=box;
    }
    bb(){
        console.log(this.box);
    }
}

var obj2=new Dog('123');
console.log(obj1);
console.log(obj2);

移动端事件

touchstart

touchmove

touchend

touches

记录点击屏幕的数值信息

targetTouches

记录点击在元素身上的数值信息

changedTouches

自从上一次时间触发以后,记录发生在元素身上的数值信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,449评论 1 37
  • 1、isArray方法Array.isArray方法用来判断一个值是否为数组。var a = [1,2];type...
    秋秋秋web阅读 248评论 0 0
  • 由于最近都在freecodecamp上刷代码,运用了很多JavaScript数组的方法,因此做了一份关于JavaS...
    2bc5f46e925b阅读 1,960评论 0 16
  • 准备做一件事情,还没开始,就买了很多装备。于是,你、我,成了装备党。 晒一些我的实用小装备。 这两个是我在阅读时,...
    商小茉阅读 2,567评论 5 3
  • 出奇制胜的关键词——智径 一,找名师 1,模仿,在自己的领域中尽量的先去模仿比自己技能高的人,打造自己的基本技能。...
    潇小姐的书影天堂阅读 239评论 0 1