JavaScript入门
JavaScript
数据类型入门
变量
var
number
js不区分小数和整数
123
123.1
1.123e3
-99
NaN //Not a number
Infinity //无限大
比较运算符
== 等于(类型不一样,值一样,结果true)
=== 绝对等于(类型一样,值一样,结果true)
- NaN===NaN,这个与所有的数值都不想等,包括自己
- 只能通过isNaN(NaN)来判断这个数是否是NaN
浮点数问题
console.log(1/3) === (1-2/3) //false
尽量避免使用浮点数进行运算,存在精度问题
console.log(Math.abs(1/3-(1-2/3))<0.00000001) //true
null和undefined
严格检查模式
//前提:IDEA需要设置支持ES6语法
'use strict'; //严格检查模式,预防js的随意性导致产生的问题
//i = 1; 全局变量
let i = 1; //局部变量建议都使用let去定义
数据类型
字符串
<script>
'use strict';
console.log('a');
console.log("a");
</script>
-
正常字符串使用单引号或者双引号
-
注意转义字符
\' \t \n \u4e2d 中 \u#### Uncode字符 \x41 A ASCII字符 -
多行字符串编写
var msg = `hello world 你好ya 你好` -
模板字符串
<script> 'use strict'; let name = "qinjiang"; let age = 3; let msg = `你好呀, ${name}` </script> -
字符串长度
str.length -
字符串的可变性:不可变
-
常用方法
student.toUpperCase() student.toLowerCase() student.indexOf('t') //1 student.substring(1) //tudent student.substring(1,3) //tu
数组
Array可以包含任意的数据类型
var arr = [1,2,3,4,5,6]
长度
arr.length
注意:假如给arr.length赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失
方法
arr.indexOf(2) //2出现的下标索引
arr.slice(3) //截取Array的一部分,返回一个新数组
arr.slice(1,5) //类似substr
arr.push('a','b') //尾部插
arr.pop() //尾部弹
arr.unshift('a','b') //头部插
arr.shift() //头部弹
arr.sort() // ["A","B","C"]
arr.reverse() //["C","B","A"]
arr.concat([1,2,3]) //拼接数组 ["C","B","A",1,2,3]
//concat()并没有修改数组,只是会返回一个新数组
arr.join('-') // "C-B-A"
多维数组
arr = [[1,2],[3,4],["5","6"]];
arr.fill(1) //[1,1,1]
arr.find()
对象
JavaScript中所有的键都是字符串,值是任意对象
var person = {
name: "kuangshen",
age: 3,
email:"24736743@qq.com",
score: 0
}
-
对象赋值
person.name = "qinjiang" -
使用一个不存在的对象属性,不会报错!undefined
-
动态的删减、添加属性
delete person.name person.haha = "haha" -
判断属性值是否在这个对象中
'age' in person //true 'toString' in person //true -
判断一个属性是否是这个对象自身拥有的
person.hasOwnProperty('toString') //false person.hasOwnProperty('age') //true
流程控制
if判断
'use strict';
var age = 3;
if(age > 3){
alert("haha");
}else if(age < 5){
alert("kuwa");
}else {
alert("kuwa~");
}
while
for
for (let i = 0; i < 100; i++) {
console.log(i);
}
var age = [1,12,65,16,4841,21,111];
//forEach循环
age.forEach(function (value){
console.log(value)
})
for(var num in age) {
console.log(age[num])
}
Map和Set集合
ES6的新特性
map
'use strict'
var map = new Map([['tom',100],['jack',90],['haha',80]]);
var name = map.get('tom');
console.log(name);
map.set('admin',123456);
map.delete("tom");
Set:无序不重复的集合
var set = new Set([3,1,1,1,1]); //set可以去重
set.add(2);
set.delete(2);
console.log(set.has(3));
iterator
作用:使用iterator来遍历我们的Set,Map
遍历
'use strict'
var arr = [3,4,5]
for (let x of arr){
console.log(x) //for of打印数组的值 for in打印数组的下标
}
var map = new Map([['tom',100],['jack',90],['haha',80]]);
for (let x of map){
console.log(x)
}
var set = new Set([5,6,7]);
for (let x of set) {
console.log(x)
}
函数
定义函数
定义方式一
绝对值函数
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
一旦执行到return代表函数结束,返回结果
如果没有执行return,函数执行完也会返回结果,结果就是undefined
定义方式二
var abs = function abs(x){
//手动抛出异常
if (typeof x!== 'number'){
throw 'Not a number';
}
if(x>=0){
return x;
}else{
return -x;
}
}
调用函数
参数问题:JavaScript可以传任意个参数,也可以不传递参数
arguments
arguments 是一个JS免费赠送的关键字,代表传递进来的所有参数,是一个数组
var abs = function abs(x){
console.log("x=>"+x);
for (var i = 0; i<arguments.length; i++){
console.log(arguments[i]);
}
if(x>=0){
return x;
}else{
return -x;
}
}
问题:arguments包含所有参数,我们有时候想使用多余的参数来进行附加操作,需要排除已有的参数
rest
ES6引入的新特性,获取除了已经定义的参数之外的所有参数
function aaa(a,b,...rest){
console.log("a=>"+a);
console.log("b=>"+b);
console.log(rest);
}
rest参数只能写在最后面
变量的作用域
假设在函数体内声明,则在函数体外不可以使用(闭包)
如果两个函数使用了相同的变量名,只要在函数内部就不冲突
内部函数可以访问外部函数的成员,反之则不行
提升变量的作用域
function qj() {
var x = "x" + y;
console.log(x);
var y = 'y';
}
结果:undefined
说明js执行引擎自动提升了y的声明,但是不会提升变量y的赋值
养成规范:所有的变量定义都放在函数的头部,便于代码维护
function qj2() {
var x = 1,
y = x + 1,
z,i; //undefined
//之后随意用
}
全局函数
全局对象window
var x = 'xxx';
alert(x);
alert(window.x); //默认所有的全局变量都会自动绑定在window对象下
alert()这个函数本身也是一个window变量
var old_alert = window.alert;
//old_alert(x);
window.alert = function(){
}
window.alert(123);
window.alert = old_alert;
window.alert(456);
规范
由于所有的全局变量都会绑定到我们的window上。如果不同的js文件,使用了相同的全局变量
//唯一全局变量
var KuangApp = {};
//定义全局变量
KuangApp.name = 'kuangshen';
KuangApp.add = function (a,b) {
return a + b;
}
把自己的代码全部放入自己定义的唯一空间名字中,减少全局命名冲突的问题
jQuery
局部作用域let
function aaa(){
for (var i = 0; i < 100; i++){ //let
console.log(i);
}
console.log(i+1);//i出了这个作用域还可以使用
}
ES6 let关键字,解决局部作用域冲突问题var改为let
常量const
var PI = '3.14';
console.log(PI);
PI = '213'; //可以改变这个值
console.log(PI);
ES6引入常量关键字
const PI = '3.14'; //只读变量
console.log(PI);
方法
方法就是把函数放在对象的里面
var kuangshen = {
name: '秦疆',
birth: 2020,
//方法
age: function() {
// 今年 - 出生年
var now = new Date().getFullYear();
return now-this.birth;
}
}
//属性
kuangshen.name
//方法,一定要带()
kuangshen.age()
this始终指向调用它的人
function getAge() {
var now = new Date().getFullYear();
return now-this.birth;
}
var kuangshen = {
name: '秦疆',
birth: 2020,
//方法
age: getAge
};
//kuangshen.age() ok
//getAge() NaN
apply
在js中可以控制this的指向
getAge.apply(kuangshen,[]);
内部对象
Date
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(); //月
now.getDate(); //日
now.getDay(); //星期几
now.getHours();
now.getMinutes();
now.getSeconds();
now.getTime(); //时间戳 1578106175991
console.log(new Date(1578106175991)) //时间戳转为时间
转换
now = new Date(1578106175991)
now.toLocaleString() //"2020/1/4 上午10:49:35"
now.toGMTString()//"Sat, 04 Jan 2020 02:49:35 GMT"
JSON对象★
任何js支持的类型都可以用JSON来表示
- 对象都用{}
- 数组都用[]
- 所有的键值对 都是用 key:value
var user = {
name: "qinjiang",
age: 3,
sex: '男'
}
var jsonUser = JSON.stringify(user)
console.log(user)
{name: "qinjiang", age: 3, sex: "男"}
age: 3name: "qinjiang"
sex: "男"
__proto__: Object
console.log(jsonUser)
{"name":"qinjiang","age":3,"sex":"男"}
//字符串转化为对象,参数为json字符串
var obj = JSON.parse('{"name":"qinjiang","age":3,"sex":"男"}')
console.log(obj)
JSON和JS对象的区别
var obj = {a: 'hello', b: 'hellob'};
var json = '{"a": "hello", "b": "hellob"}';
面向对象编程
原型对象
var Student = {
name: "qinjiang",
age: 3,
run: function() {
console.log(this.name + " run....")
}
};
var xiaoming = {
name: "xiaoming"
};
xiaoming.__proto__ = Student;
var Bird = {
fly: function() {
console.log(this.name + " fly....");
}
};
xiaoming.__proto__ = Bird;
function Student(name) {
this.name = name;
}
Student.prototype.hello = function() {
alert('Hello')
};
class继承
ES6引入的
- 定义一个类,属性,方法
//定义一个学生的类
class Student{
constructor(name){
this.name = name;
}
hello(){
alert('hello')
}
}
var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");
xiaoming.hello()
- 继承
class XiaoStudent extends Student {
constructor(name,grade){
super(name);
this.grade = grade;
}
myGrade(){
alert('我是一名小学生')
}
}
var xiaohong = new XiaoStudent("xiaohong",1);
原型链
操作BOM对象(重点)
BOM:浏览器对象模型
window对象
window代表浏览器窗口
window.alert(1)
window.innerHeight
window.innerWidth
window.outerHeight
window.outerWidth
Navigator
封装了浏览器的信息
navigator.appName
navigator.appVersion
navigator.userAgent
screen
screen.width
screen.height
location(重要)
location代表当前页面的URL信息
host:"www.baidu.com"
href:"https://www.baidu.com/"
protocol:"https"
reload:f reload() //刷新网页
//设置新的地址
location.assign('https://bolg.kuangstudy.com/')
document
代表当前的页面
document.title
"百度一下,你就知道"
document.title='狂神说'
"狂神说"
获取具体文档树节点
<dl id="app">
<dt>Java</dt>
<dt>JavaSE</dt>
<dt>JavaEE</dt>
</dl>
<script>
var dl = document.getElementById('app');
</script>
获取cookie
document.cookie
劫持cookie原理
www.taobao.com
<script src="aa.js"></script>
<!--恶意人员:获取你的cookie上传到他的服务器-->
服务器端可以设置cookie:httpOnly
history(不建议使用)
history.back()
history.forward()
操作DOM对象(重点)
核心
浏览器网页就是一个Dom树形结构!
- 更新:更新Dom节点
- 遍历Dom节点
- 删除Dom节点
- 添加一个新的节点
要操作一个Dom节点,就必须要先获得这个Dom节点
获得Dom节点
<div id="father">
<h1>标题一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
//对应css选择器
var h1 = document.getElementsByTagName('h1');
var p1 = document.getElementById('p1');
var p2 = document.getElementsByClassName('p2');
var father = document.getElementById('father');
var childrens = father.children;//获取父节点下的所有子节点
//father.firstChild
//father.lastChild
</script>
这是原生代码,之后我们尽量都使用jQuery
更新节点
<div id="id1">
<h1>标题一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
//对应css选择器
var id1 = document.getElementById('id1');
</script>
操作文本
- id1.innerText='456'
- id1.innerHTML=
操作JS
id1.style.color = 'yellow';
id1.style.fontSize = '20px';
id1.style.padding = '2em';
删除节点
删除节点的步骤:先获取父节点,再通过父节点删除自己
<div id="id1">
<h1>标题一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script>
//对应css选择器
var self = document.getElementById('p1');
var father = p1.parentElement;
father.removeChild(self)
</script>
注意:删除多个节点的时候,children是在时刻变化的,删除节点的时候一定要注意
创建和插入节点
我们获得了某个Dom节点,假设为空,通过innerHTML就可以增加一个元素,非空就会产生覆盖
追加append
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var
js = document.getElementById('js'),
list = document.getElementById('list');
list.appendChild(js);
var newP = document.createElement('p');
newP.id = 'newP';
//newP.setAttribute('id','newP');
newP.innerText = 'Hello,Kuangshen'
list.appendChild(newP);
var myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript');
list.appendChild(myScript);
var myStyle = document.createElement('style');
myStyle.setAttribute('type','text/css');
myStyle.innerHTML = 'body{background-color: chartreuse;}';
document.getElementsByTagName('head')[0].appendChild(myStyle);
</script>
insert
<p id="js">JavaScript</p>
<div id="list">
<p id="se">JavaSE</p>
<p id="ee">JavaEE</p>
<p id="me">JavaME</p>
</div>
<script>
var ee = document.getElementById('ee');
var js = document.getElementById('js');
var list = document.getElementById('list');
list.insertBefore(js,ee)
</script>
操作表单(验证)
<form action="post">
<p>
<span>用户名:</span><input type="text" id="username" required>
</p>
<p>
<span>性别:</span>
<input type="radio" name="sex" value="man" id="boy"> 男
<input type="radio" name="sex" value="woman" id="girl"> 女
</p>
</form>
<script>
var input_text = document.getElementById('username');
input_text.value = '123' //修改输入框的值
var boy_radio = document.getElementById('boy');
var girl_radio = document.getElementById('girl');
//对于单选框、多选框等等固定的值,boy_radio.value只能取到当前的值
boy_radio.checked; //查看返回的结果,是否为true,如果为true,则被选中
</script>
提交表单
<!--按钮绑定提交事件-->
<form action="post">
<p>
<span>用户名:</span><input type="text" id="username" name="username">
</p>
<p>
<span>密码:</span><input type="text" id="password" name="password">
</p>
<button type="button" onclick="aaa()">提交</button>
</form>
<script>
function aaa(){
var uname = document.getElementById('username');
var pwd = document.getElementById('password');
console.log(uname.value);
pwd.value = md5(pwd.value);
console.log(pwd.value);
}
</script>
<!--按钮绑定提交事件-->
<form action="https://www.baidu.com/" method="post" onsubmit="return aaa()">
<p>
<span>用户名:</span><input type="text" id="username" name="username">
</p>
<p>
<span>密码:</span><input type="text" id="input-password">
</p>
<input type="hidden" id="md5-password" name="password">
<button type="button" onclick="aaa()">提交</button>
</form>
<script>
function aaa(){
var uname = document.getElementById('username');
var pwd = document.getElementById('input-password');
var md5pwd = document.getElementById('md5-password');
md5pwd.value = md5(pwd.value);
return false;
}
</script>
jQuery
jQuery库,里面存在大量的JavaScript函数
获取jQuery
cdn引入
公式:$(selector).action()
<a href="" id="test-jquery">点我</a>
<script>
//选择器就是css的选择器
$('#test-jquery').click(function(){
alert('hello,jquery');
})
</script>
选择器
<script>
//原生js,选择器少,麻烦不好记
//标签
document.getElementsByTagName();
//id
document.getElementById();
//类
document.getElementsByClassName();
//jQuery css中的选择器它全部都能用
$('p').click()
$('#id1').click()
$('.class1').click()
</script>
事件
鼠标事件,键盘事件,其他事件
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="lib/jquery-3.4.1.js"></script>
<style>
#divMove{
width: 500px;
height: 500px;
border: 1px solid red;
}
</style>
</head>
<!--要求-->
mouse : <span id="mouseMove"></span>
<div id="divMove">
在这里移动鼠标试试
</div>
<script>
$(function(){
$('#divMove').mousemove(function(e){
$('mouseMove').text('x:'+e.pageX + 'y:'+e.pageY)
})
});
</script>
操作DOM
节点文本操作
<ul id="test-ul">
<li class="js">JavaScript</li>
<li name="python">Python</li>
</ul>
<script>
$('#test-ul li[name=python]').text();//"Python",有参就是赋值
$('#test-ul').html('<strong>123</strong>');
</script>
css的操作
$('#test-ul li[name=python]').css("color","red");
元素的显示和隐藏
$('#test-ul li[name=python]').hide(); //display: none;
$('#test-ul li[name=python]').show();
娱乐测试
$(window).width()
$(window).height()
$(document).width()
ajax()
前端小技巧
- 如何巩固js(看jQuery源码,看游戏源码)
- 巩固html、css(扒网站,全部down下来,然后对应修改看效果)
Layer弹窗组件
Element-ui

浙公网安备 33010602011771号