【学习笔记】JavaScript

2022-10-26 16:19:15 浏览数 (2)

JavaScript

此笔记为本人学习遇见狂神说的JS讲解视频的个人学习笔记,侵删。

梗概

  • 简单,应用量大,但支持不了高并发
  • 原生JS开发,按照ECMAScript标准(ES),浏览器支持的版本与现实开发的版本不一致,可能需要webpack进行支持
  • 微软的TypeScript是js的超集
  • JS框架
    1. jQuery(这个是库)
    2. Angular(模块化)
    3. React(虚拟DOM)
    4. Vue(模块化 虚拟DOM)
    5. Axios(前端通信框架)
  • UI框架
    1. Ant-Design
    2. ElementUI, iview, ice
    3. Bootstrap
    4. AmazeUI
  • JS构建工具
    1. Bable
    2. WebPack
  • 前端做后端
    • Node.js

快速入门

引入js

直接写在HTML中

代码语言:javascript复制
<!--html中,在script标签内写JS代码,放在末尾前即可(但好像也可以?)-->
    <script>
        alert('hello, world');
        // ...
    </script>

外部引入

代码语言:javascript复制
<!--
script要成对出现,不用显示定义type,默认是js, type="text/javascript"
但好像版本老的开发软件要。
-->
<script src="js/script.js"></script>

基本语法入门

let是局部变量(在他所在的代码块可用),const是常量,var是全局变量(前两个是ES6的,因为前面两个更加严谨,var被抛弃(貌似))

不加声明似乎是全局变量(?)

变量命名

不能数字开头

$1 OK _oo 中文

判断语句

eslink检查,使它更严谨,如// &nbsp

代码语言:javascript复制
let a = 10, b = 10;
if(){
    
}
else if()
{
    
}
//
/*
*/
调试

在console中:

代码语言:javascript复制
alter(score) // 弹窗
console.log(score) // 在控制台打印变量

在source中:

可以打断点,进行调试。

数据类型

数值,文本,图形,音频,视频……

number

js不区分小数和整数。整数,浮点数,科学计数法,负数,NaN,Infinity

字符串

'abc' "abc" 'n'

布尔值

true, false

逻辑运算

&&, ||, !

比较运算符

=, ==(类型不一定,值一样,1=='1',true), ===(绝对等于,类型一样,值一样)

一般避免用==

  • 注意,NaN === NaN,它与所有值都不相等,包括自己。
    • 通过isNaN(NaN)函数判断
  • 浮点数问题
    • 精度丢失
    • 1/3 === (1-2/3) False
    • 尽量避免使用浮点数运算
    • 可以用Math.abs((f1-f2) < eps)来判断相等(eps是自己定义的很小的数)
  • null和undefined
    • null 空
    • undefined 未定义

数组

代码语言:javascript复制
// 可以是不同类型的(Java要相同)
// 为了可读性,尽量用[]
let arr = [1,2,3,'hello',null,true];
new Array(1,2,3,'hello');

console.msg(arr[0]);
// 越界是未定义

对象

代码语言:javascript复制
// 对象大括号,数组中括号
// 每个属性用,隔开,最后一个不需要
// Person person = new Person(1,2,3);
let person = {
    name: "hhh",
    age: 3,
    tags: ['sd', 'xx'],
}
console.msg(person.name);

严格检查模式

代码语言:javascript复制
'use strict';
// 放在最上面, 防止js的随意性导致问题.  貌似是逐行解释

数据类型

字符串

字符串, '' 或者 ""

转义字符

代码语言:javascript复制
n t u#### (Unicode)  x##(Ascii) (在字符串包裹内)

多行字符串编写

代码语言:javascript复制
let msg = `
hello
world
jz
`

模板字符串

代码语言:javascript复制
let msg = `hello, ${name}`
// 有点像python .format(?)

字符串长度

代码语言:javascript复制
str = "1231248"
str.lenght
str[0]

字符串不可变

大小写转换

代码语言:javascript复制
str.toUpperCase()
str.toLowerCase()
.indexOf('t') // 首次出现的下标
.substring(1,3) // 从上面下标开始[l,r)

数组

可以同时包含任意数据类型,可以修改内容

长度

代码语言:javascript复制
arr.length = 10
// 可变(直接赋值),后面会补上undefined
// 赋值小了,会丢失元素    

.indexOf(x) - 找到第一个x的下标索引

'1'和1不同

slice() - 截取数组的一部分,返回一个新数组

push(... , ...) - 压入尾部, pop() - 弹出尾部

unshift() - 压入, shift() - 弹出头部

sort() - 排序

reverse() - 元素反转

arr.concat([1,2,3]) - 数组连接, 没有改变原宿主, 返回连接后的数组.

arr.join('-') - 连接符, 打印数组(用特殊字符连接)

多维数组

arr = [[],[],[]];

其他

代码语言:javascript复制
arr.fill(1);
...

对象

js的所有的键(Key)都是字符串, 值(Value)是任意对象 !

代码语言:javascript复制
let 对象名 = {
    属性名: 属性值,
    属性名: 属性值,
    属性名: 属性值  // 有些浏览器在最后一个属性加逗号报错!
}

对象可以赋值

使用不存在的属性, 不报错, undefined

动态的增减属性

代码语言:javascript复制
person.ununun = "sdfijiosafj"
delete person.name

判断某个属性值是否在对象中

代码语言:javascript复制
'age' in person
true
// 继承
'toString' in person
true

.hasOwnProperty('')一个属性是否是这个对象自身拥有的

代码语言:javascript复制
person.hasOwnProperty('age')
true
person.hasOwnProperty('toString')
false

Map和Set

代码语言:javascript复制
let map = new Map([['tom',100],['Bob',90],['Roger',0]]);
map.get('tom'); // key -> value
map.set('xxx',123); // 加入
map.delete('tom');

let set = new Set([1,2,3,3,3,3]); // 可以去重
set.add(5);
set.delete(1);
set.has(3); // 是否存在

流程控制

if, for, while 和 c 一样

forEach

代码语言:javascript复制
arr.forEach(function (value) {
  console.log(value) 
})
// i为索引下标(但给它添加别的属性名后,会输出属性名)
// 怀疑数组是key为下标的map(?)
for(let i in age)
{
    
}
for(let x of age) // x为具体的值(未定义的值?)
{
    
}

函数

没有执行return,执行完return NaN

代码语言:javascript复制
// 函数声明
function fun(x){
    return x;
}
// 函数表达式 匿名函数
let fun = function(x){
    return x;
}
// fun(10, 123,124,12,3,12)
// 返回10
// 参数问题, js可以传任意个参数. 有用的只有前面的

// arguments是关键字, 代表进来的所有的参数, 数组.
// 可以用, 拿到"隐藏"的参数(?)
arguments.length === 1;
// 无参数, 手动抛出异常
if(typeof x !== 'number'){
    throw 'not a Number';
}

// rest - 获取已经定义的参数之外的所有参数
// 只能写在最后,前面用 ... 标志
function fun(a, b, ...rest) {
    console.log(res);
}

作用域

var外部不能用内部类的东西, 内部可以调用外部的.

内部再次定义, `内在内,外在外.

js会自动提前变量的声明. 建议先定义再赋值

代码语言:javascript复制
var a,b,c;

a = 3;
b = 'a';

定义在最外面, 全局变量.

默认所有的全局变量, 自动绑定在window对象下, window.x - (调用)

alert() 其实也是 window.alert()

代码语言:javascript复制
// 神奇的JS
var ole_alert = window.alert;
window.alert = function(){
    return;
};
// 覆盖了
window.alert(123); // 就没有弹窗了!

只有一个全局作用域, 任何变量(包括函数), 假设没有在函数作用范围找到,会去向外查找, 如果在全局作用域也没有找到, 报错Reference-Error

规范
减少冲突.

自己弄一个类, 绑定在这个唯一全局变量中, 而不去绑定在window这个全局变量中, 来降低全局命名冲突 和别人不冲突

jQuery的实现类似(?) - jQuery. or $()

for(var i) // 出了作用域还可以使用

因为, var只有函数作用域, let既有函数作用域, 也有块作用域. (?)

let 就避免的这个问题.

常量 const

约定俗成, 在ES6之前, 全部用大写, 建议不改.

方法

代码语言:javascript复制
var kkk = {
    name: 'hhh',
    birth: 2000,
    age: function() {
        var now = new Data().getFullYear();
        return now-this.birth;
    }
    fun: get_ff
}
// 方法, kkk.age();

// 拆开写fun:

this是调用它的类, 所以, 在外面 .fun() 可以, get_ff() NaN, window没有这个

this是无法指向的, 是默认指向调用它的对象

apply

可以控制thist指向.

任何一个函数都有, fun.apply(kkk, []); // 类名, 参数

内部对象

标准对象

代码语言:javascript复制
number
string
boolean
NaN - number
{}, [] - object
Math.abs - function
undefined - undefined

Data

基本使用

代码语言:javascript复制
let now = new Date();
now.getFullYear(); // Year
now.getMonth(); // month 0~11
now.getDate(); // 日
now.getDay(); // 星期几
now.getHours(); // 时
now.getMinutes();
now.getSeconds();
now.getTime(); // 时间戳 世界统一 1970.1.1 0:00:00
console.log(new Date(now.getTime())

转换

代码语言:javascript复制
now.toLocaleString();
now.toGMTString();

JSON

  • 数据交换格式
  • 有层次结构
  • 提升网络传输效率
  • JS的子集

在JS中, 一切皆为对象

格式:

  • 对象{}
  • 数组[]
  • 键值对 key: value

JSON与JS对象的转化

代码语言:javascript复制
var user = {
    xxx: 'hhh'
};
var jsonUser = JSON.stringify(user); // 对象
var obj = JSON.parse('{"xxx":"hhh"}'); // string
// 因为, 单引号与双引号, 在里外层交替使用.

Ajax

  • 原生的js写法 - xhr 异步请求
  • jQuery封装的方法, $("#name").ajax("") // 选择器
  • axios 请求

面向对象编程

  • 类: 模板
  • 对象:具体的实例

原型指向

代码语言:javascript复制
let Student = {
    name: "Roger",
    age: 5,
    run: function () {
        console.log(this.name   " run...");
    }
};
let zzz = {
    name: "zzz"
};
// .__proto__  原型指向, 有的属性名就覆盖属性值(?), 没有的, 加入
zzz.__proto__ = Student;

Class继承

ES6引入的.

本质还是原型对象

代码语言:javascript复制
// 增加方法, 给它的原型加方法
zzz.prototype.newFunction = function(){
    alert('good');
};
// ----
// 定义一个学生的类
Class Student{
    constructor(name){
        this.name = name;
    }
    hello(){
        alert('hello');
    }
}
let xx = new Student('xx');

// 继承

class zStudent extends Student{
    constructor(name, grade)
    {
        super(name); // 集成要实现父类的东西, 这个相当于直接拿(?)
        this.grade = grade;
    }
    Who(){
        alert('zStudent');
    }
}

原型链

指到原型对象之后, 原型对象和方法互相指向, 形成原型链

操作BOM对象

BOM: 浏览器对象模型

window

代码语言:javascript复制
window.innerWidth // 里面显示的高度
window.innerWidth
window.outerHeight
window.outerWidth

Navigator (不建议)

封装了浏览器信息

代码语言:javascript复制
Navigator.appName
Navigator.appVersion
Navigator.userAgent
Navigator.platfrom

因为它可以人为修改,所以不建议用其判断和编写代码

screen

屏幕尺寸

代码语言:javascript复制
screen.width
screen.height

location (重要)

location代表当前网页的URL信息

代码语言:javascript复制
host: "www.baidu.com"
href: "https://www.baidu.com"
protocal: "https:"
reload:f reload() // 刷新
// 设置新地址, 重定向
location.assign('https;//livinfly.top');

document

document代表当前页面, HTML DOM文档树

代码语言:javascript复制
document.title
获取具体的文档树节点
代码语言:javascript复制
document.getElementById('app');
document.getElementByTagName('h1');
document.getElementByClassName('p2');
获取cookie
代码语言:javascript复制
document.cookie
劫持cookie

网页获得cookie让同一站点登录可能也有关.

服务器端可以设置cookie: httpOnly 安全.

history (不建议)

历史记录

代码语言:javascript复制
history.back()
history.forward() // 前进

DOM节点

核心

浏览器网页时一个Dom树形结构

  • 更新: 更新Dom节点
  • 遍历: 得到Dom节点
  • 删除: 删除Dom节点
  • 添加: 添加一个新的节点

获得Dom节点

除了id其他获得的是list, 用下标取

代码语言:javascript复制
document.getElementById('app');
document.getElementByTagName('h1');
document.getElementByClassName('p2');
let father = document.getElementById('father');
let childrens = father.children; // 获得父节点的所有子节点
// father.firstChild;
// father.lastChild;

原生代码, 之后尽量运用jQuery

更新Dom节点

代码语言:javascript复制
// 驼峰命名, 属性值时字符串,用''包裹
id1.innerText='123' // 修改文本的值
id1.innerHTML='<strong>123</strong>'; // 可以解析HTML
id1.style.color = 'red';
id1.style.fontsize = '';
id1.style.padding = '';

删除节点

先获得父节点和它, 再删除它

代码语言:javascript复制
// father和p1都事先获取
father.removeChild(p1);
// 删除是动态的过程, 所以删除节点的时候, 注意, child在变化

插入节点

创建标签, 设置标内容, 设置标签内内容, 标签插入

追加
代码语言:javascript复制
// list和id1都是实现获取的节点, 若id1原本在, 貌似是会移动过去
list.appendChild(id1);
创建一个新标签
代码语言:javascript复制
var newP = document.creatElement('p');
newP.id = 'newP';
newP.innerText = 'xxx';
newP.setAttribute('type', 'text/javascript');
insert
代码语言:javascript复制
// .insertBefore
父节点.insertBefore(新节点, 目标节点);

操作表单

表单是为了提交信息

  • text - 文本
  • select - 下拉
  • radio - 单选
  • checkbox - 多选
  • hidden - 隐藏域
  • password - 密码框
  • ...

用上面的方法得到的Dom节点, 可以对input的文本, 直接得到修改

  • input - text 可以直接获得
  • radio .value 获得单个的, 预设的value 用.checked 判断选择的状态, 来判断选了哪个, 也可以赋值
  • onclick, onsubmit (表单) - 标签属性

用MD5(外部引用MD5工具包文件)加密, 密码防止被抓包利用

onsubmit = 'return fun()'; // false 就不传了

jQuery

入门

CDN引入(url) - 和引入js代码一样

公式:

代码语言:javascript复制
$(selector).action(); // 选择器, 事件, (function)

选择器

代码语言:javascript复制
$('p').click(); // 标签
$('#id1').click(); // id
$('.class1').click(); // class

工具站

事件

(document).ready(function()); 与 (function); 等价

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="js/jquery-3.6.1.js"></script>
    <style>
        #divMove {
            width: 500px;
            height: 500px;
            border: 1px solid red;
        }
    </style>
</head>
<body>

mouse : <span id="mouseMove"></span>
<div id="divMove">
    Try it
</div>

<script>
    $(function () {
        $('#divMove').mousemove(function (e) {
            $('#mouseMove').text('x:'   e.pageX   ' y: '   e.pageY);
        })
    })
</script>
</body>
</html>

操作Dom

代码语言:javascript复制
$('#hhh li[name=python]').text() // 获得
$('#hhh li[name=python]').text('xx') // 修改
$('#hhh').html(); // 获得
$('#hhh').html(''); // 修改
// css
$(selector).css({"color", "red"}, {...});
// 元素显示与隐藏 本质 display = none;
.show()
.hide()
.toggle(); // 切换
// Other
$(window).width()

// ajax():
$('').ajax() // ..

小技巧

  1. 巩固JS(看jQuery源码, 游戏源码)
  2. 巩固HTML CSS(扒网站, 全down下来, 对应修改看效果)

Layui - 经典开源模块化前端 UI

Element - 网站快速成型工具

用 `` 来表示字符串,${para}可以表示引用变量

0 人点赞