华清远见重庆中心-阶段总结/学习心得分享/javascript技术总结

本文介绍了JavaScript的基础知识,包括其与Java的区别、作用、安装方式以及如何在HTML中使用。详细讲解了变量、常量、运算符、控制结构、数组操作、函数、作用域、内存管理等核心概念。此外,还探讨了JavaScript在网页动态交互、DOM操作、事件处理等方面的应用,并涉及了防抖和节流等优化技巧。
摘要由CSDN通过智能技术生成

笔记

1.javascript
java:类似java计算机编程语言,script:脚本,类似java计算机编程语言的脚本语言缩写为js
2.java和javascript的区别
java静态编译,js作为脚本动态编译。java是强类型语言,js是弱类型语言。
3. javascript 的作用
提供了一个和htm1进行动态交互的功能
4. javascript安装
js运行只需要一个js运行环境即可,那么最常见的js运行环境是浏览器,所以只需要安装浏览器即可。
5. javascript使用
在浏览器控制台上直接运行js语言片段。在html文件的script标签中。使用.js文件书写js代码,然后再html中通过script标签引入代码。
6.
script 标签写在body后面
若有多个script,那么从上而下依序执行。
在同一个script标签中,js的执行顺序以一句话为单位,基本顺序:从上到下,从左到右,每句话用分号隔开“;”。
若代码中每一行只有一句js,那么句尾的分号可以省略。
7.console.log( ‘hello world’ )
console.log 打印日志到控制台
8.
使用script 标签引入外部js文件。src是文件路径|。
9.let a = 3
赋值运算的顺序:先执行赋值符右侧代码,再赋值给左侧。
let声明变量和使用变量的方法和var没有区别。
10.var b = 5
变量,变量就是存储数据的容器。
变量是一个可以变化的量,数据可以发生变化。
同时声明多个变量并赋子初始值,var c, d = 10, e;
修改变量,变量在存储新值之前将完全弃用原来的值。
还可以使用let来声明变量。
let变量不能重复定义,var变量可以重复定义。
11.const g = 10
常量,恒定不变的值为常量,声明时必须赋初始值且声明后无法修改。
12.debugger
debugger 的作用:可以给代码加断点,程序运行到断点处,会停下来,开发人员可以查看
13.js中预留了一些代表特殊含义的英文单词,这些单词我们称为关键字。
14. 查询一个指定选择器的元素
let box = document.querySelector(‘.box’)
15.查询所有指定选择器的元素
let boxs = document.querySelectorAll(‘.box’
16.通过id查询元素
box = document.getElementById(‘myBox’)
17.通过类名查询元素
boxs = document.getElementsByClassName(‘box’)
18.通过标签名查询元素
boxs = document.getElementsByTagName(‘div’)
19.修改属性值
console.log(box.id);
20.改id
box.id = ‘my-box’
21.改样式
box.style.color = ‘#00f’
22.改class名称
box.className = ‘box myClass’
23.textContent 修改和读取标签体里的文本内容
box.textContent = ‘<div style="background-color: #00f;">ok</div>
24.innerText 修改和读取标签体里的文本内容
box.innerText = ‘<div style="background-color: #00f;">ok</div>
25.innerHTML 修改和读取标签体里的html内容
box.innerHTML = ‘<div style="background-color: #00f;">ok</div>
26.模态弹窗
alert(‘hello alert’)
27.确认对话框
confirm(‘你确定吗?’)
28.弹窗输入框
prompt(‘请输入姓名’)
29.if 语句:用于进行条件判断的语句
if(bool expression) {
code block 代码块
}
作用:当布尔表达式值为真时,执行后面的代码块
30.三元运算符替代 if else
user.score >= 60 ? ‘及格’ : ‘不及格’
if (user.score >= 60) {
console.log(‘及格’);
} else {
console.log(‘不及格’);
}
31.大于
(1 > 2);
小于
(1 < 2);
大于等于 小于等于
(3 >= 3)
(3 <= 3)
32.== 非严格相等判断
非严格相等判断 在运算符左右两边不需要使用相同的数据类型
当数据类型不同时 == 运算符将自动进行隐式转换
(a == b)
=== 严格相等
类型和值都相等才会被认为相等
(x == y)
33.赋值运算符
let a = 1

// += 自增
a += 2 // 等价于 a = a + 2
console.log(a);

// -= 自减
a -= 5 // 等价于 a = a - 5
console.log(a);

// *= 自乘
a *= -1
console.log(a);

// /= 自除
a /= 2
console.log(a);

// %= 自模
a = 5
a %= 3 // 等价于 a = a % 3
console.log(a);

34.// && 与
// 语法:bool expression && bool expression
// 两个表达式都为真,结果返回真;任一一个表达式为假,结果返回假
// 例如:
console.log(true && true);
console.log(false && true);
// || 或
// 语法:bool expression || bool expression
// 两个表达式任一一个为真,结果返回真;否则为假
console.log(true || true);
console.log(false || true);
35.// 什么是多维数组?
// 多维数组:多个维度(rank)组成的数组

let arr = [1, 2, 3]

// 声明二维数组
// 二维数组中每个一维数组的成员都是一个数组
arr = [[1, 2], [3, 4], [5, 6]]

读取数组
// 可以将二维数组视为一个x轴和y轴构成的二维平面,所以任意值都可以由x,y坐标来表示
console.log(arr[0][1]);
console.log(arr[2][0]);

// 声明多维数组
// 多维数组是数组内嵌套多层数组的数组
arr = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]

// 访问数组
// 可以理解成三维空间中访问一个三维坐标系
console.log(arr[0][1][1]);

36.let a = [1, 2]
let b = ‘hello world’

// Array.isArray 方法检测变量是否为数组
// 是数组的话返回 true 否则为 false

console.log(Array.isArray(a));
console.log(Array.isArray(b));

37.// 数组的操作

let arr = [1, 2, true, { name: 'Amy' }, 2]

// push 追加数据到数组末尾
// 参数:被添加的新数组成员
arr.push('hello world')
console.log(arr);


// pop 从尾部取出一个成员
// 返回值是取出的成员
let r = arr.pop()
console.log(r);
console.log(arr);

// unshift 在头部添加数据
// 参数:被添加的新数组成员
arr.unshift('my best day')
console.log(arr);


// shift 从头部取出一个成员
// 返回值是取出的成员
r = arr.shift()
console.log(r);
console.log(arr);

38.push 和 unshift 可以批量添加成员
arr.push(‘a’, ‘b’, ‘c’)
arr.unshift(‘x’, ‘y’, ‘z’)
console.log(arr);

// splice 删除指定位置的成员,并用新成员替换,或插入新成员到指定成员的前面
// 第一个参数:删除成员的起始位置
// 第二个参数:删除成员的个数
// 第三个参数:用于替换被删除成员的新数据,该参数可以省略
// 删除一个成员:
// r = arr.splice(6, 3)
// splice的返回值 就是被删除的成员数组
// console.log(r);

// 在指定成员前追加新数据
// 若第二个参数为0,则可以实现在指定位置的前面添加成员的功能
arr.splice(6, 0, { name: 'Bob' })
console.log(arr);



// concat 连接数组
// 参数:多个被追加进数组的成员,若成员是数组,该数组中每个成员将被加入原数组
// concat 返回一个新数组
// r = arr.concat(7, 8, 9)
// r = arr.concat([7, 8, 9], [10, 11])
// console.log(r);
// console.log(arr);

39.// concat 的应用场景多用于克隆数组
let arr2 = [].concat(arr)
console.log(arr2);
console.log(arr === arr2);

// join 使数组成员用一个字符连接起来
// join 函数接收一个参数,该参数就是连接数组成员时使用的字符
arr2 = ['abc', 'xyz', '123']
r = arr2.join('-*-')
console.log(r);


// includes 判断是否包含某成员
r = arr.includes('z')
console.log(r);



// indexOf 查询指定数组成员的索引
r = arr.indexOf('b')
console.log(r);
// 可以使用indexOf判断是否包含某个数组成员 若不包含 返回 -1
r = arr.indexOf('g')
console.log(r); // => -1
if (arr.indexOf('g') === -1) {
    console.log('该数组成员不存在');
}

40.循环是什么?
// 循环就是重复执行某一段代码的行为

// for 循环
// 例如按次数进行循环
let count = 5 // 循环次数
// for (let i = 0; i < count; i++) {
//     console.log('hello world');
// }

41.冒泡排序
// 原理:此处以排序出一个从小到大的序列为例
// 令数组长度为 lenght
// 排序过程将进行 length - 1 次
// 每一次排序过程中,将对数组中每个成员从左到右进行两两比较,较大的数字将被挤到后面去
// 每执行完一次循环,将在数组末尾确定一个数字的位置
// 最后直到数组的第一个成员和第二个成员进行排序为止,排序结束
let arr = [5, 2, 1, 3, 7, 0, 9, 4]

for (let i = arr.length - 1; i > 0; i--) {
    for (let j = 0; j < i; j++) {
        // 判断前一个数和后一个数的大小
        if (arr[j] > arr[j + 1]) {
            // 交换
            let temp = arr[j]
            arr[j] = arr[j + 1]
            arr[j + 1] = temp
        }
    }
}

console.log(arr);
  1. // 什么是变量的作用域(Scope)?作用域指的是作用范围,范围内可以访问变量,超出范围则无法访问

    // 为了更好理解作用域,可以结合 debugger 和 浏览器的堆栈信息来查看
    // 方法:
    // 1. 在需要查看变量作用的地方写上 debugger
    // 2. 浏览器上 ctrl + shift + i 或 F12
    // 3. 选择 sources
    // 4. 找到当前代码对应的 Call Stack
    // 5. 查看当前 Call Stack 下的 Scope

    // 作用域一共只有三种
    // Global 全局作用域
    // Block 块级作用域
    // Function 函数作用域

43.let x = 1
let y = { name: ‘张三’, sex: ‘male’ }

function modify(a, b) {
    a++
    b.name = '李四'
    b.sex = 'female'
    console.log('函数内');
    console.log(a);
    console.log(b);
}

// 传入两个参数
// x 是值类型传参
// y 是引用类型传参

// 值类型传参,将x变量中的值 直接赋予了函数内的形参
// boolean number string 都是值传递的

// 引用类型传参,将y中的引用地址,传递给函数内的形参
// object function 都是引用传递的

modify(x, y)

console.log('函数调用完后');
console.log(x);
console.log(y);

44.// 函数

// 什么是函数?
// 站在开发人员的角度讲:函数是对一段程序的封装(封装:包装)
// 站在生活的角度来讲:函数就是帮我们完成某样任务的机器

// 为什么要使用函数?
// 用于包装可以重复使用的代码
// 代码的复用

// 输入input和输出output
// 输入:函数完成任务时必不可少的材料
// 输出:函数执行完后产出的产物

45.防抖
// 函数将在一个固定时间后被调用,若计时未完成又执行该函数,则取消上次计时,重新开始计时
// 用于限制频繁的网络请求,例如:搜索功能,用户停止输入的一段时间后才会执行搜索任务

// 防抖
// 步骤:
// 1. 取消计时
// 2. 重新计时

const fd = (() => {
    // 计时器id
    let timerId
    return () => {
        // 取消计时
        clearTimeout(timerId)
        // 重新计时
        timerId = setTimeout(() => {
            // 计时完成后要执行的代码 写在此处
            console.log('hello world');
        }, 3000)
    }
})()

console.log(fd);

46.// 节流
// 固定时间内只能调用一次的函数,可以使用时间戳或计时器的方式实现
// 作用同样是限制用户频繁的网络请求,例如:发送验证码

// 时间戳
function jlTimespan() {
    // 记录上一次成功运行节流函数的时间
    let lastTime
    // 函数调用cd
    let cd = 3000
    return () => {
        // 一次都没调用过该函数
        if (!lastTime) {

            // 执行节流函数的内容
            console.log('hello 节流')

            lastTime = Date.now()
        } else {
            // 计算上一次调用该函数和本次调用该函数的时间间隔
            // 当前时间
            let now = Date.now()
            // 获取间隔时间
            let timespan = now - lastTime
            // 当间隔时间大于cd,则认为可以再次调用该函数
            if (timespan >= cd) {
                console.log('hello 节流')
                // 记录本次调用的时间
                lastTime = now
            }
        }
    }
}

let fn = jlTimespan()
console.log(fn);

47.// 计时器
// 1. 判断是否可以运行节流代码(cd好没有)
// 2. 执行节流的内容
// 3. 计时
function jlTimer() {
// 计时器id
let timerId
let cd = 3000
return () => {
// 若已经开始计时 则timerId 存在
if (timerId) return

        // 执行被节流的函数内容
        console.log('hello 节流');

        // 开始计时
        timerId = setTimeout(() => {
            // 清空计时器id 允许再次调用
            timerId = undefined
        }, cd)
    }
}

fn = jlTimer()

48.// 内存堆栈?
// 调用函数时,函数中的各种变量将存储在内存中,以堆栈的形式进行保存
// 堆 用于存储对象数据的内存区域
// 栈 指的是一种先进后出的数据格式 用于存储每次函数调用时产生的数据
// 栈中的每一次调用内容,称为一个栈帧
49.// 此处结合 debugger 查看以下 for 循环中 i 的作用域

// for (let i = 0; i < 5; i++) {
//     // setTimeout 将在指定的一段时间后 执行回调函数
//     setTimeout(() => {
//         // debugger
//         console.log(i);
//     })
// }

for (let i = 0; i < 5; i++) {
    setTimeout(() => {
        // debugger
        console.log(i);
    })
}

50.// 预编译是什么?
// 在浏览器执行js脚本前需要进行编译,有些代码在编译前将会率先被翻译执行并存入内存,这个过程称为预编译

// console.log(x + 1)
// 变量无法在声明之前访问它    
// let x = 1

// console.log(sub(2, 1))
// 声明函数在调用之后
function sub(x, y) {
    let a = 1
    return x - y
}

// 上述调用函数不会报错,因为使用了 function 关键字声明的函数,将会被预编译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值