什么是JavaScript

概述

JavaScript是一门世界上最流行的脚本语言

历史

image-20220928134426703

 

快速入门

引入JavaScript

  1. 内部便签

    <script>
    ...
    </script>

     

  2. 外部引入

    wx.js

    //...

    text.html

    <script src="js/wx.js"></script>

     

 

基本语法

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script>
      //1.定义变量 变量类型 变量名 = 变量值
      var score = 83;
      alert(score);
      //2.条件控制
      if (score>60 && score<70){

          alert("60~70");
      } else if(score>70 && score<80){
          alert("70~80");
      }else {
          alert("other");
      }

      // 在浏览器的控制台打印
      // console.log(score)

  </script>
</head>
<body>

</body>
</html>

 

 

image-20220928153213717

数据类型

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

变量

var $a = 1;
var 王者荣耀 = "倔强青铜";

 

number

js不区分小数和整数,Number

123//整数123
123.1//浮点数123.1
1.123e3//科学计数法
-99 //负数
NaN //not a number
infinity //表示无限大

字符串

‘abc’,“abc”

布尔值

true,false

逻辑运算

&& 两个都为真,结果为真

|| 一个为真,结果为真

! 真即假,假即真

比较运算符

=
== 等于(类型不一样,值一样,也会判断为true)
=== 绝对等于(类型一样,值一样,结果true)

 

这是一个JS的缺陷,坚持不要使用==比较

须知:

- NaN===NaN,这个与所有的数值都不相等,包括自己
- 只能通过isNaN(NaN)来判断这个数是否是NaN

浮点数问题:

 console.log((1/3)===(1-2/3))

尽量避免使用浮点数进行运算,存在精度问题

 Math.abs(1/3-(1-2/3))<0.000000000000001

null 和 undefined

  • null 空

  • undefined 未定义

数组

Java的数组必须是相同的数据类型

 //保证代码的可读性,尽量使用[]
var arr = [1,2,3,4,5,6,'hello',null,true];

new Array(1,2,3,4);

取数组下标:如果越界了就会报undefined

对象

对象是大括号,数组是中括号

每个属性之间使用逗号隔开,最后一个不需要添加

var person ={
name:"wx",
age:1,
tags:[1,2,3]
};

取对象的值

person.name
person.age

严格检查模式

image-20220928160717938

 

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!--
idea 需要设置支持ES6语法
'use strict'严格检查模式,预防JavaScript随意性导致的一些问题
必须写在JavaScript的第一行
局部变量建议都使用let
-->
<script>
'use strict'
//全局变量
var i = 1;
//ES6 中要用let
let a = 2;
</script>
</head>
<body>

</body>
</html>

数据类型

字符串

  1. 正常字符串我们使用单引号或者双引号包裹

  2. 注意转译字符\

    \'
    \n
    \t
    \u4e2d unicode字符 中
    \x42 Ascll字符

     

  3. 多行字符串编写

    //tab键上边esc下边的键
    var msg = `
    111
    阿萨德
    aaa
    vvv

     

  4. 模板字符串

    let name = "wx";
    let age = 3;
    let msg = `你好,${name}`;
    console.log(msg);

     

  5. 字符串长度

    console.log(a.length)

     

  6. 字符串的可变性,不可变

    image-20220928161847371

     

     

  7. 大小写转换

    注意这里是方法,不是属性
    a.toUpperCase()
    a.toLowerCase()

     

  8. a..indexOf(‘w’)

  9. substring()

    a.substring(1)//从第一个字符串截取到最后一个字符串

    <<<<<<< HEAD

 

数组

Array可以包含任意的数据类型

var arr = [1,2,3,4,5,6];//通过下标取值和赋值
arr[0];
arr[0] =1;
  1. 长度

    arr.length

    注意:假如给arr.length赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失

  2. indexof,通过元素获得下标索引

    arr.indexof(2)
    var arr = [1,2,3,4,5,6,"1","2"];

    字符串和“1”和数字1是不同的

  3. slice() 截取Array的一部分,返回一个新数组,类似于String中的subString

  4. push,pop

    push:压入数据到尾部
    pop:弹出尾部的一个元素
  5. unshift(),shift()头部

    unshift:压入数据到头部
    shift:弹出头部的一个元素
  6. sort() 排序

    arr.sort()
  7. 元素反转

    arr.reverse()
  8. concat()

    arr.concat(['g','h'])
    (10) [1, '1', 2, 3, 4, 5, 6, 'a', 'g', 'h']
    console.log(arr)
    VM606:1 (8) [1, '1', 2, 3, 4, 5, 6, 'a']

    注意,concat()并没有修改数组,只是会返回一个新的数组

     

  9. 连接符join

    打印拼接数组,使用特定的字符串连接

    arr.join('-')
    '1-1-2-3-4-5-6-a'
    console.log(arr)
    VM650:1 (8) [1, '1', 2, 3, 4, 5, 6, 'a']

     

  10. 多维数组

    arr = [[1,2],[3,4],["a","b"]];

 

对象

若干个键值对

var 对象名 = {
属性名:属性值,
属性名:属性值,
属性名:属性值
}

//定义一个person对象
var person = {
name:"wx",
age:1
}

js中的对象,{…..}表示一个对象,键值对描述属性xxx:”xxxx”,多个属性之间用逗号隔开,最后一个属性不加逗号。

  1. 对象赋值

    person.name="wwww"
    'wwww'
  2. 使用一个不存在的对象属性,不会报错!undefined

    person.aa
    undefined

     

  3. 动态的删减属性

    delete person.age
    true

     

  4. 动态添加

    person.age = 22
    22
    person
    {name: 'wwww', age: 22}

     

  5. 判断属性值是否在这个对象中xxxx in xxxx

    'age' in person
    true
    //继承
    'tostring' in peron
    true

     

流程控制

if判断

 var  age = 3;
if (age>3){
alert("haha");
} else if (age<5){
alert("kuwa");
}else {
alert("wawa");
}

 

循环

 while (age<10){
age = age + 1;
console.log(age);
}

 

for循环

 for (let i = 0; i < 10; i++) {
console.log(i);
}

forEach循环

 var ages = [1,11,22,45,23,65];
//函数
ages.forEach(function (value) {
console.log(value);
})

for… in

 /*
* for(Type str : el)
* */
//for(var index in object)
for (var num in age){
console.log(age[num]);
}

Map 和 Set

Map

 var map = new Map([["tom",100],["jack",90],["dog",80]]);
let name = map.get("tom");//通过key获得value
map.set("admin",66);
console.log(name);

Set:无序不重复的集合

var set =  new Set([1,2,2,1,5,8]);
//set 可以去重
set.add(3);
set.delete(2);
set.has(3);

 

函数及面向对象

函数定义及变量作用域

绝对值函数

function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}

一旦指定到return代表函数结束,返回结果!

如果没有执行return,函数执行完也会返回结果,结果就是undefined

var abs = function(x){
if(x>=0){
return x;
}else{
return -x;
}
}

function(x){….}这是一个匿名函数。但是可以把结果复制给abs,通过abs就可以调用函数。

 

//不存在参数问题
var abs = function (x) {
//手动抛出异常
if (typeof x!== "number"){
throw 'Not a Number';
}
if(x>=0){
return x;
}else{
return -x;
}
}

 

arguments

arguments是JS免费赠送的一个关键字

  var abs = function (x) {

for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i])
}
if (arguments>1){
arguments[1];
}
if(x>=0){
return x;
}else{
return -x;
}
}

问题:arguments包含所有的参数,我们又时候想使用多余的参数来进行附加操作,需要排除已有的参数

rest

ES6引入的新特性,获取除了已经定义的参数之外的所有参数

var abs = function (a,b,...rest) {

console.log("a>"+a);
console.log("b>"+b);
console.log("rest>"+rest);
}

rest参数只能写在最后面,必须用…标识

 

变量作用域

在JavaScript中,var定义变量实际是由作用域的

 function wx(){
var x = 1;
x = x + 1;
}

x = x+2; //Uncaught ReferenceError: x is not defined

内部函数可以调用外部函数的成员,反之不行

 function wx(){
var x = 1;
//内部函数可以调用外部函数的成员
function wx1(){
var y = x + 1;
}
var x = y+1;
}

 

JavaScript中函数查找变量从自身函数开始,由内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。

function wx(){
var x = 1;
function wx1(){
var x = 'A';
console.log('inner'+x);
}
console.log('outer'+x);
wx1();
}
wx();

 

提升变量的作用域

function wx(){
var x = 'x'+y;
console.log(x);
var y = 'y';

}

结果:xundefined

说明:JavaScript执行引擎,自动提升了y的声明,但是不会提升y的赋值。

 function wx(){
var y ;
var x = 'x'+y;
console.log(x);
y = 'y';
}

所有的变量定义都放在函数的头部,不要乱发,便于代码维护

 function wx(){
var x,y,z,a;
a = 'aa';
}

 

全局函数

//全局变量
var x = 1;
function wx() {
console.log(x);
}

全局对象window

var x = 'xxx';
alert(x);
alert(window.x);//默认所有的全局变量都会绑定在window对象上

alert()这个函数本身也是一个window变量

var x = 'xxx';
window.alert(x);

var old_alert = window.alert();

old_alert('old>'+x);

window.alert = function () {

};
//alert失效了
window.alert('new>'+x);

//恢复
window.alert = old_alert;
window.alert('恢复>'+x);

JavaScript实际上只有一个全局作用域,任何变量(函数也可以),假设没有在函数作用范围内找到,就会向外查找,如果在全局作用域都没有找到就会报错,ReferenceError

规范

由于所有的全局变量都会绑定到window上,若果不通的js文件,使用了相同的全局变量,冲突。

 //唯一全局变量
var wx = {};

//定义全局变量
wx.name = "wx";
wx.add = function(a,b){
return a+b;
}

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突问题

 

局部作用域let

 function aa(){
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i+1);//i出了这个作用域还可以使用
}

ES6出了let这个关键字,解决局部作用域冲突

 function aa(){
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i+1);//Uncaught ReferenceError: i is not defined
}

建议使用let定义局部作用域的变量

const常量

在ES6之前,定义常量的时候只能用名字全大写约定

var PI = 3.14;
console.log(PI);
PI = 111;//可以改变这个值
console.log(PI);

在ES6中引入了常量关键字const

const PI = 3.14;//只读变量
console.log(PI);

方法

定义方法

方法就是把函数放在对象的里面,对象只有两个东西:属性和方法

 var wx = {
name:"wx",
birth:2002,
age:function () {
//今年-出生的鲶鱼
var now = new Date().getFullYear();
return now - this.birth;
},
};
//属性
wx.name
//方法要带括号
wx.age()

this代表什么,调用他的对象

 function getAge() {
//今年-出生
var now = new Date().getFullYear();
return now - this.birth;
}
var wx = {
name:"wx",
birth:2002,
age:getAge
};

wx.age();
getAge();//报错Nan

 

 

 

闭包

 

箭头函数

apply

在js中可以控制this的指向

function getAge() {
//今年-出生
var now = new Date().getFullYear();
return now - this.birth;
}
var wx = {
name:"wx",
birth:2002,
age:getAge
};

wx.age();
getAge.apply(wx,[]);// this 指向wx这个对象,参数为空

 

创建对象

  • 类:模板

  • 对象:具体的实例

    原型:

      var user = {
    name:"wx",
    age:3,
    sex:"男",
    run:function () {
    console.log(this.name+"run..");
    }
    };
    var bird = {
    fly:function () {
    console.log(this.name+"fly..")
    }
    }

    var xm = {
    name:"xm"
    };

    xm.__proto__ = bird

    ES6之前

     function student(name){
    this.name = name;
    }

    // 给student新增一个方法
    student.prototype.hello = function () {
    alert("111");
    }

class关键字是在ES6引入的

1、定义一个类,类中包含属性和方法

 //定义一个学生类
class student{
constructor(name){
this.name = name;
}

hell(){
alert("hello");
}
}
var xm = new student("xm");
var xh = new student("xh");

 

<script type="text/javascript">
'use strict'

// ES6之后
//定义一个学生类
class student{
constructor(name){
this.name = name;
}

hell(){
alert("hello");
}
}

class xStudent extends student{
constructor(name,grade){
super(name);
this.grade = grade;
}

mygrade(){
alert("我是一名小学生");
}
}
var xm = new student("xm");
var xh = new xStudent("xh");
</script>

本质:查看对象原型

 

class继承

 

原型链继承

原型链:

image-20220930135552669

常用对象

typeof 123
'number'
typeof '1'
'string'
typeof []
'object'
typeof {}
'object'
typeof NaN
'number'
typeof undefined

 

  1. Date

     var date = new Date();
            console.log(date);
            date.getFullYear();//年
            date.getMonth();//月
            date.getDate();//日
            date.getDay();//星期几
            date.getHours();//小时
            date.getMinutes();//分钟
            date.getSeconds();//秒
            date.getTime();//时间戳 1970 1.1 0:00开始
    
    
            //时间戳转换成时间
            console.log(new Date(15781221233));

    转换

    now = new Date(1664508078551);
    Fri Sep 30 2022 11:21:18 GMT+0800 (中国标准时间)
    now.toLocaleString()
    '2022/9/30 上午11:21:18'
    now.toGMTString()
    'Fri, 30 Sep 2022 03:21:18 GMT'

     

  2. JSON

    在JavaScript中一切皆为对象,任何js支持的类型都可以用JSON来表示

    格式:

    • 对象都用{}

    • s数组都用[]

    • 所有的键值对都使用key:value

    JSON字符串和JS对象的转换

     var user = {
                name:"wx",
                age:3,
                sex:"男"
            };
            //对象转换为json字符串
            var jsonUser = JSON.stringify(user);
    
    
            //json字符串转换为对象,参数为JSON字符串
            var objUser = JSON.parse('{"name":"wx","age":3,"sex":"男"}');

    JSON和JS对象的区别

    var obj = {a:'hello',b:'bb'};
    var josn = '{"a":"hello","b":"bb"}';

     

  3. Ajax

    • 原生的js写法 xhr异步请求

    • JQuery封装好的方法$(“#name”).ajax(“”)

    • axios请求

 

操作Dom元素

核心

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

  • 更新:更新Dom节点

  • 遍历Dom节点:得到Dom节点

  • 删除:删除一个Dom节点

  • 添加:添加一个新的节点

遥操作一个Dom节点,就必须要先获得这个Dom节点

获得Dom节点

	var h1 = document.getElementsByTagName('h1');
var p1 = document.getElementById('p1');
var p2 = document.getElementsByClassName('p2');
var fa = document.getElementById('faDiv');
var children = fa.children;
fa.firstChild;
fa.lastChild;

这是原生代码

更新节点

  • div1.innerText=”123″ 修改文本的值

  • div1.innerHTML = ‘123‘ 可以解析HTML文本标签

操作JS

  • div1.style.color=’red’

  • div1.style.fontSize=’20px’

删除节点

删除节点的步骤:需要先获取父节点,然后调用删除方法

<div id="faDiv">
<h1>标题一</h1>
<p id="p1">p1</p>
<p class="p2">p2</p>
</div>
<script type="text/javascript">
var fa = document.getElementById('faDiv');
var p1 = document.getElementById('p1');
var fath = p1.parentElement;
fa.removeChild(p1)
fath.removeChild(fath.children[0]);
fath.removeChild(fath.children[1]);
</script>

注意:删除多个节点的时候,children是在时刻变化的,删除节点的时候一点要注意。

插入节点

获得了某个Dom节点,假设这个Dom节点是空的,可以通过innerHTML就可以增加一个元素,但是这个DOM节点已经存在元素了,就不能这么做,会覆盖原有的节点

<p id="js">JavaScript</p>
<div id="list">
<p id="p1">p1</p>
<p id="p2">p2</p>
<p class="p3">p3</p>
</div>

<script type="text/javascript">
var js = document.getElementById('js');

var list = document.getElementById('list');

list.append(js);
</script>

image-20220930151438941

创建一个新的标签


var js = document.getElementById('js');

var list = document.getElementById('list');

list.append(js);
//通过JS创建一个新的节点
var newP = document.createElement('p');
newP.id = 'newP';
newP.innerText = '你好';
list.append(newP);

//创建一个标签节点
var myScript = document.createElement('script');
myScript.setAttribute('type','text/javascript');
list.append(myScript);

//创建style标签
var myStyle = document.createElement('style');
myStyle.setAttribute('type','text/css');
//设置内容
myStyle.innerHTML = 'body{}';

var head = document.getElementsByTagName('head')[0];
head.appendChild(myStyle);

insertBefore

var p2 = document.getElementById('p2');
//insertBefore(newNode,targetNode)
list.insertBefore(js,p2);

 

操作Bom元素

浏览器介绍

JavaScript和浏览器的关系?

JavaScript诞生就是为了能够让他再浏览器中运行!

BOM:浏览器对象模型

  • IE6~11

  • Chrome

  • Safari

  • FireFox

  • Opera

三方:

1. QQ浏览器
2. 360浏览器

Window 窗口信息

widnow代表浏览器窗口

window.alert(1)
undefined
window.innerHeight
980
window.innerWidth
957
window.outerHeight
1100
window.outerWidth
973
//可以调整浏览器窗口试试

Navigator

Navigator,封装了浏览器的信息

navigator.appName
'Netscape'
navigator.appVersion
'5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
navigator.userAgent
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
navigator.platform
'Win32'

大多数情况不会使用navigator对象,因为会信息会被人为修改

 

screen 屏幕尺寸

屏幕尺寸
screen.width
1920
screen.height
1080

 

location

location代表当前页面的URL信息

host: "localhost:63342"
hostname: "localhost"
href: "http://localhost:63342/wxStuSCB/javaScript-
reload: ƒ reload() //刷新网页
//设置新的地址
location.assign('http://www.baidu.com')

document 文档

document代表当前的页面

document.title
'Title'
document.title = 'wx'
'wx'

获取具体的文档数节点

<dl id="app">
<dt>Java</dt>
<dd>JavaSE</dd>
<dd>JavaEE</dd>
</dl>
<script type="text/javascript">
var app = document.getElementById('app');
</script>

获取cookie

document.cookie
''

劫持cookie

www.baidu.com

<script scr="aa.js"></script>
<!--恶意人员;获取你的cookie上传到他的服务器 -->

服务器端可以设置cookie:httpOnly

history

history代表浏览器的历史记录
history.back()//后退
history.forward() //前进

 

操作表单

表单是什么 form

  • 文本框 text

  • 下拉框 select

  • 单选框 radio

  • 多选框 checkbox

  • 隐藏域 hidden

  • …….

表单的目的:提交信息

获得要提交的表单信息

 //获取输入框的值
var username = document.getElementById('username');
//修改输入框的值
username.value = 'aaa';
</script>

 

提交表单 md5加密密码

<!--表单绑定提交事件
onsubmit 绑定一个提交检测的函数 true false

-->
<!--提交成功后跳转到百度-->
<form action="www.baidu.com" method="post" onsubmit="return checkForm()">
<p>
<span>用户名:</span><input type="text" id="username" name="username" required>
</p>
<p>
<span>密码:</span><input type="password" id="password" name="password" required>
</p>
<!-- &lt;!&ndash;单选框和多选框的值是定义好的&ndash;&gt;
<p>
<span>性别:</span>
<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女
</p>-->
<input type="submit" onclick="checkForm()">
</form>
<script type="text/javascript">
function checkForm() {
var username = document.getElementById('username');
var password = document.getElementById('password');
//MD5 算法
password.value = md5(password.value);
//验证表单信息
return true;
}

</script>

 

JQuery

JQuery库,里边存在大量的JavaScript函数

获取JQuery

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</head>
<body>
<a href="" id="test">点我</a>
<script type="text/javascript">

/*公式:$(selector).actioon();*/
$('#test').click(function () {
alert('hello');
});
</script>
</body>
</html>

选择器

$('p');//标签选择器
$('#id');//id选择器
$('.class');//class选择器

文档工具站:https://jquery.cuishifeng.cn

事件

鼠标事件、键盘事件、其他事件

image-20220930161248251

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<style>
#divm{
width: 300px;
height: 300px;
border: 1px solid red;
}
</style>
</head>
<body>

<!--获取当前数据的坐标-->
mouse:<span id="move"></span>
<div id="divm">
在这里移动试试

</div>

<script type="text/javascript">
//当网页元素加载完毕之后,响应时间
$(function () {
$('#divm').mousemove(function (e) {
$('#move').text('x:'+e.pageX+'y:'+e.pageY);
})
});
</script>
</body>
</html>

 

操作DOM

节点文本操作

$('#ul li[name=css]').text();//获取值
$('#ul li[name=css]').text('值');//设置值
$('#ul').html();
$('#ul').html('<strong>123</strong>');

css的操作

$('#ul').css({"color":"red"});

元素的显示和隐藏:本质display:none

 $('#ul').hidden();
$('#ul').show();

=======

d8891021df9a32e4cbb0641a7947525767ff3629

版权声明:本文为wx-36原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wx-36/p/16914523.html