ECMAScritp与JavaScritp

  • ECMAScript可以理解为JavaScript的一个标准
  • JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言

注意:大部分浏览器还只停留在支持ES5代码上,但是目前ECMAScript已经更新到ES6了,这就导致开发环境线上环境不一样,这个时候需要使用专业的打包工具进行转换

Javascript 使用方式与位置

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

<!-- 1.   scritp标签里面写javascript;type默认是javascript -->
<!--    <script type="text/javascript">-->
<!--        alert('hello javascript');-->
<!--    </script>-->

<!--    3. 外部引入-->
<script src="../js/c.js"></script>

</head>
<body>

<!--2. 这里也可以写script 标签-->
<!--<script>-->
<!--    alert('hello javascript');-->
<!--</script>-->
</body>
</html>

IDEA环境设置

Settings->Languages & Frameworks->JavaScript 版本设置为ECMAScript 6

浏览器控制台基本使用

scoop管理java java sctp_dom


scoop管理java java sctp_前端_02


scoop管理java java sctp_dom_03

数据类型

number

<script>
        // javaScript 严格区分大小写
        //定义变量
        var num=0;
        var Num=1.1;
        //js不区分小数和整数,用number声明,如果抛出未NAN,表示不是数字,Infinity表示是无穷大
        console.log('数字相加'+(num+Num));//1.1

        //number 数字类型, typeof() 可以判断数据类型
        console.log('num类型:'+typeof(num) );//number
</script>

字符串–('${str}')模板字符串

<script>
    // ''与"" 都表示字符串
       var str='cxe';
       var str1="cxe";
       console.log(typeof(str)+typeof(str1));

    // 多行字符串编写,tab键上的`` 来包裹
    var str3=`
    hello
    cxe
    `;
    console.log(str3);

    // 模板字符串 tab键上的`` 来包裹${变量}
    console.log(`${str}`);

    // 字符串长度不可变
    console.log(str.length);

    //字符串长度不可变
    str[0]='1';
    console.log(str);//cxe

    console.log(str.toUpperCase());//转大写,但是不改变str  CXE
    // str.toLowerCase()  转小写
    console.log(str);//cxe

    //查询, 如果str中存在,返回具体的索引位置,否则就返回-1
    console.log(str.indexOf('c'));

    //截取字符串 [)包头不包尾 但是不改变str
    console.log(str.substr(0,2));
    console.log(str);
</script>

等于、绝对等于、NaN

<script>
    // 布尔值与逻辑运算与java一致

    let str=1;
    let str2='1';
    let str3='1';
    let str4=NaN;
    // == 等于 (类型不一样,值一样) 避免使用
    // ===绝对等于 (类型一样,值一样)
    console.log(str==str2);//true
    console.log(str3==str);//true
    console.log(str===str2);//false
    console.log(str3===str);//false

    console.log(typeof(str4));//undefined
    console.log(str4==NaN);//false
    console.log(str4===NaN);//false

    // NAN只能通过 isNAN来判断,不能通过NAN===NAN,因为NAN与所有的数包括他本身都不相等
    console.log(isNaN(str4));//true
</script>

浮点数存在精度问题

<script>
   let num1=1/3;
   let num2=1-2/3;
   console.log(num1===num2);//false

//   浮点数计算会出现精度问题
   console.log(Math.abs(num1-num2)<0.0000001);

</script>

null与undefined

  • null的类型是一个对象,用来表示一个变量没有任何数值,而undefined是指变量没有定义任何值。
  • undefined与null不同,它表示无值的意思,并且具有独一无二的类型,它区别任何对象、数组、数值、字符串和布尔型。alert(typeof(undefined))的返回值为undefined。

数组

<script>
    // 可以包含任意的数据类型
   let arr=[1,'1',null];

   //长度
   console.log(arr.length);//3

   //从0开始,数组下标越界就是undefined
    console.log(arr[3]);//undefined

//    arr.length 长度,如果给arr.length赋值,数组大小就会发生变化
    arr.length=5;
    console.log(arr);//[1, '1', null, empty × 2]
    console.log(arr.length);//5

    // 如果赋值过小,就会丢失数据
    arr.length=2;
    console.log(arr);//[1, '1']

    // slice() 是用于截取数组的[)
    console.log(arr.slice(0,1));
    console.log(arr);

    //向尾部压入数据
    arr.push('a');
    console.log(arr);

    //弹出尾部数据
    arr.pop();
    console.log(arr);

    //向头部压入数据
    arr.unshift('a');
    console.log(arr);

    //弹出头部数据
    arr.shift();
    console.log(arr);

    //排序
    arr.sort();
    console.log(arr);

    // 元素反转
    arr.reverse();
    console.log(arr);

    //array.concat() 拼接 ,并没有修改数据,只是返回一个新数组
    console.log(arr.concat(['a','b']));
    console.log(arr);

    //使用特定的字符串来打印拼接数组
    console.log(arr.join('-'));
    console.log(arr);

    // 二维数组
    let arr2=[['a','b'],['v']];
    console.log(arr2);
    console.log(arr2[0][1]);//b
</script>

对象

<script>
    // 对象
    let person={
        name:'cx',
        age:12,
        hobby:['study','eat']
    }
    console.log(person);
    //取值
    console.log(person.name);
    console.log(person.hobby[1]);

    // 动态删选属性 delete 对象.属性
    delete person.hobby[1];//删除eat就不存在了,但空间存在
    console.log(person);
    delete person.age;//删除name就不存在了
    console.log(person);

    // 动态添加属性 person.hobby=['study','sleep']
    person.hobby=['study','sleep'];
    console.log(person);
    //特别注意:此时从上往下,整个person里面都是hobby=['study','sleep']

    // 判断属性值是否存在这个对象中 'study' in person
    console.log('study' in person);//false
    console.log('hobby' in person);//true
    // 'toString' in person 返回true,继承
    console.log('toString' in person);//true

    // 那如果判断一个属性是否自身拥有,person.hasOwnProperty('toString') 返回是false
    console.log(person.hasOwnProperty('toString')); //false

</script>

严格检查模式

<script>
    //放在第一行
    //严格检查模式,预防javascript的随意性导致产生的一些问题
    'use strict';

    // 定义局部变量
    let a;

</script>

let 定义局部变量

循环

<script>
    // if,while,for与java一致
    let arr=[3,2,1];
    for (let x of arr){
        console.log(x);
    }

    console.log('-----------------');
    // forEach循环
    arr.forEach(function (value){
        console.log(value);
    })
    console.log('-----------------');

    //num is index
    for (let num in arr){
        if(arr.hasOwnProperty(num)){
            console.log(num+':'+arr[num]);
        }
    }
    // 不建议使用for in ,建议使用for of

</script>

Map与Set \ iterator接口 (ES6新特性)

<script>
   // ES6 新特性 Map
   let map=new Map([['cxe',100],['cx',99]]);
//   通过key获取value
   let let1 = map.get('cx');
   console.log(let1);
   // 新增 第一次出现是
   map.set('xc',120);
   console.log(map);
   //修改 已近存在
   map.set('xc',150);
   console.log(map);
//   删除
   map.delete('xc');
   console.log(map);

   // ES6 新特性Set  无序不重复集合
   let set = new Set([1,2,4,5,'5',5]);//自动去掉一个5
   console.log(set);
// 添加
   set.add(1);//添加不进去
   set.add('1');
   console.log(set);
// 删除
   set.delete(1);
   console.log(set);
   //是否包含某个元素
   console.log(set.has(1));

   //对实现; iterator接口的数据结构赋值
   let [x,y]=set;
   console.log({x,y});

   let [first,...rest]=set;
   console.log({first, rest});//first是第一个,rest是后面所有遍历的形成一个数组
  
</script>

函数

<script>

    console.log(abs(2));//ok

    //1. 函数
    function abs(x){
        return x;
    };


    let abs2=function(x){
        return x;
    };

    console.log(abs(1));//ok
    console.log(abs2(3));//ok

console.log('---------------');
    // 参数问题: javascript 可以传任意个参数
    console.log(abs2(3,2,1));//ok,但后面的值无用


    console.log('---------------');
    // 2.传递多个参数 arguments,所有传递进来参数的是一个数组
    function t2(x){
        for (let i=0;i<arguments.length;i++){
            console.log(arguments[i]);
        };
        console.log(x);;
    };
    t2(0,3,4,5);
    console.log('---------------');

    //ES6 新特性  rest
    function t3(x,...rest){
        return x+rest;
    }
    //rest是一个空数组
    console.log(t3(1));
    //rest是一个rest[2,3,4]
    console.log(t3(1,2,3,4));
    console.log('---------------');

    //1.不传递参数,异常处理
    function t1(x){
        if(typeof x !== 'number'){
            throw 'not is a number';
        }else{
            return x;
        }
    };
    console.log(t1("x"));//not is a number




</script>

作用域

  • 规范:申明都放在第一行

局部变量

<script>

    // 局部变量
    // 1.函数体内的变量只在函数体内生效
    // 2.内部函数可以访问外部函数的变量,反之不行
    // 3.如果内外函数重名,函数会由内向外查找,内部变量会覆盖外部变量
    function abs(x,y){
        let a=2;
        let b=3;
        let z=function abs2(y){
            let b=0;
            return y+a+b;
        };
        console.log(a+z(2));
    };
    abs(1,2);//6

    function abs32(){
        let x='x';
        console.log(x+y);
        let y='y';
    }
    //结果:xundefine
    //原因:js执行引擎,自动提升了y的声明,但是不会提升y的赋值
    //等价:
    // function abs32(){
    //     let x='x';
    //     let y;
    //     console.log(x+y);
    //     y='y';
    
</script>

全局变量

<script>
    // 全局变量
    var x='x';
    function abs32(){
        console.log(x);
    }
    abs32();

    alert(x);
    //默认所有的全局变量都会自动绑定在window对象下
    alert(window.x);


    //alert 本身也是window的一个变量
    window.alert();
    //那么:
    var old_alert=window.alert;
    // 也能达到alert的效果
    old_alert(1);


    window.alert= function(){};
    // 此时被重载了,不能实现之前的功能了
    // 说明javascript 实际上只有一个全局作用域
    window.alert();//不起作用了
    
</script>

面对全局作用域只有一个的情况下,当多个项目需要用到变量时,都会绑定在window上,如果不同的js文件,使用了相同的全局变量,就会发生冲突?此时如何解决?

<script>
    //定义一个唯一的全局变量
    var app={};

    //定义全局变量
    app.name='cxe';
    // 把自己代码全部放入自己定义的唯一空间名字中,降低全局变量命名冲突问题

    console.log(app.name);
</script>

局部作用域

<script>
    function abs33(){
        for(var i=0;i<2;i++){
            console.log(i);
        }
        console.log(i); //这里还能使用
    }
    abs33();

    // ES6引入let,解决局部作用域冲突问题
    function abs34(){
        for(let i=0;i<2;i++){
            console.log(i);
        }
        console.log(i); //这里不能使用了
    }
    abs34();
</script>

常量cast(ES6新特性)

<script>
    const PI=3.1415926;
    console.log(PI);
    PI=2;//Assignment to constant variable.
   
</script>

方法

<script>
   function getAge(name){
       var now=new Date().getFullYear();
       return name+':'+(now-this.birth);
   };

   var per1={
       name:'cx',
       birth:1998,
       age:getAge
   };

   var per2={
       name:'cxe',
       birth:1999,
       age:getAge
   };

   //方法就是把函数放进对象里面,对象只有属性和方法
   var per3={
       name:'cxeq',
       birth:2000,
       age:function (name){
           var now2=new Date().getFullYear();
           return name+':'+(now2-this.birth);
       }
   };

   //1. 调用方式
   console.log(per1.age(per1.name));
   console.log(per2.age(per2.name));
   console.log(per3.age(per3.name));
   console.log('-------------------------');

   //2. 调用方式
   console.log(getAge.apply(per1,[per1.name]));



</script>

Date对象

<script>
  var now=new Date();
  now.getFullYear();//年
  now.getMonth();//月
  now.getDate();//日
  now.getDay();//星期几
  now.getHours();//时
  now.getMinutes();//分
  now.getSeconds();//秒

  now.getTime();//时间戳 1970 1.1

  //时间戳转为时间
  var date = new Date(1314115451415);
  console.log(date);

  var s = now.toLocaleString();//当前时间
  console.log(s);

  var toGMTString = now.toGMTString();
  console.log(toGMTString);


</script>

JSON

  • JSON:是一种轻量级的数据交换格式
    简洁和清晰的层次机构使得JSON成为理想的数据交换语言
    易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
  1. 对象都有{}
  2. 数组都用[]
  3. 所有都用键值对
<script>
  var user={
      name:'cx',
      age:22,
      sex:'男'
  };

  //对象转json
  var jsonString = JSON.stringify(user);
  console.log(jsonString);

  //json转对象
  var parse = JSON.parse(jsonString);
  var parse2 = JSON.parse('{"name":"cx","age":22,"sex":"男"}');
  console.log(parse);
  console.log(parse2);
</script>

继承

面向对象原型继承

<script>
    var person={
        name:'cx',
        age:22,
        sleep:function (){
            console.log(this.name +' sleep') ;
        }
    }

    var student={
        name:'cxe',
        age:21
    }

    //原型对象
    student.__proto__ = person;

    student.sleep();
    person.sleep();

</script>

Class (ES6新特性)

<script>
    class Person{
       name;
        age;

        constructor(name,age) {
            this.name=name;
            this.age=age;
        }
        sleep(){
            console.log(this.name +' sleep') ;
        };
    }

   let person = new Person('cx',22);
   person.sleep();

</script>

BOM

  • bom 浏览器对象模型
  1. window 代表浏览器窗口;
  2. navigator 代表浏览器的信息;
  3. screen 代表屏幕尺寸;
  4. location 代表页面的url信息;
  5. document 当前文档;
  6. history 历史;
<script>
   document.title='cxe';//网页标题

   //获取cookie
   var cookie = document.cookie;
   //为了避免这种情况,服务器端设置cookie : httpOnly

   //history 浏览器历史记录
   history.back();//后退
   history.forward();//前进

   //localtion 获取页面的url信息
   var host = location.host;
   var href = location.href;
   var protocol = location.protocol;
   location.reload();//刷新网页
   location.assign('www.baidu.com');//设置新的地址

   //Navigator 封装了浏览器的信息
   var appName = navigator.appName;
   var appVersion = navigator.appVersion;
   var userAgent = navigator.userAgent;
   var platform = navigator.platform;
   //大多数时候,并不会使用 navigator对象,因为会被人为修改,所以不建议使用这些属性来判断和编写代码;

   //screen 代表屏幕尺寸
   var width = screen.width;
   var height = screen.height;

   //window
   window.alert('ok');
   var innerWidth = window.innerWidth;
   var innerHeight = window.innerHeight;
   var outerHeight = window.outerHeight;
   var outerWidth = window.outerWidth;



</script>

DOM

<body>
<p id="t1">cc</p>
<form action="https://www.baidu.com" method="post" id="forms">
    <div>
        账号:<input type="text" name="name" id="name" class="name"/>
    </div>
    <div>
        密码:<input type="password" name="password" id="password" class="password"/>
    </div>
    <div>
                       <input type="submit" name="btn1"/>
         
          <input type="reset" name="btn2"/>
    </div>
</form>
<p id="t">cx</p>
<script>
    //创建一个新的节点
    var htmlParagraphElement = document.createElement('p');
    htmlParagraphElement.id='t3';
    htmlParagraphElement.innerText='cxc';
    //设置属性
    htmlParagraphElement.setAttribute('name','add2');

    //通过类选择器
    var text1 = document.getElementsByClassName('name');//获得的是一个数组
    //var pass2 = document.getElementsByClassName('password');

    //通过id选择器
    //var text1 = document.getElementById('name');
    var pass2 = document.getElementById('password');

    //通过标签选择器
    var elementsByTagName = document.getElementsByTagName('input');

    var elementById = document.getElementById('t1');
    var elementById2 = document.getElementById('t');
    //追加 注意:如果是页面本身有的元素append到另一个页面元素,那么原元素就会消失
    elementById2.append(elementById);
    //追加 如果不是页面本身有的元素append到另一个页面元素
    //是在parendNode节点中 todo 最后一个子节点 后插入新Node
    elementById2.append(htmlParagraphElement);

    //操作文本
    //elementById.innerText='cxe';//修改文本的值
    //elementById.innerHTML='<strong>测试</strong>';//解析HTML文本语言

    //操作js
    var elementById1 = document.getElementById('forms');
    //console.log(elementById1);
    var parentElement = elementById1.parentElement;
    console.log(parentElement);//body标签
    parentElement.style.background='red';


    //删除节点 : 需要先获取其父亲节点,再通过父亲节点删除自己
    parentElement.removeChild(elementById2);

    // 注意: 删除是一个动态的过程
    parentElement.removeChild(parentElement.children[0]);
    parentElement.removeChild(parentElement.children[1]);//parameter 1 is not of type 'Node'.
    //因为删除上一个,下一个就是0

    //value 与 valueOf
    var object = elementById1.valueOf();//对象的方法
    var val = elementById2.value;//对象的属性
</script>
</body>

md加密

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        a{
            font-weight: bold;
        }
    </style>

<!--    如果浏览器console窗口出现警告-->
<!--    按F12,点击小齿轮(settings)->Preferences->Sources->Enable JavaScript source maps,去掉勾选即可-->
    <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js"></script>

</head>

<body>
<p id="t1">cc</p>
<!--
onsubmit 绑定一个提交检测函数 true false
将这个结果返回给表单,使用onsubmit接受
-->
<form action="" method="post" id="forms" onsubmit=" return click2()">
    <div>
        账号:<input type="text" name="name" id="name" class="name"/>
    </div>
    <div>
        密码:<input type="password" name="password" id="password" class="password"/>
        <input type="hidden" name="password" id="md5-password" class="password"/>
    </div>
    <div>
        <span>性别:</span>
        <input type="radio" name="sex" id="boy" value="man"/>
        <input type="radio" name="sex" id="girl" value="woman"/>
    </div>
    <div>
                       <input type="submit" name="btn1"/>
         
          <input type="reset" name="btn2"/>
    </div>
</form>
<p id="t">cx</p>
<script>
    //创建一个新的节点
    var htmlParagraphElement = document.createElement('p');
    htmlParagraphElement.id='t3';
    htmlParagraphElement.innerText='cxc';
    //设置属性
    htmlParagraphElement.setAttribute('name','add2');

    //通过类选择器
    var text1 = document.getElementsByClassName('name');//获得的是一个数组
    //var pass2 = document.getElementsByClassName('password');

    //通过id选择器
    //var text1 = document.getElementById('name');
    var pass2 = document.getElementById('password');

    //通过标签选择器
    var elementsByTagName = document.getElementsByTagName('input');

    var elementById = document.getElementById('t1');
    var elementById2 = document.getElementById('t');
    //追加 注意:如果是页面本身有的元素append到另一个页面元素,那么原元素就会消失
    elementById2.append(elementById);
    //追加 如果不是页面本身有的元素append到另一个页面元素
    //是在parendNode节点中 todo 最后一个子节点 后插入新Node
    elementById2.append(htmlParagraphElement);

    //操作文本
    //elementById.innerText='cxe';//修改文本的值
    //elementById.innerHTML='<strong>测试</strong>';//解析HTML文本语言

    //操作js
    var elementById1 = document.getElementById('forms');
    //console.log(elementById1);
    var parentElement = elementById1.parentElement;
    console.log(parentElement);//body标签
    //parentElement.style.background='red';


    //删除节点 : 需要先获取其父亲节点,再通过父亲节点删除自己
    parentElement.removeChild(elementById2);

    // 注意: 删除是一个动态的过程
    //parentElement.removeChild(parentElement.children[0]);
    //parentElement.removeChild(parentElement.children[1]);//parameter 1 is not of type 'Node'.
    //因为删除上一个,下一个就是0

    //value 与 valueOf
    var object = elementById1.valueOf();//对象的方法
    var val = elementById2.value;//对象的属性


    function click2(){
        alert(1);
        //获取单选框的值
        var elementById3 = document.getElementById('boy');
        var elementById4 = document.getElementById('girl');
        var elementById5 = document.getElementById('md5-password');
        //1. 进行md5加密  这种直接修改原本文本值,会导致在提交的一瞬间,页面密码长度突变
        //pass2.value=md5(pass2.value);

        //2.
        elementById5.value=md5(pass2.value);

        if (elementById3.checked){
            console.log(elementById3.value);
        }else if(elementById4.checked){
            console.log(elementById4.value);
        };
        alert(1);
        return true;
    }


</script>
</body>
</html>

JQuery

记住一个公式: $(selector).action()