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>
  1. 正常字符串使用单引号或者双引号

  2. 注意转义字符

    \'
    \t
    \n
    \u4e2d 中   \u#### Uncode字符
    \x41   A  ASCII字符
    
  3. 多行字符串编写

    var msg = 
        `hello
        world
        你好ya
        你好`
    
  4. 模板字符串

    <script>
    	'use strict';
        let name = "qinjiang";
    	let age = 3;
    	let msg = `你好呀, ${name}`
    </script> 
    
  5. 字符串长度

    str.length
    
  6. 字符串的可变性:不可变

    image-20210314105315200

  7. 常用方法

    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
}
  1. 对象赋值

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

  3. 动态的删减、添加属性

    delete person.name
    person.haha = "haha"
    
  4. 判断属性值是否在这个对象中

    'age' in person //true
    'toString' in person //true
    
  5. 判断一个属性是否是这个对象自身拥有的

    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引入的

  1. 定义一个类,属性,方法
//定义一个学生的类
class Student{
    
    constructor(name){
        this.name = name;
    }
    
    hello(){
        alert('hello')
    }
    
}

var xiaoming = new Student("xiaoming");
var xiaohong = new Student("xiaohong");
xiaoming.hello()
  1. 继承
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()

前端小技巧

  1. 如何巩固js(看jQuery源码,看游戏源码)
  2. 巩固html、css(扒网站,全部down下来,然后对应修改看效果)

Layer弹窗组件

Element-ui

posted @ 2021-03-16 08:54  Barrymeng  阅读(58)  评论(0)    收藏  举报