本文总结自,B站-遇见狂神说
命名:不能以数字开头
var num = 1;
var 你是谁 = 我是我:// java中这样定义也不错误
数字类型(js不区分小数和整数)
123 //整数
123.1 //浮点数
11.123e3 //科学计数法
-99 //负数
NaN //not a number
Infinity //表示无限大
'你试试'
"试试就试试"
true、false
&& 两个都为真,结果为真
|| 一个为真,结果为真
! 真即假,假即真
= 赋值
== 等于(类型不一样,值一样,也会判断为true)
=== 绝对等于(类型一样、值一样,结果为true)
最好不要用
==
isNaN(NaN)
来判断这个数是否为NaNconsole.log((1/3) === (1-2/3)); // false
尽量避免使用浮点数进行运算,存在精度问题!
解决:
Math.abs(1/3)-(1-2/3)) < 0.000000001; // true
var arr = [1,2,3,4,5,'hello',true,null];
访问
arr[0]
> 1
...
取数组下标越界了,就会
arr[100]
> undefined
每个属性间使用逗号隔开,最后一个无需添加
// Person p = new Person(1,2,3,4,5);
var p = {
name:'xiaoming',
age:3,
tags:['js','web']
}
取对象的值
person.name
> 'xiaoming'
person.age
> 3
use strict
:严格检查模式,预防JavaScript的随意性。
前提:IDEA要设置支持ES6语法,必须写在JS代码的第一行!
局部变量建议使用let
修饰
<script>
'use strict';
// 全局变量
i = 1; // 会报红,但不是错误【浏览器控制台会报错】!
// 局部变量
var i = 1;
let i = 1;
</script>
\'
\n
\t
\u
\4e2d : 中 Unicode字符
\x41 : Ascll字符
// tab上面,ESC下面
var msg =
`hello
world
nihao
你好!
`;
结果:
> console.log(msg)
hello
world
nihao
你好!
// tab上面,ESC下面
let name = 'xiaoming';
let age = 23;
let p = `你好,${
name}`;
控制台输出:
console.log(p)
> 你好,xiaoming
var student = "xiaoli";
console.log(student.length);
结果:
6
var a = "xiaoli";
console.log(a[0]);
a[0] = 2;
console.log(a);
结果:
x
xiaoli
// 这里是方法,不是属性
var a = "xiaoli";
console.log(a.toUpperCase());
console.log(a.toLowerCase());
结果;
XIAOLI
xiaoli
var a = "xiaoli";
a.indexOf('i')
a.subString(1,3) // 截取字符串,包含前边不包含后面
a.subString(1) // 截取到末尾
控制台浏览数组:arr + 回车即可!
var arr = [1,2,3,4,null,true];
arr.length = 10;
console.log(arr);
若赋值过小,易造成数据丢失
arr.length = 10;
结果:
console.log(arr)
> [1, 2, 3, 4, null, true, empty × 4]
查看四个空值:
console.log(arr[7])
> undefined
var arr = [1,2,3,4,'1','2']
console.log(arr.indexOf(2));
> 1
console.log(arr.indexOf('2'));
> 5
类似上面字符串中的
subString
方法!
arr.slice(3); // 从第三个开始,到末尾
arr.slice(1,5); // 从第一个开始,含左不含右
arr.push('a','b'); // 压入元素
arr.pop(); // 每次弹出最后一个元素
unshift // 压入到头部
shift // 弹出头部一个元素
arr.sort();
arr.reverse();
arr.contant([1,2,3]);
使用特定字符串,打印拼接数组
[1,2,3]
arr.join("-");
"1-2-3"
arr = [[1,2],[3,4],['5','6']];
arr[1][1] //(00,01,10,11...)
> 4
JS中的所有的键都是字符串,值是任意对象
若干个键值对:
var person = {
name:'xiaoming',
age:23,
email:"[email protected]",
score:0
}
person.name
> xaioming
person.name = 'laowang'
uundefined
person.kaka
> undefined
delete person.name
> true
person + 回车
> {
age: 23, email: "[email protected]", score: 0}
person.haha = 'haha';
age in person // 这样不对!
'age' in person
> true
'toString' in person // 继承自父类
> true
person.hasOwnProperty('toStirng')
> false
person.hasOwnProperty('age')
> true
var age = [1,2,3,435,3,5,7];
age.forEach(function (value){
console.log(value);
})
var age = [1,2,3,435,3,5,7];
for(num in age){
console.log(age[num]);
}
ES6的新特性~
let map = new Map([['tom',100],['jack',80],['lisa',70]]);
console.log(map);
结果:
Map(3) {
"tom" => 100, "jack" => 80, "lisa" => 70}
let name1 = map.get('tom'); // 获取值
let add = map.set('july',88); // 新增
let add2 = map.set('july',99); // 新增
map.delete('lisa'); // true
console.log(name1);
console.log(add);
console.log(add2);
结果:
100
Map(4) {"tom" => 100, "jack" => 80, "lisa" => 70, "july" => 88}
Map(4) {"tom" => 100, "jack" => 80, "lisa" => 70, "july" => 99}
Map(3) {"tom" => 100, "jack" => 80, "july" => 99}
let set = new Set([2,3,3,3,3]);
console.log(set);
结果:
Set(2) {2, 3}
set.add(4);
set.delete(3); // true,在执行返回false
set.has(2); // true
结果:
Set(3) {2, 3, 4}
Set(2) {2, 4}
true
ES6新特性~,
for..in
在集合新增元素时,遍历会有bug!
var arr = [3,4,5]
for (var x of arr){
console.log(x);
}
结果:
3
4
5
let map = new Map([['tom',100],['jack',80],['lisa',70]]);
for (let x of map){
console.log(x);
}
结果:
["tom", 100]
["jack", 80]
["lisa", 70]
let set = new Set([2,3,4]);
for (let x of set){
console.log(x);
}
function abs(x){
if(x=>0){
return x;
} else{
return -x;
}
}
结果:
abs(10)
> 10
abs() // 未赋值也不会报错!
> NaN
return
代表函数结束,返回结果!return
,函数执行完也会返回结果:undefined
.var abs = function(x){
// function:匿名函数
if(x=>0){
return x;
} else{
return -x;
}
}
调用函数
abs(10) 10
abs(-10) 10
参数问题:
js可以传任意个参数,也可以不传递参数~
若想避免此类问题,可以添加判断条件和抛出异常
var abs = function(x){
// 手动抛出异常
if(typeof x !== 'number'){
throw 'Not a Number';
}
if(x=>0){
return x;
} else{
return -x;
}
}
arguments
arguments
是一个数组,接收所有传递过来的参数(包括已定义的参数)
案例:求任意个数的和
function add (){
var sum = 0;
for (var i = 0; i < arguments.length; i++) {
sum += arguments[i];
}
return sum;
}
var sum = add(1,2,3,4);
alert(sum);
reset
以前:
function aaa(x,y){
if(arguments.length > 2){
// 从第三个参数开始
for(var i = 2; i < arguments.length; i++){
}
}
}
新特性!除已定义参数之外的所有参数都在这里
function aaa(x,y,...rest){
// 相当于可变参数
console.log('a='+a);
console.log('b='+b);
console.log(rest);
}
结果:
aaa(1) // a=1 b=undefined []
aaa(1,2,3) // 1 2 3
aaa(1,2,3,4,5,6) // 1 2 3 [4,5,6]
<script>
function ad() {
var x = 1;
x = x + 1;
}
// Uncaught ReferenceError: x is not defined
x = x + 2;
</script>
<script>
function ad() {
var x = 1;
x = x + 1;
}
function asd() {
var x = 1;
x = x + 1;
}
</script>
function ad() {
var x = 1;
function asd() {
var y = x + 1;
}
// Uncaught ReferenceError: z is not defined
var z = x + y;
}
ad()
function ad() {
var x = 1;
function asd() {
var x = 11;
}
var z = x;
}
ad()
JavaScript会默认提升变量的作用域
例如:
function ad(){
var x = "x" + y;
console.log(x);
var y = 'y';
}
ad()
结果:xundefined
解析:JS执行引擎自动提升了y的声明,但是不会提升变量y的赋值;
相当于:
function ad(){
var y;
var x = "x" + y;
console.log(x);
//y = 'y';
}
ad()
所有变量的定义最好都放在函数头部,便于代码维护!
var a = 'aaa';
alert(a);
alert(window.a);
alert()
本身也是一个window变量(方法也可以当做变量) var x = 'xxx';
window.alert(x);
var old_alert = window.alert; // xxx
// 与上面效果相同
old_alert(x); // xxx
window.alert = function () {
}
// 发现alert()失效了
window.alert(123);
// 恢复
window.alert = old_alert;
window.alert(456); //456
将全局变量绑定到自定义的全局对象上,降低全局命名冲突问题【不绑定到window对象】
如果不同的js文件使用了相同的全局变量,怎么避免冲突:设置命名空间
<script>
// 唯一全局变量
var iApp = {
};
// 定义全局变量
iApp.name = 'iluis';
iApp.add = function(){
return a+b;
}
</script>
<script>
function a() {
for (let i = 0; i < 100; i++) {
console.log(i);
}
console.log(i + 1);
}
a()
</script>
结果:
...
99
Uncaught ReferenceError: i is not defined
在ES6
之前,用全部大写字母命名的变量就是常量:
var PI = '3.14';
PI = '234';
console.log(PI); // 234
在ES6
引入了常量关键字const
const PI = '3.14';
console.log(PI);
PI = '234';
结果:
3.14
Uncaught TypeError: Assignment to constant variable.
方法就是把函数放在对象的里面,对象只有两个属性:属性和方法。
var i = {
name: '小明',
birth: 2000,
// 方法
age: function () {
// 计算生日
var now = new Date().getFullYear();
return now - this.birth;
}
}
// 属性
i.name;
// 方法
i.age();
this默认指向调用他的对象!
将上面代码改写:
function getAge(){
// 计算生日
var now = new Date().getFullYear();
return now - this.birth;
}
var i = {
name: '小明',
birth: 2000,
// 方法
age: getAge
}
}
访问方法
i.age(); // 20
getAge(); // Nan 这里的this指向了window,所以为NaN
在js中可以控制this的指向
需要两个参数:
getAge.apply(i,[]);
// i:this指向了i这个对象
// []:参数为空
typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {
}
"object"
typeof Math.abs
"function"
typeof undefined
"undefined"
var now = new Date();
now.getFullYear(); // 年
now.getMonth(); // 月 0~11
now.getDate(); // 日
now.getDay(); // 星期几
now.getHours(); // 时
now.getMinutes(); // 分
now.getSeconds(); // 秒
now.getTime(); // 时间戳
console.log(new Date(now.getTime())) // 获取当前时间
// 本地时间
now.toLocaleDateString(); // "2020/7/6"
now.toLocaleString(); // "2020/7/6 下午11:45:01"
格式:
{}
[]
key:value
代码:
var user = {
name: 'zhangsan',
age: 3,
sex: '男'
}
// 将对象转换为json字符串
var jsonUser = JSON.stringify(user);
//{"name":"zhangsan","age":3,"sex":"男"}
// json字符串转换为对象
var obj = JSON.parse('{"name":"zhangsan","age":3,"sex":"男"}');
//{name: "zhangsan", age: 3, sex: "男"}
JSON和对象的区别
var obj = {
name:"zhangsan",age:3};
var json = '{"name":"zhangsan","age":3}';
var student = {
name: 'lisi',
age: 3,
run: function () {
console.log(this.name +'..run...')
}
};
var xiaoming = {
name: 'xiaoming'
};
// 小明的原型是student
xiaoming._proto_ = student;
本质还是原型
class Student {
// 构造器
constructor(name) {
this.name = name;
}
hello(){
alert("hello");
}
}
class xiaoStudent extends Student {
constructor(name,grade) {
super(name);
this.grade = grade;
}
mySay(){
alert("hey,man");
}
}
var zhangsan = new Student("zhangsan");
var lisi = new Student("lisi");
zhangsan.hello();
var xiaoli = new xiaoStudent("小李",88);
xiaoli.hello();
xiaoli.mySay();
_proto_
BOM:浏览器对象模型
浏览器窗口
封装了浏览器的信息
不常用,容易被人修改!
代表屏幕尺寸
当前页面的URL信息
host: "www.baidu.com"
href: "https://www.baidu.com/"
protocol: "https:"
reload: ƒ reload() // 刷新网页
location.assign('网址') // 设置新的地址
代表当前页面。HTML DOM文档树
document.title
"百度一下,你就知道"
document.title = 'aaa'
"aaa"
var d1 = document.getElementById('')
document.cookie
代表浏览器的历史记录
history.back() // 后退
history.forward() // 前进
DOM:文档对象模型
浏览器网页就是一个DOM树形结构
要操作一个DOM节点,就必须先获得这个DOM节点
<div id="father">
<h1>标题一</h1>
<p id="p1">123</p>
<p class="p2"></p>
</div>
<script>
var h1 = document.getElementsByTagName("h1");
var p1 = document.getElementById("p1");
var p2 = document.getElementsByClassName("p2");
var div = document.getElementById("father");
var childrens = div.children; // 获得父节点下的所有子节点
div.firstChild;
div.lastChild;
</script>
以后尽量使用jQuery!
var p1 = document.getElementById("p1");
p1.innerText = "123";
p1.innerHTML = 'AAA';
设置样式
属性使用字符串:''
包裹
p1.style.color = 'red';
p1.style.fontSize = '20px';
步骤:先获取父节点,再通过父节点删除自己
var self = document.getElementById("p1");
var father = self.parentElement;
father.removeChild(self);
father.removeChild(father.children[0]);
father.removeChild(father.children[1]);
father.removeChild(father.children[2]); // 删除第一个的时候,它就报错了
注意:删除出多个父节点时,children是在时刻变化的!
<p id="p3">AAA</p>
<div id="list">
<h1>标题一</h1>
<p id="p1">123</p>
<p class="p2">444</p>
</div>
<script>
var p3 = document.getElementById('p3');
var list = document.getElementById('list');
list.appendChild(p3) // 追加
</script>
方式一:appendChild
var newP = document.createElement('p'); // 创建一个P标签
newP.id = 'newP';
newP.innerText = "Hello,lisa";
list.appendChild(newP);
方式二:setAttribute【通用】
var myscript = document.createElement('script');
myscript.setAttribute('type','text/javascript');
insertBefore可以自行了解
表单的目的:提交信息
<body>
<form action="post" method="post">
<p>
<span>用户名</span>
<input type="text" id="username">
</p>
<p>
<span>性别</span>
<input type="radio" name="gender" value="man" id="boy"> 男
<input type="radio" name="gender" value="women" id="girl"> 女
</p>
</form>
<script>
var username = document.getElementById('username');
var boy_radio = document.getElementById('boy');
var girl_radio = document.getElementById('girl');
console.log(boy_radio.value); // 查看所对应的值
console.log(boy_radio.checked); // 查看是否被选中
boy_radio.checked = true; // 选中性别男
</script>
</body>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<!-- MD5加密工具类 -->
<script src="https://cdn.bootcdn.net/ajax/libs/blueimp-md5/2.16.0/js/md5.min.js"></script>
</head>
<body>
<form action="#" method="post" onclick="return login()">
<p>
<span>用户名</span>
<input type="text" id="username" name="username">
</p>
<p>
<span>密码</span>
<input type="password" id="input-password">
</p>
<input type="hidden" id="md5-password" name="password">
<button type="submit" onclick="login()">提交</button>
<script>
function login() {
//alert(1);
var uname = document.getElementById('username');
var pwd = document.getElementById('password');
var md5pwd = document.getElementById("md5-password")
// MD5算法
md5pwd.value = md5(pwd, value);
// 可以判断是否提交表单内容,true是体积哦啊
return false;
}
</script>
</body>
jQuery 是一个高效、精简并且功能丰富的 JavaScript 工具库。它提供的 API 易于使用且兼容众多浏览器,这让诸如 HTML 文档遍历和操作、事件处理、动画和 Ajax 操作更加简单。
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js">script>
$('p').click();
$('#id1').click();
$('.class2').click();
$(docunemnt).ready(function(){
})
// 简写
$(function(){
})
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js">script>
<style>
#divMove {
width: 500px;
height: 500px;
border: 3px solid red;
}
style>
head>
<body>
mouse:<span id="mouseMove">span>
<div id="divMove">
在这里移动鼠标试试
div>
<script>
// 公式:$(selector).action
$("#divMove").mousemove(function (e) {
$("#mouseMove").text('x:' + e.pageX + 'y:' + e.pageY);
});
script>
body>
html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js">script>
head>
<body>
<ul id="ul1">
<li class="li1">AAAli>
<li name="li2">BBBli>
ul>
<script>
$('#ul1 li[name=li2]').text();
$('#ul1 li[name=li2]').text('123');
script>
<script>
$('#ul1').html();
$('#ul1').html('123');
script>
$('#ul1 li[name=li2]').css("color","red");
元素的显示和隐藏:本质 display: none;
$('#ul1 li[name=li2]').show();
$('#ul1 li[name=li2]').hide();