JS基础

Author Avatar
NENEIIII Nov 24, 2022
  • Read this article on other devices

基础部分

写在哪

行内

<input type="button" value="点我点我" onclick="alert('千古壹号 Hello 方式1')" />

内联

<script type="text/javascript">
            // 在这里写 js 代码
            alert('千古壹号 hello 方式2');
            console.log('qianguyihao hello 方式2');
        </script>

.js文件中

<body>
        <!-- 外链式:引入外部的 js 文件:这个 utils.js 文件与当前的 html 文件,处于同一级目录 -->
        <script src="utils.js"></script>
    </body>

区分大小写

输出

弹窗

<script>
            alert('加载网页时显示');
            var a = prompt("供用户输入用,多用于测试");
            var res = confirm("用户需要点击确认或取消"); //返回true或false
        </script>

输出至网页里

document.write("HTML");

输出至控制台

console.log();

变量

var 变量名;

let 变量名;

常量

const 常量名 = 取值;

代码块{}只用来分组 在外部仍可访问内部变量

流程控制语句有if 有switch 有for 有while

面向对象

==首先明确JS中的类型都可以看作是对象==【除基本数据类型(值类型):String 字符串、Number 数值、Boolean 布尔值、Null 空值、Undefined 未定义】

var person = {};

person.name = '王二';
person.age = 35;
person.sex = '男';
person.height = '180';

创建对象

 var obj = new Object();
    obj.sayName = function () {
        console.log('smyhvae');
    };
 //创建对象 obj1
    var obj1 = new Object();
    obj1.test = undefined;

    //创建对象 obj2
    var obj2 = new Object();
    obj2.name = "smyhvae";

    //将整个 obj2 对象,设置为 obj1 的属性
    obj1.test = obj2;

内置对象

除上面创建的自定义对象,还有内置对象和浏览器对象

内置对象 对象说明
Arguments 函数参数集合
Array 数组
Boolean 布尔对象
Math 数学对象
Date 日期时间
Error 异常对象
Function 函数构造器
Number 数值对象
Object 基础对象
RegExp 正则表达式对象
String 字符串对象

常用方法

==注意对字符串的修改都不是原地修改 会返回修改值==

indexOf()/lastIndexOf():获取字符串中指定内容的索引

search():获取字符串中指定内容的索引

includes():字符串中是否包含指定的内容

startsWith():字符串是否以指定的内容开头

endsWith():字符串是否以指定的内容结尾

这里的 str.charAt(index)str[index]的效果是一样的

新字符串 = str.slice(开始索引, 结束索引); //两个参数都是索引值。包左不包右。
新字符串 = str.substring(开始索引, 结束索引); 
字符串 = str.substr(开始索引, 截取的长度);

trim():去除字符串前后的空白。

字符串的方法估计不同语言有通用的 反正用到再查

html 方法-用到查

  • anchor() 创建 a 链接
  • big()
  • sub()
  • sup()
  • link()
  • bold()

Date对象

不传参返回当前时间对象

var date1 = new Date();
console.log(date1);
//Fri Nov 25 2022 14:11:11 GMT+0800 (中国标准时间)

传参的情况

举例1:(参数是字符串)

const date11 = new Date('2020/02/17 21:00:00');
console.log(date11); // Mon Feb 17 2020 21:00:00 GMT+0800 (中国标准时间)

const date12 = new Date('2020/04/19'); // 返回的就是四月
console.log(date12); // Sun Apr 19 2020 00:00:00 GMT+0800 (中国标准时间)

const date13 = new Date('2020-05-20');
console.log(date13); // Wed May 20 2020 08:00:00 GMT+0800 (中国标准时间)

const date14 = new Date('Wed Jan 27 2017 12:00:00 GMT+0800 (中国标准时间)');
console.log(date14); // Fri Jan 27 2017 12:00:00 GMT+0800 (中国标准时间)

举例2:(参数是多个数字)

const date21 = new Date(2020, 2, 18); // 注意,第二个参数返回的是三月,不是二月
console.log(date21); // Wed Mar 18 2020 00:00:00 GMT+0800 (中国标准时间)

const date22 = new Date(2020, 3, 18, 22, 59, 58);
console.log(date22); // Sat Apr 18 2020 22:59:58 GMT+0800 (中国标准时间)

const params = [2020, 06, 12, 16, 20, 59];
const date23 = new Date(...params);
console.log(date23); // Sun Jul 12 2020 16:20:59 GMT+0800 (中国标准时间)

举例3:(参数是时间戳)

const date31 = new Date(1591950413388);
console.log(date31); // Fri Jun 12 2020 16:26:53 GMT+0800 (中国标准时间)

// 先把时间对象转换成时间戳,然后把时间戳转换成时间对象
const timestamp = new Date().getTime();
const date32 = new Date(timestamp);
console.log(date32); // Fri Jun 12 2020 16:28:21 GMT+0800 (中国标准时间)

日期格式化(用到自己查)

format():将时间对象转换为指定格式。

参考链接

获取时间戳

// 方式一:获取 Date 对象的时间戳(最常用的写法)
const timestamp1 = +new Date();
console.log(timestamp1); // 打印结果举例:1589448165370

// 方式二:获取 Date 对象的时间戳(较常用的写法)
const timestamp2 = new Date().getTime();
console.log(timestamp2); // 打印结果举例:1589448165370

// 方式三:获取 Date 对象的时间戳
const timestamp3 = new Date().valueOf();
console.log(timestamp3); // 打印结果举例:1589448165370

// 方式4:获取 Date 对象的时间戳
const timestamp4 = new Date() * 1;
console.log(timestamp4); // 打印结果举例:1589448165370

// 方式5:获取 Date 对象的时间戳
const timestamp5 = Number(new Date());
console.log(timestamp5); // 打印结果举例:1589448165370

上面这五种写法都可以获取任意 Date 对象的时间戳,最常见的写法是方式一,其次是方式二。

根据前面所讲的关于「时间戳」的概念,上方代码获取到的时间戳指的是:从 1970年1月1日,0时0分0秒 到现在所花费的总毫秒数。

倒计时写法

<style>
    .countdown{
            width: 1210px;
                margin: 200px auto;
                color: red;
                text-align: center;
                font: 600 30px/30px 'simsun';
        }
</style>    
<div id="cd" class="countdown"></div>
            <!-- 设置倒计时 -->
            <!-- 设置一个定时器,每间隔1毫秒就自动刷新一次div的内容 -->
            <!-- 核心算法:输入的时间戳减去当前的时间戳,就是剩余时间(即倒计时),然后转换成时分秒 -->
            <script>
                var div = document.getElementById("cd");

                var timer = setInterval(() => {
                    countDown('2022/11/25 21:00:00');
                }, 1);

                function countDown(myTime) {
                    var nowTime = new Date();
                    var future = new Date(myTime);
                    var timeSum = future.getTime() - nowTime.getTime(); //获取时间差:发布会时间减去此刻的毫秒值

                    var day = parseInt(timeSum / 1000 / 60 / 60 / 24); // 天
                    var hour = parseInt((timeSum / 1000 / 60 / 60) % 24); // 时
                    var minu = parseInt((timeSum / 1000 / 60) % 60); // 分
                    var sec = parseInt((timeSum / 1000) % 60); // 秒
                    var millsec = parseInt(timeSum % 1000); // 毫秒

                    //细节处理:所有的时间小于10的时候,在前面自动补0,毫秒值要补双0(比如如,把 8 秒改成 08 秒)
                    day = day < 10 ? '0' + day : day; //day小于10吗?如果小于,就补0;如果不小于,就是day本身
                    hour = hour < 10 ? '0' + hour : hour;
                    minu = minu < 10 ? '0' + minu : minu;
                    sec = sec < 10 ? '0' + sec : sec;
                    if (millsec < 10) {
                        millsec = '00' + millsec;
                    } else if (millsec < 100) {
                        millsec = '0' + millsec;
                    }

                    // 兜底处理
                    if (timeSum < 0) {
                        div.innerHTML = '距离下班还有00天00小时00分00秒000毫秒';
                        clearInterval(timer);
                        return;
                    }

                    // 前端要显示的文案
                    div.innerHTML = '距离下班还有' + day + '天' + hour + '小时' + minu + '分' + sec + '秒' + millsec + '毫秒';
                }
            </script>

Moment.js

Moment.js 是一个轻量级的JavaScript时间库,我们可以利用它很方便地进行时间操作,提升开发效率。

函数

定义

function 函数名([形参1,形参2...形参N]){  // 备注:语法中的中括号,表示“可选”
    // 函数体语句
}
const 变量名  = function([形参1,形参2...形参N]){
    语句....
}

调用

// 写法1(最常用)
函数名();

// 写法2
函数名.call();
var obj = {
    a: 'qianguyihao',
    fn2: function() {
        console.log('小奶包包,穿越自由!');
    },
};

obj.fn2(); // 调用函数

立即执行

(function() {
    console.log('我是立即执行函数');
})();

fn() 和 fn 的区别【重要】

  • fn():调用函数。调用之后,还获取了函数的返回值。
  • fn:函数对象。相当于直接获取了整个函数对象。

拷贝

// 语法1
obj2 = Object.assgin(obj2, obj1);

// 语法2
Object.assign(目标对象, 源对象1, 源对象2...);

将 obj1 的值追加到 obj2 中。如果对象里的属性名相同,会被覆盖。

正则表达式

//判断是否为手机号
var phoneStr = "13067890123";

    var phoneReg = /^1[3-9][0-9]{9}$/;

    console.log(phoneReg.test(phoneStr));
    str = str.replace(/^\s*/, ""); //去除开头的空格

    str = str.replace(/\s*$/, ""); //去除结尾的空格
// 是否为电子邮件
var emailReg = /^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;

    var email = "abchello@163.com";

    console.log(emailReg.test(email));

DOM操作

获取元素

document.getElementById("box1");//用这个
document.getElementsByTagName("div")[0];
document.getElementsByClassName("hehe")[0];

操作元素

新增
var para = document.createElement("p");
var node = document.createTextNode("这是新段落");
para.appendChild(node);
var ele = document.getElementById("div1");
ele.appendChild(para);
删除
var parent = document.getElementById("div1");
var child = document.getElementById("p1");
parent.removeChild(child);

改变HTML

document.write(Date());//直接向HYML输出流写内容 不好用,不能定位到元素里面
document.getElementById(id).innerHTML = "<h1>一段新的html</h1>";
document.getElementById(id).attribute = "新值";

改变CSS

<button type="button" onclick="document.getElementById(id).style.color = 'red'">
    单机这里
</button>

绑定事件

常见的事件如下:

img

<script type="text/javascript">
    var div1 = document.getElementById("box1");
    //绑定事件的第一种方式
    div1.onclick = function () {
        alert("我是弹出的内容");
    }
</script>
var div1 = document.getElementById("box1");
    //绑定事件的第二种方式
    div1.onclick = fn;   //注意,这里是fn,不是fn()。fn()指的是返回值。
    //单独定义函数
    function fn() {
        alert("我是弹出的内容");
    }
<div id="box1" onclick="fn()"></div>

onload&unonload

当页面加载(文本和图片)完毕的时候,触发onload事件。

有一点我们要知道:js的加载是和html同步加载的。因此,如果使用元素在定义元素之前,容易报错。这个时候,onload事件就能派上用场了,我们可以把使用元素的代码放在onload里,就能保证这段代码是最后执行。

定时器

  • setInterval():循环调用。将一段代码,每隔一段时间执行一次。(循环执行)
  • setTimeout():延时调用。将一段代码,等待一段时间之后再执行。(只执行一次)

jQuery

JS的一个库(框架),利用==CSS选择器==访问DOM对象,简化DOM操作

引包

<head>
    <script src="jquery.js"></script> <!--本地下载放到相同目录下-->
    <!--利用CDN-->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
</head>

microsoft提供的CDN

插件

注意引包时要在jq的下面

<script src="jquery-1.11.1.js"></script>
    <!--懒加载的使用。第一步:导包(必须在jquery库的下方)-->
    <script src="jquery.lazyload.js"></script>

语法

$(选择器).action()

$(this).hide() //隐藏当前元素
$("p").hide() //隐藏所有段落
$(".test").hide() //隐藏所有class="test"的元素
$("#test").hide() //隐藏所有id="test"的元素

jQuery选择器

img

去看之前的CSS选择器章节

常见事件

  • click(handler) 单击事件。
  • blur(handler) 失去焦点事件。
  • mouseenter(handler) 鼠标进入事件。
  • mouseleave(handler) 鼠标离开事件。
  • dbclick(handler) 双击事件。
  • change(handler) 改变事件,如:文本框值改变,下拉列表值改变等。
  • focus(handler) 获得焦点事件。
  • keydown(handler) 键盘按下事件

获取|获取内容

text(); 设置或返回所选元素的文本内容

html(); 设置或返回所选元素的内容(包含html标记)

val(); 设置或返回表单元素的值

$("#btn1").click(function(){
    alert("Text:" + $("#text1").text());
});
$("#btn1").click(function(){
    alert("Text:" + $("#text1").html("<b>Hello world!</b>"));
});

遍历

自己查




常见模板

鼠标悬停 弹出下拉菜单

鼠标悬停变色

突出显示

手风琴效果

ES6新增

箭头函数

(参数1, 参数2 ...) => { 函数体 }

写法 1、定义和调用函数:(传统写法)

function fn1(a, b) {
    console.log('haha');
    return a + b;
}

console.log(fn1(1, 2)); //输出结果:3

写法 2、定义和调用函数:(ES6 中的写法)

const fn2 = (a, b) => {
    console.log('haha');
    return a + b;
};

console.log(fn2(1, 2)); //输出结果:3