• 2019.5.5 JS相关


    目录

    JS(JavaScript)

    简介

    • JS全称:JavaScript
    • JS是面向对象的编程语言,脚本语言
    • JS的组成部分
      • EMAScript:ES5 ES6 基础语法和标准性的东西
      • DOM:文档元素进行操作
      • BOM:对浏览器进行操作

    JS的变量

    怎样定义变量?

    Example : var a = 10;

    • var :类型修饰符
    • a :变量名,需要符合命名规范
    • = :赋值运算符
    • 10 :初始值
    • ; :代表一条语句的结束
      给变量重新赋值时,不需要再加var

    变量名的命名规范

    • 以数字,字母,下划线,$组成,不能以数字开头,尽量保证见名知意
    • 以驼峰结构命名 personName
    • 不能使用系统关键字

    JS的基础变量类型

    JS是弱类型编程语言

    Q:怎样判断数字类型?
    
    A:使用"typeof(变量名);"
    可以写"alert(typeof(变量名));"使用提示框显示,也可以写"console.log(变量名);"使用控制台显示。
    

    数字类型 number

    Example : var a = 10;

    Example : var b = 3.1415;

    JS中没有浮点类型 带小数点的也是number

    字符串类型 string

    Example : var str = "abc"

    字符串拼接

    var str1 = "五一";
    var str2 = "节后综合征";
    var str3 = str1 + str2;
    

    隐式类型转换

    var str5 = "10" + 10;
    console.log(str5);
    

    结果是1010

    布尔值类型 boolean

    Example : var flag = true;

    Example : var flag = false;

    布尔值只有两个值 真和假

    未定义类型 undefined

    Example : var c;

    空类型 null

    一般对象赋初值时候使用

    JS的运算符

    算术运算符

    通常运算符

    + - * / %
    

    取余 % Example : var m = 10 % 3;

    第一组特殊运算符

    ++ --
    

    n++; n--;

    var n = 3;
    var x = n++;
    此时得出的结果是x = 3,n = 4;
    先返回再自加;
    
    var y = ++n;
    此时得出的结果是y = 4,n = 4;
    先自加再返回;
    
    但是当++n和n++单独作为一条语句出现时,因为返回值没有任何变量去接受,所以n++和++n是一样的;
    

    第二组特殊运算符

    += -= *= /=
    

    n += 2; 相当于 n = n + 2;

    逻辑运算符

    与运算

    与运算 &&
    只有当运算符左右两边同为真时,与运算才为真,其余都为假;
    console.log (x && y); 
    console.log (x && y && z);
    console.log (x && z);
    

    或运算

    或运算 ||
    当运算符左右两边有一边为真时,或运算即为真;
    console.log (x || y); 
    console.log (x || y || z);
    console.log (x || z);
    

    非运算

    非运算 !
    非运算为给!后的变量/式子取反
    console.log (!x);
    
    给本身取反:
    x = !x;
    

    比较运算符

    第一组比较运算符

    > < >= <= !=
    

    第二组比较运算符

    == === 
    
    == 判断的是数值相等
    var x = "10" == 10;
    这条语句返回的是true;
    
    === 判断的是数值和类型都相等
    var x = "10" === 10;
    这条语句返回的是false;
    

    JS的逻辑结构

    请问我不写了可以吗

    分支结构

    您好 if..else可以不写的

    三元表达式

    也叫三目运算符,看个例子然后if变问号else变冒号就完事了

    当a > b时,c = a,否则c = b;
    var c = a > b ? a : b;
    

    循环结构

    您好 while do...while 和for循环也可以不写的

    文档写入

    这个东西是往body里添加东西用的
    document.write("123");//加字
    document.write("<div></div>");//加标签
    document.write("<div class='name'></div>");//加带class的标签
    

    Math对象

    就是math函数

    π

    console.log(Math.PI);
    

    max

    var max = Math.max(10,20,30,1000);
    console.log(max);
    

    min

    var min = Math.min(10,20,30,1000);
    console.log(min);
    

    向上取整

    console.log(Math.ceil(1.1));//2
    console.log(Math.ceil(-1.1));//-1
    console.log(Math.ceil(1.9));//2
    

    向下取整

    console.log(Math.floor(1.1));//1
    console.log(Math.floor(-1.1));//-2
    console.log(Math.floor(1.9));//1
    

    四舍五入

    console.log(Math.round(3.1));//3
    console.log(Math.round(3.5));//4
    

    取绝对值

    console.log(Math.abs(-100));
    

    次幂

    console.log(Math.pow(5,2));
    

    开方

    console.log(Math.sqrt(81));
    

    随机数

    取值范围是[0,1)

    console.log(Math.random());
    
    公式:Math.floor(Math.random() * (max - min + 1) + min));
    
    随机66到99的数
    console.log(Math.floor(Math.random() * (99 - 66 + 1) + 66)); 
    
    这样吧写个11选5今天中午就买这注
    for (var i = 0; i < 5; i++) {
        console.log(Math.floor(Math.random() * (10 - 1 + 1) + 1)); 
    }
    但是这样就没写重复判断 回头再改
    

    数组

    数组的创建

    创建空数组

    这是个一般不用的方法:
    var arr = new Array();
    
    这是个最常用的方法:字面量
    var arr = [];
    

    创建有内容的数组

    这是个一般不用的方法:
    var arr = new Array(1,2,3);
    
    这是个最常用的方法:
    var arr = ["zaima?","buzai"]
    

    创建长度为n的空数组

    n是个数字
    var arr = new Array(n);
    

    数组中的元素赋值和取值

    用下标
    arr[1],arr[2],arr[3]......
    
    当定义一个长度为10的数组时,
    arr[100] = "111";//给下标100的元素赋值
    这时typeof(arr[99]) = undefined.
    

    数组的长度

    arr.length
    只能获取,不能设置,可以改变
    
    怎样使用数组的长度向数组末尾添加元素?
    arr[arr.length] = 777;
    

    数组的遍历

    使用for循环,循环终止的条件是i < 数组的长度
    
    var arr = [111,222,333,444,555,666];
    for (var i = 0; i < arr.length; i++) {
               console.log(arr[i]);
    }
    

    数组相关练习

    求数组中所有元素的和

    var arr = [555,666,777,888,999];
    var sum = 0;
    for (var i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
    }
    console.log(sum);
    

    随机十个数放进数组中

    这里随机的是取值范围66-99的十个数
    
    var arr = [];
    for (var i = 0; i < 10; i++) {
        num = Math.floor(Math.random()*(99 - 66 + 1) + 66);
        arr.push(num);  //向数组末尾添加一个元素
    }
    console.log(arr);
    

    随机十个偶数放进数组中

    这里随机的是取值范围66-99的十个偶数
    
    1.使用while循环的做法
    (因为不知道循环多少次才能生成十个偶数)
    
        var arr = [];
        while (arr3.length != 10) {
            num = Math.floor(Math.random()*(99 - 66 + 1) + 66);
            if (num % 2 == 0) {
                arr.push(num);
            }
        }
        console.log(arr);
    
    2.使用for循环的做法
    (当生成的数不是偶数时,i--退回上一个)
    
        var arr = [];
        for (var i = 0; i < 10; i++) {
            num = Math.floor(Math.random()*(99 - 66 + 1) + 66);
            if (num % 2 == 0) {
                arr.push(num);
            } else {
                i--;
            }
        }
    

    打印数组中最小的数和它的下标

    var arr = [90,88,40,11,8];
    var min = arr[1];
    var index = 1;
    for (var i = 0; i < arr.length; i++) {
        if (arr4[i] < min) {
            index = i;
            min = arr4[i];
        }
    }
    console.log(min,index);
    

    打印十个不重复的随机数

    这个这个 非常重要
    是限(xie)时(bu)的(wan)代码

    var arr = [];
    while (arr.length < 10) {
        var num = Math.floor(Math.random() * 10);
        var flag = true;
        for (var i = 0;i < arr.length;i++) {
            // 如果随机数和数组中元素相等,不用继续比较 直接跳出循环
            if (num == arr[i]) {
                flag = false;
                break;
            }
        }
        if (flag) {
            arr.push(num);
        }
    }
    console.log(arr);
    

    二维数组

    就是arr[i][j]嘛
    
    //打印arr里的数
    
    var a = [1,2,3];
    var b = [4,5,6,7];
    var c = [666,888,999];
    var arr = [a,b,c];
    for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < arr[i].length; j++) {
            console.log(arr[i][j]);
        }
    }
    

    数组的方法

    Example:
    var arr = ["mini","甲壳虫","凯迪拉克","雷克萨斯","奥迪","JEEP"];

    在末尾添加数据

    Example:arr.push("宝马");

    在开头添加数据

    Example:arr.unshift("霸道");

    删除并返回数组中最后一个元素

    Example:arr.pop();

    当pop对空数组进行操作时,不会对数组造成影响 返回值为undefined
    
    var car = arr.pop();//接受删除的元素
    console.log(car);
    

    删除并返回数组中第一个元素

    Example:arr.shift();

    删除元素

    Example:arr.splice(2,3);
    splice(n,m) 从下标n开始删除m个

    也可以在删除的位置添加元素
    这么写:
    arr.splice(2,3,"雪铁龙","捷达");
    

    连接数组

    Example:arrD = arrA.concat(arrB,arrC);

    var arrA = [1,2,3];
    var arrB = [4,5,6];
    var arrC = [7,8,9];
    
    var arrD = arrA.concat(arrB);
    arrD = arrA.concat(1000);
    arrD = arrA.concat(arrB,arrC);
    console.log(arrD);
    console.log(arrA,arrB);
    

    数组转换字符串

    Example:var str = arr.join();

    join的括号里写什么 字符串就是用什么连接
    
    var arr = ["111","222","333","444"];
    var str = arr.join();
    console.log(str);
    

    获取元素下标

    Example: var num = arr.indexOf("a");

    indexOf用来获取元素下标
    如果数组中括号内的元素不存在,则返回-1
    
    var arr = ["a","b","c","d"];
    var num = arr.indexOf("a");
    console.log(num);
    

    冒泡排序

    这个这个 也非常重要
    是限(xie)时(bu)的(wan)代码

    var a = 0;
    for (var i = 0; i < arr.length - 1; i++) {
        for (var j = 0;j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                a = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = a;
            }
        }
    }
    console.log(arr);
    

    删除数组中重复的数

    var a = [5,7,6,8,7,9,6,5];
    for (var i = 0; i < a.length; i++) {
        for (var j = i + 1; j < a.length; j++) {
            if (a[j] == a[i]) {
                a.splice(j,1);
                j--;
            }
        }
    }
    console.log(a);
    

    定时器

    普通定时器

    var oBtn = document.getElementById("btn");
    var timer = null;
    var flag = true;
    
    oBtn.onclick = function () {
        var count = 0;
        if (flag) {
            timer = setInterval(function () {
            count++;
            console.log(count);
            }, 400)
        } else {
            // 清除定时器
            clearInterval(timer);
        }
        flag = !flag;
    }
    

    延时定时器

    timer = setTimeout(function () {
        console.log("5");
    },5000);   
    //清定时器
    clearTimeout(timer);
    

    函数

    无参无返回值的函数

    var oDiv1 = document.getElementById("div1");
    
    oDiv1.onclick = function () { 
        getSum();
    }
    
    //这是无参无返回值的函数getSum:
    function getSum () { 
        var sum = 0;
        for (var i = 1; i <= 100; i++) {
            sum = sum + i;  
        }
        console.log(sum);
    }
    

    有参无返回的函数

    什么是形式参数和实际参数?

    形式参数:
    在函数定义时,写在括号内用来代表传入参数的占位的参数,叫做形式参数

    Example: a,b即为形式参数
    function sum (a,b) {
            ...
    }
    

    实际参数:
    在函数调用时,真正传给函数内部的值叫做实际参数

    Example: 10,20即为实际参数
    sum(10,20);
    

    注意:当形参没有被传实参时,它的类型是undefined

    例子

    function add (num1,num2) { 
        var sum = 0;
        sum = num1 + num2;
        console.log(sum);
    }
    add(10,20);
    

    有参有返回值的函数

    什么是返回值?

    一个函数的函数名即是该函数的代表,也是一个变量。
    由于函数名变量通常用来把函数的处理结果数据带回给调用函数,即递归调用,所以一般把函数名变量称为返回值。

    例子

    实现函数:
    随机-10 到10之间的数 如果是正数返回随机数的平方
    如果是负数,返回随机数的绝对值 如果是0 什么执行return;
        
    function getRandomNum1(min, max) {
    var num = Math.floor(Math.random() * (max - min + 1) + min);
        if (num > 0) {
            console.log(num);
            return Math.pow(num,2);
        } else if (num < 0){
            console.log(num);
            return - num;
        } else {
            //当函数没有返回值时调用后返回值类型是undefined
            console.log(num);
            return;
        }
    }
    
    var a = getRandomNum1(-10,10);
    console.log(a);
    

    JS的作用域

    回调函数

    就是函数里面调用函数?
    大概是这个意思
    看个例子就明白了

    function abc(callBack) {  
        console.log("11");
        callBack();
        console.log("22");
    }
    
    var a = function () {  
        console.log("!!!!!!");
    }
        // abc(a);
        console.log(a);
        console.log(abc);
        console.log(a());
    

    作用域

    作用域有两种
    函数级作用域,块级作用域
    
    变量也可以设置全局变量和局部变量
    和以前学的一样
    

    this的应用

    this 指的是当前的选择
    可以是当前的点击,也可以是当前的鼠标移入移出
    

    自定义属性

    自定义一个对象的属性,等于什么都可以
    常用于获取对象下标(?)
    

    鼠标移入移出

    可以用来写hover效果(?)能用css做的为什么我要用js做 迷惑.jpg

    oDiv1.onmouseover = function () {  
        oDiv1.style.backgroundColor = "green";
        console.log("鼠标移入");
    }
    oDiv1.onmouseout = function () {  
        oDiv1.style.backgroundColor = "";
        console.log("鼠标移出");
    }
    

    时间对象

    获取当前时间

    var date = new Date();
    console.log(date);
    

    格式化时间

    console.log(date.toLocaleString());
    console.log(date.toLocaleDateString());
    console.log(date.toLocaleTimeString());
    

    获取年月日星期小时分钟秒

    获取年

    var year = date.getFullYear();
    console.log(year);
    

    获取月

    注意:月份要 + 1,因为月份的取值范围为0-11;
    
    var month = date.getMonth() + 1;
    console.log(month);
    

    获取日

    var theDate = date.getDate();
    console.log(theDate);
    

    获取星期几

    注意:周日的值是0;
    
    var day = date.getDay();
    console.log(day);
    

    获取小时

    var hour = date.getHours();
    console.log(hour);
    

    获取分钟

    var minute = date.getMinutes();
    console.log(minute);
    

    获取秒

    var seconds = date.getSeconds();
    console.log(seconds);
    

    时间戳

    时间戳:1970到现在的毫秒数.

    获取当前时间戳

    var times = date.getTime();
    console.log(times);
    

    时间戳转化时间对象

    var date1 = new Date(1557888889390);
    console.log(date1);
    

    固定时间转化

    var date2 = new Date("2017-06-22");//从八点开始
    var date3 = new Date("2017/06/22");//从零点开始
    var date4 = new Date("2017-06-22 12:05:09");
    var date5 = new Date(2017,06,22,00,05,10);
    
    console.log(date2);
    console.log(date3);
    console.log(date4);
    console.log(date5);
    

    字符串方法

    首先定义一个字符串:
    var str = "改革春风吹满地";

    获取某个下标对应的字符

    console.log(str.charAt(2));
    
    console.log(str.indexOf("风"));//取"风"字对应的下标
    console.log(str.indexOf("中"));//没有这个字的话返回-1
    

    遍历字符串

    for (var i = 0; i < str.length; i++) {
        console.log(str.charAt(i));
    }
    

    截取字符串

    console.log(str.substring(2));//从下标2开始截取 截到最后
    console.log(str.substring(2,3));//下标2开始截取 截到下标3
    

    分离字符串

    var str1 = "Play hard Study hard";

    var str1Arr = str1.split(" ");
    console.log(str1Arr);//使用空格分离
    
    console.log(str1Arr.join("hard"));//使用hard作为分隔
    

    拼接字符串

    var str2 = "111";
    var str3 = "222";

    var newStr = str2.concat(str3);
    console.log(newStr);
    

    大小写转换

    var str4 = "long time no see";

    var str5 = str4.toUpperCase();
    var str6 = str5.toLowerCase();
    console.log(str5);
    console.log(str6);
    

    offsetLeft & offsetTop & offsetWidth

    var oAll = document.getElementById("all");
    console.log("offsetLeft:" + oAll.offsetLeft);
    //offsetleft相对于定位父级左侧的距离
    //无定位时相对于浏览器左侧
    console.log(oAll.offsetTop);
    
    //padding + border + width
    console.log(oAll.offsetWidth);
    

    获取CSS样式

    获取行间样式

    console.log(oAll.style.width);
    

    获取外部引入/内部引入

    function getStyle(obj,attr) {  
    //因为除了ie别的这个oAll.currentStyle都没有值 所以用这个来判断
        if (obj.currentStyle) {
            //在ie里只能用这个来获取样式
            //正常的方法获取不着
            //浏览十小时 八小时不兼容
            return obj.currentStyle[attr];
        } else {
            return getComputedStyle(obj)[attr];
        }
    }
    

    函数自调用

    function abc() {  
        console.log(1);
    }
    console.log(abc);
    abc();
            
    //代码执行到函数定义后 马上调用此函数
    //常用在闭包和js的外部引入
    //只执行一次
    (function () {  
        console.log(1);
    })();
    

    限时代码:匀速运动

    div {
         100px;
        height: 100px;
        background: pink;
        margin-bottom: 10px;
        }
    
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    
    <script>
        var oDivs = document.getElementsByTagName("div");
    
        for (var i = 0;i < oDivs.length;i++) {
            oDivs[i].onmouseover = function () {
                linear(this, "width", 500, 10);
                }
            oDivs[i].onmouseout = function () {
                linear(this, "width", 100, 10);
            }
        }
    
        function linear(obj, attr, des, speed) {
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                var theWidth = getStyle(obj, attr);
                var a = des - parseFloat(theWidth);
                if (Math.abs(a) > speed) {
                    if (a > 0) {
                        obj.style[attr] = parseFloat(theWidth) + speed + "px";
                    } else {
                        obj.style[attr] = parseFloat(theWidth) - speed + "px";
                    }
                } else {
                    obj.style[attr] = des + "px";
                    clearInterval(obj.timer);
                }
            })
        }
    
        function getStyle(obj, attr) {
            if (obj.currentStyle) {
                return obj.currentStyle[attr];
            } else {
                return getComputedStyle(obj)[attr];
            }
        }
    </script>
    

    获取DOM节点

    .name {
         100px;
        height: 100px;
        background-color: red;
        margin-bottom: 10px;
    }
    
    <div id="all">
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
        <div>5</div>
    </div>
    
    var oAll = document.getElementById("all");
    var oDivs = oAll.getElementsByTagName("div");  
    

    获取子节点

    只能取亲儿子(儿子辈 孙子辈不行)

    console.log(oAll.children);
    

    创建新元素

    var newDiv = document.createElement("div");
    newDiv.innerHTML = "...我点子怎么这么正";
    newDiv.className = "name";//加类名
    

    在某标签末尾添加元素

    oAll.appendChild(newDiv);
    

    在指定位置添加元素

    var newP = document.createElement("p");
    newP.innerHTML = "消防演习";
    //在b之前插入a
    //insertbefore(新元素a,元素b)
    oAll.insertBefore(newP,oAll.children[5]);
    

    删除元素

    //父标签.removeChildren(子标签)                         
    
    oAll.removeChild(newImg);
    或newImg.remove();   
    

    替换元素

    //父标签.replaceChild(新标签 ,子标签)
    
    var newA = document.createElement("a");
    newA.href = "#";
    newA.innerHTML = "超链接";
    oAll.replaceChild(newA,oAll.children[0]);
    

    获取父节点

    var theParent = newP.parentNode;
    theParent.style.border = "1px solid red"; 
    
  • 相关阅读:
    使用babel插件集
    使用babel
    webpack基本配置
    vue-router参数传递
    路由(二) router-link的使用
    路由使用(一)
    获取DOM
    父组件传递值给子组件(一)
    定义全局组件
    Windows下更改MySQL数据库的存储位置
  • 原文地址:https://www.cnblogs.com/lzb1234/p/10812668.html
Copyright © 2020-2023  润新知