JavaScript基础

一、引入js文件

       行内式<div οnclick="alert(hello)">hello</div>
       外链式<script src='html.js'></script>
       内嵌式<script> function() {}</script>

二、输出

        window.alert();弹出警告框
        window.prompt();可以接收用户的输入
        document.write();方法将内容写到html文档中
        document.getElementById("id").innerHTML="内容";写到HTML元素
        console.log();写到浏览器的控制台

三、变量

        未定义未赋值=报错
         定义未赋值=undefined
         未定义有赋值=赋值
         var a=b=c=9  相当与  var a =9; b=9; c=9;  b和 c 直接赋值,没有var 声明

四、数据类型

       1.数字 Number

    Number.MAX_VALUE:最大值
    Number.MIN_VALUE:最小值
    Infinity:无穷大
    -Infinity:无穷小
    NaN: not a number 非数值   'a'-100
    isNaN() 判断非数字并返回 false 或 true

       2.字符串 String

    可以是 " 或者 '  (外双内单,外单内双)
    转义符  ' \n' 换行符  '\\' 斜杠\  '\''  单引导  '\"' 双引导   '\t'  tab缩进 '\b' 空格
    字符串长度  .length
    字符串拼接  字符串+任意类型=新字符串

       3.布尔型

        boolean    :true=1    flase=0

        4.undefined:

        声明后未赋值定义数据类型  undefined + 数字 = NaN

       5.none:空

      6. typeof  判断数据类型

       数据类型转换
     转换为字符串  
        变量.toString();   
        String(变量)强制转换;  
        加号拼接字符串(隐式转换)
    转换为数字型  
        parseInt(string)函数;将string类型转换为整数数值型
        paesrFloat(string)函数;将string类型转换为浮点数数值型
        Number()强制转换函数;将string类型转换为数值型
        js隐式转换(- * /)利用算术运算隐式转换为数值型
    转换为布尔型
        Boolean()函数  
        代表空,否定的值都会被转换为false,如",0,NaN,null,undefined。其他值都被转换为true
    .trim():去除字符串前后两端的空白字符

五、运算符

      1.自增运算符     ++var    先+1后返回值          var++    先返回原值后+1
       2.比较运算符   === 值和数据类型都相等    
       3.逻辑与短路运算     (123&&456) 如果表达式1结果为真,则返回表达式2,反之返回表达式1
      4.三元表达式    条件表达式 ? 表达式1 :表达式2
      5.switch (表达式) case value: 表达式;break; default : 表达式;

六、数组 Array

    var arr = new Array();    //创建一个新的空数组
           var 数组名 = [ ] ;   //利用数组字面量创建数组
           数组长度  arr.length
    新增数组元素   1. 修改length长度   2.修改索引号
    冒泡排序  
    var arr = [ 5 4 3 2 1 ];
    for (var i = 0; i <= arr.length - 1; i++){ //外层循环管趟数
        for( var j = 0;j <= arr.length-i-1; j++){ //里面的循环管每一趟的交换次数
        //内部交换两个变量的值,前面一个和后面一个数组元素相比较
            if ( arr [ j ] >arr [ j+1]){
                var tem = arr [ j ];
                arr [ j ] = arr [ j+1 ];
                arr [ j+1 ] = temp;
            }
         }
     }

七、函数 Function  函数名 (形参1,形参2...){  }

    函数名 (实参1,实参2...);
    函数的返回值 : return
    function 函数名(){
      return     需要返回的结果;}    
     函数名();    
    arguments :  只有函数才有 arguments 对象,而且是每个函数都内置好了这个arguments
    function fn() {
        console.log(arguments) ;     
        console.log(arguments.length); }
    function(1,2,3);
    //伪数组  并不是真正意义上的数组
       1.具有数组的length 属性 ,
        2.按照索引的方式进行存贮,
       3.它没有真正数组的一些方法 pop()  push()等
    函数表达式 (匿名函数) :var fn = function () {};   fn();   //fn 是变量名,不是函数名
    作用域
      1.如果在函数内部,没有声明,直接赋值的变量属于全局变量
      2.函数的形参可以看作是局部变量
      3.全局变量只有浏览器关闭的时候才会销毁,比较占内存资源
      4.局部变量当程序执行完毕就会销毁,比较节约内存资源
     es6新增块级作用域 {}  if {} ,  for {}
     作用域链 : 内部函数访问外部函数的变量,采取链式查找的方式来决定取哪个值(就近原则)
    预解析
        js 引擎会把 js 里面所有的 var 还有 function 提升到当前作用域的最前面,不提升赋值(不调用函数)操作

八、对象 Object 

是一组无序的相关属性和方法的集合,所有的事物都是对象
    1.字面量创建对象
       var obj = { uname: '张山',age: 18, say: function() {console.log('hi')} //匿名函数}
      调用对象的属性 : obj.uname 或 obj['uname'];
      调用对象的方法 : obj.say();
    2.利用 new Object 创建对象
       var obj = new Object ();
       obj.uname = '张山';
       obj.age = '18';
    3.利用构造函数创建对象  泛指某一大类,类似于java里的类(class)
       function 构造函数名 () {  // 构造函数名字首字母要大写!  function Star (uname, age, sex){
           this.属性 = 值 ;                     this,name = uname;
           this.方法 = function (){} }                this.age = age;
       new 构造函数名 ();    //构造函数不需要 return就可返回结果    this.sex = sex; }
            //调用函数必须使用new        new Star('张山','18','男');
    //调用函数返回的是一个对象, 通过new关键字创建对象的过程称为对象实例化
    ***new 关键字执行过程 :
        1.new 构造函数可以在内存中创建一个空对象
        2.this 就会指向刚才创建的空对象
        3.执行构造函数里面的代码,给这个空对象添加属性和方法
        4.返回这个对象
    遍历对象
      for...in 语句用于数组或者对象的属性进行循环操作
     for (变量 in 对象){}  
      //for (var k in obj){ console.log(k);//输出的是属性名    console.log(obj[k]);//得到的是属性值}
    //使用 for...in 里面的变量常用 k 或者 key

九、内置对象

    Math 对象   

        Math.PI()  圆周率
        Math.max() 函数返回最大值  非数值返回NaN 无数值
        Math.abs()  绝对值
        Math.floor() 向下取整,往最小了取值 //3.4=3
        Math.ceil() 向上取整,往大了取值//3.4=4
        Math.round() 四舍五入,.5特殊,往大了取
        Math.random() 返回一个浮点数随机数  [0,1)
    //得到两个数之间的随机整数,且包含这两个整数
    function getRandom(min,max){ return Math.floor(Math.random()*(max-min+1))+min;}

Date 对象 

是一个构造函数,必须使用new 来调用创建日期对象
        var date = new Date(); 无数值则返回当前系统时间;
    常用写法 数字型:2020,10,01 或 字符串型 :' 2020-10-1 8: 8:8'
        var date =new Date(2020,10,1);返回的是11月不是10月
    格式化日期 年月日
        var date = new Date(); console.log(date.getFullYear());//返回当前日期的年  
        getMonth();返回月份小一个月,需要月份+1;  
        getDate();返回的是几号
        getDay(); 返回星期几;周一返回1,周日返回0
    完整日期
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth();
        var date = date.getDate();
        var arr = ['星期日’'星期一'...];
        var day = date.getDay();
        console.log( year+month+date+arr[day]);
    格式化 时 分 秒
        getHours();时
        getMinutes();分
        getSeconds();秒
    //获得 Date总的毫秒数 距离1970.1.1过了多少毫秒数
        valueOf() 或 getTime()
        简单写法:var date = +new Date();
        H5 新增获得总毫秒 :console.log(Date.now())
    倒计时
        function countDown (time) {
        var nowTime =+new Date();//获取当前时间总毫秒
        var inputTime =+new Date(time);//获取输入的时间总毫秒
        var times=(inputTime - nowTime)/1000;//得到剩余的秒数
        var d = parseInt( times / 60/60/24);//计算天数
        d = d < 10 ? '0' + d : d;
        var h = parseInt( times / 60/60%24);//计算小时
        h = h < 10 ? '0' + h : h;
        var m = parseInt( times / 60%60);//计算分数
        m = m < 10 ? '0' + m : m;
        var s = parseInt( times %60);//计算秒数
        s = s < 10 ? '0' + s : s;
        return d + h + m + s;}

    数组对象

        var arr = new Array(1);//表示数组长度为1
        var arr = new Array(1,2);//表示数组元素是1,2
    检测是否为数组
        1.instanceof 运算符 用来检测是否为数组 ( arr instanceof Array)
        2.Array.isArray(参数) H5新增,ie9以上版本 优先级高于 instanceof
    添加删除数组元素的方法
        .push(添加的数组元素) 在数组末尾添加一个或多个数组元素;push 完毕后返回的结果是新数组的长度;原数组也会发生变化
        .unshift() 在数组的前面追加元素
        .pop(没有参数) 删除数组最后一个元素;返回的是删除的元素
        .shift(没有参数)删除数组第一个元素;返回的是删除的元素
    翻转数组
        .reverse();
    数组排序(冒泡排序)
        .sort(function(a,b){return a-b;升序的顺序排列  return b-a;降序的顺序排列   });
    返回数组元素索引号方法
        .indexof(数组元素);返回该第一个满足条件的数组元素的索引号;找不到该元素则返回-1;从前开始查找
        .lastIndexof(数组元素);返回该第一个满足条件的数组元素的索引号;找不到该元素则返回-1;从后开始查找
    数组去重
        function unique (arr){
        var newArr = [];
        for (var i=0;i<arr.length;i++){
        if(newArr.indexof(arr[i])===-1){
        newArr.push(arr[i])}
        return newArr;}
        var demo = unique([1,2,2,3,4,5,4,5,66,7,8,1]);
        console.log(demo);
    数组转换为字符串
        .toString();把数组转化为字符串,逗号分隔每一项
        .join('分隔符');方法用于把数组中的所有元素转化为一个字符串
    基本包装类型        
           var str = 'andy';//相等于以下代码
        1.把简单数据类型包装成复杂数据类型
            var temp = new String('andy');
        2.把临时变量的值给str
            str = temp;
        3.销毁临时变量
            temp = null;
    字符串不可变性
        定变量的值不可变,虽然看上去内容改变了,其实是地址变了,内存中开辟了一个内存空间
    根据字符返回位置
        .indexOf('要查找的字符',[起始的位置]);  
        .lastIndexof(数组元素);
    返回字符位置及次数
        var str = 'abccdogoohlo';
        var index = str.indexOf('o');
        var num = 0;
        while(index!==-1){
            console.log('index');
            num++;
            index = str.indexOf('o',index+1);
        }
        console.log(num);
    根据位置返回字符
        1.  .charAt(index)//字符串的索引号    
        var str = 'abcd';
        console.log(str.charAt(3));
        //遍历所有的字符
        for(var i=0;i<str.length;i++){
            console.log(str.charAt(i));}
        2.  .charCodeAt(index);//返回相应索引号的字符ASCII值,目的:判断用户按下哪个键;
        3.  str[index] H5新增
    遍历对象,得到最大值和该字符
        var str='abcdefoxoazzhddsopa';
        var o={};
        for (var i=0;i<str.length;i++){
            var chars = str.charAt(i);//chars 是字符串的每一个字符    
            if (o[chars]){   //o[chars]得到的是属性值
                o[chars]++;}    
            else{ o[chars] = 1;}}    
        console.log(o);
        遍历对象
            var max = 0;
            var ch ='';
            for (var k in o){
            //k得到的是属性名
            //o[k]得到的是属性值
                if (o[k]> max){
                max = o[k];
                ch = k;
            }}
            console.log(max);
            console.log('最多的字符是'+ ch);
    字符串操作方法
    concat(str1,str2,str3...) : concat()方法用于连接两个或多个字符。拼接字符串,等效于+,+更常用
    substr(start,length) :从start位置开始(索引号),length取的个数
    slice(start,end):从start位置开始,截取到end位置,end取不到(他们俩都是索引号)
    substring(start,end):从start位置开始,截取到end位置,end取不到,基本和slice相同但是不接受负值
        //str.substr(1,3);
    替换字符replace(‘被替换的字符’,‘替换的字符’)只替换第一个字符
    字符转换为数组 split('分隔符')
    toUpperCase()转换大写;toLowerCase()转换小写;

简单类型与复杂类型

    简单类型又叫基本数据类型或者值类型,复杂类型又叫引用类型。
    值类型:string,number,boolean,undefined,null
    引用类型:通过new关键字创建的对象(系统对象,自定义对象)如Object,Array,Date等。
    引用类型变量(栈空间)里存放的是地址。真正的对象实例存放在堆空间中。
    堆和栈空间分配区别
        栈:由操作系统自动分配释放存放函数的参数值,局部变量的值等。其操作方式类似数据结构的栈;
            简单数据类型存放在栈里面

        堆:存储复杂类型(对象),一般有程序员分配释放,若程序员不释放,有垃圾回收机制回收
            复杂数据类型存放在堆里面

WebAPIs :

浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)
    console.dir()打印我们返回的元素对象,更好的查看里面的属性和方法

DOM 

    document.getElementById()    返回对拥有指定 id 的第一个对象的引用。
    document.getElementsByName()    返回带有指定名称的对象集合。
    document.getElementsByTagName()    返回带有指定标签名的对象集合。
    document.body    返回文档的body元素
    document.documentElement    返回文档的根节点
    document.querySelector()    返回文档中匹配指定的CSS选择器的第一元素
    document.querySelectorAll()    document.querySelectorAll() 是 HTML5中引入的新方法,返回文档中匹配的CSS选择器的所有元素节点列表
    
    改变元素内容:element.innerText,element.innerHTML
        innerText 不识别html标签,非标准;去除空格和换行;
        innerHTML 识别html标签,w3c标准,保留空格和换行;
        这两个属性是可读写的,可以获取元素里面的内容;src;href;title,alt
    
    表单元素的属性操作:type,value,checked,selected,disabled
        //eye.onclick = function(){if(flag == 0){pwd.type ='text';eye.src ='';flag =1;}
            else{pwd.type='';eye.src='';flag=0;}}
        element.style 行内样式操作
        element.className 类名样式操作
        js 修改 style 样式操作,产生的是行内样式,css权重比价重
    排他思想:当有同一组元素,需要某一个元素实现某种样式时,需要使用循环的排他思想;
        1.所有元素全部清除样式;2.给当前元素设置样式;
    自定义属性操作:
        获取属性值:element.属性;获取内置属性值(元素本身自带的属性)
        element.getAttribute('属性');主要获得自定义的属性(标准)程序员自定义的属性
    设置元素属性值:
        element.属性='值';
        element.setAttribute('属性','值');主要针对与自定义属性
    移除属性:element.removeAttribute('属性');            
    设置H5自定义属性 data-开头做为属性名并且赋值;
        <div data-index='1'></div>

阻止链接跳转需要添加javascript:void(0);或者javascript:;

节点操作:  
    获取元素两种方式:利用DOM提供的方法获取元素;利用节点层级关系获取元素;
    节点至少拥有nodeType(节点类型),nodeName(节点名称),nodeValue(节点值)
    元素节点 nodeType 为1;属性节点 nodeType 为2;文本节点 nodeType 为3(文本节点包含文字,空格,换行等);
    节点操作主要操作的是元素节点
    父节点 node.parentNode(离元素最近的父级节点)
    子节点 parentNode.childNodes(标准)返回包含指定节点的子节点的集合 (包括文本节点,元素节点)
        children(非标准)获取所有的子元素节点
        firstchild:第一个子节点;lastchild:最后一个子节点;(不管是文本节点还是元素节点)
        firstElementChild:第一个元素节点,找不到返回Null;lastElementChild:最后一个元素节点,找不到返回Null;(考虑兼容性)
        children[1];(没有兼容问题)
    兄弟节点:node.nextSibling:返回当前元素的下一个兄弟节点;
          node.previousSibling:返回当前元素的上一个兄弟节点;包含所有的节点
             nextElementSibling:得到下一个兄弟元素节点;
             previousElementSibling:得到上一个兄弟元素节点;
    动态创建元素节点:document.createElement('tagName')
    添加节点:node.appendChild(child) node:父级;child:子级;(在最后添加)
          node.insertBefore(child,指定元素)
    删除节点:node.removeChild(child)
    复制节点(克隆节点):node.cloneNode(ture/false);false:浅拷贝,只复制标签不复制内容;
        复制完要添加

三种动态创建元素的区别:
    document.write()是直接将内容写入页面的内容流,但文档流执行完毕,则它会导致页面全部重绘
    element.innerHtml 是将内容写入某个DOM节点,不会导致页面全部重绘;创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
    document.createElement() 创建多个元素效率稍微低一点点,但是结构更清晰

注册事件(绑定事件):传统方式和方法监听注册方式
    传统注册方式:利用On开头的事件onclick;注册事件的唯一性;同一元素同一事件只能设置一个处理函数
    方法监听注册方式:标准;addEventListener();同一元素同一事件可以注册多个监听器;按注册顺序执行
        eventTarget.addEventLister(type,lister[,useCaoture])
        该方法将指定的监听器注册到eventTarget(目标对象)上,该对象触发指定的事件时,就会执行事件处理函数
        接收三个参数:type:事件类型字符串,如click,mouseover,不要带on;
                listener:事件处理函数,事件发生时,会调用该监听函数
                useCapture:可选参数,是一个布尔值,默认false

删除事件:传统注册方式:eventTarget.onclick = null;
      方法监听注册方式:eventTarget.removeEventListener(type,listener[,useCapture];)

DOM 事件流:事件发生时会在元素节点之间按特点的顺序传播过程;
    捕获阶段(document--html--body--div),当前任务阶段,冒泡阶段(div--body--html--document);
    JS代码中只能执行捕获或者冒泡其中的一个阶段。
    onclick 和 attachEvent 只能得到冒泡阶段;
    addEventListener(type,listener[,useCapture])第三个参数如果是ture,表示事件捕获阶段
    调用事件处理程序;如果是false,表示在事件冒泡阶段调用事件处理程序;
    onblur,onfocus,onmouseenter,onmouseleave事件没有冒泡

事件对象 div.οnclick=function(event){}
    event就是一个事件对象,写的侦听函数的小括号里,当形参看;
    事件对象只有了事件才会存在,系统自动创建的,不需要传递参数;
    事件对象是事件的一系列相关数据的集合,跟事件相关的;
    事件对象命名可以自定义 event,evt,e;
    常见事件对象的属性和方法:
        e.target返回的是触发事件的对象(元素);
        this返回的是绑定事件的对象(元素)
        返回事件类型:e.type
    阻止默认行为(事件)让链接不跳转或提交按钮不提交:e.preventDefault();
    阻止事件冒泡:e.stopPropagation();

事件委托(代理,委派)
    原理:不是给每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,
        然后利用冒泡原理影响设置每个子节点;(提高了程序性能)

禁止鼠标右键菜单:document.addEventListener('contextmenu',function(e){e.preventDefault();})

禁止鼠标选中:document.addEventListener('selectstart',function(e){e.preventDefault();})

鼠标事件对象 MouseEvent
    e.dlientX/Y :返回鼠标相对于浏览器窗口可视区的X/Y坐标;
    e.pageX/Y:返回鼠标相对于文档页面的X/Y坐标;
    e.screenX/Y: 返回鼠标相对于电脑屏幕的X/Y坐标;

键盘事件:
    keyup:按键松开的时候触发;
    keydown:按键按下的时候触发;能识别功能键
    keypress:按键按下时的时候触发;不能识别功能键:ctrl.shift等;区分大小写

键盘事件对象中的keyCode属性可以得到相应键的ASCII码值

BOM  

    调整窗口大小 :window.οnresize=function(){};window.addEventListener('resize',function(){})

    定时器:window.setTimeout(调用函数,延时时间);//只调用一次; 停止window.clearTimeout(timeoutID)
        window.setInterval(调用函数,延时时间);//重复调用;  停止window.clearInterval(timeoutID)

this 指向问题:一般情况下this的最终指向的是那个调用它的对象
    1.全局作用域或者普通函数中this指向全局对象window(定时器里面的this指向window);
    2.方法调用中谁调用this指向谁;
    3.构造函数中this指向构造函数的实例

JS执行机制 :同步和异步
    同步任务:都在主线程上执行,形成一个执行栈;
    异步任务:通过回调函数实现;一般而言,异步任务有以下三种类型:
        1.普通事件:click,resize等;
        2.资源加载:load,error等;
        3.定时器:setInterval,setTimeout等;
        异步任务相关回调函数添加到任务队列中(任务队列也称消息队列)

location对象:用于获取或设置窗体的URL,并且可以用于解析URL。该属性返回的是一个对象;
    location.href:获取或设置整个URL;
    location.host:返回主机(域名);
    location:port:返回端口号,如未写返回字符串;
    location.pathname:返回路径;
    location.search:返回参数;
    location:hash:返回片段 #后面内容常见于链接锚点;
    location.assign():跟href一样可以跳转页面(也称为重定向页面)
    location.replace():替换当前页面,因为不记录历史,所以不能后退页面;
    location.reload():重新加载页面,相当于刷新按钮或者F5 如果参数为ture强制刷新ctrl+f5;

navigator 对象:包含浏览器的信息,userAgent 可以判断用户哪个终端打开页面,实现跳转;

history 对象:与浏览器历史记录进行交互,该对象包含用户(在浏览器窗口中)访问过的URL;
    back():可以后退功能;
    forward():前进功能;
    go(参数):前进后退功能,参数是1,前进一个页面,-1后退一个页面;

offset :偏移量,可以动态的得到该元素的位置(偏移),大小等;
    获取元素距离带有定位父元素的位置;
    获取元素自身的大小(宽度高度);
    返回的数值都不带单位;
    element.offsetParent:返回作为该元素带有定位的父级元素,如果父级元素没有定位则返回body;
    element.offsetTop:返回元素相对带有定位的父级元素上方的偏移;
    element.offsetLeft:返回元素相对带有定位的父级元素左边框的偏移;
    element.offsetWidth:返回自身包括padding,边框,内容区的宽度,返回值不带单位;
    element.offsetHeight:返回自身包括padding,边框,内容区的高度,返回值不带单位;
offset 和style区别:
    style:只能得到行内样式表中的样式值,带单位;是可读写属性,可以获取和赋值。不包含padding,border;
    offset:可以得到任意样式表中的样式值,不带单位,只读属性,只能获取不能赋值;
    获取元素大小使用offset;给元素更改值用style;
 

更多详细

可到W3C文档查看:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值