夯基础 - JavaScript之重头再来


1. 引入JavaScript




  
  Title

  
  
  
  
  
  
  
  





2. 基本语法入门



浏览器调试工具

image-20210207154411674

3. 数据类型

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

number

js 不区分小数与整数,Number

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

字符串

‘abc’ “abc”

布尔值

true、false

逻辑运算

&& || !

?比较运算符

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

这是js的缺陷,不要使用 == 比较

ps:NaN === NaN 为false,与所有值包括自己都不等,只能通过isNaN(NaN) 判断

浮点数问题

console.log((1/3) === (1 - 2/3));    // 为false

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

null 和 undefined

空与未定义,不是一回事

数组

JS中不需要一系列相同类型的对象也可以称为数组

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

取越界数组下标会undefined

对象

对象是大括号,数组是中括号,每个属性用逗号隔开,最后不用

var person = {
  name: "快乐哥",
  age: "18",
  tags: ['js', 'vue', 'py']
}
//取对象的值
person.name
> "快乐哥"
person.age
> 18

3.1 严格检查模式


  

3.2 字符串

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

  2. 注意转义字符 \

    \'
    \n
    \t
    \u4e2d     // \u**** 为unicode字符
    \x41       //  Ascii字符
    
  3. 多行字符串编写 ES6新增

    // tab 上面的 反单引号 ``
    var msg = `
    	hello
    	world
    	dongdongqiang
    `
    
  4. 模板字符串

    // tab 上面的 反单引号 ``
    let name = 'zhang3';
    let age = '18';
    let msg = `hello ${name}`
    
  5. 一些方法、属性

    msg.length; 
    // 大小写转换的方法
    msg.toUpperCase()
    msg.toLowerCase()
    
    //判断字符
    msg.indexOf('x');
    // 截取
    student.substring(1);   // 从第一个字符截取到最后一个
    student.substring(1, 3);// 左闭右开 截取 [1, 3)
    

3.3 数组

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

var arr = [1,2,3,4,5,6];
> arr[0] = 1
  1. 长度 arr.length

    注意:给arr.length赋值,数组大小会发生变化,对数组长度缩减会丢失数据

  2. indexOf 获取元素下标索引

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

  4. push(); pop() 压入尾部与弹出尾部

  5. unshift(); shift() 压入头部与弹出头部

  6. arr.sort() 排序

  7. arr.reverse(); 数组反转

  8. arr.concat([1,2,3]); 连接数组但是没修改原数组

3.4 对象

若干个键值对

var 对象名 = {
  属性名 : 属性值,
  属性名 : 属性值,
  属性名 : 属性值
}
  1. 使用一个不存在的对象属性,不会报错! 返回 undefined

  2. 动态删减属性,通过delete删除对象的属性

    delete person.name
    > true  // 成功返回true
    
  3. 动态的添加,直接给新的属性添加值即可

    person.gender = 'male'  // 新添加gender属性
    
  4. 判断属性值是否在对象中 xxx in xxx

    'age' in person
    > true // 存在返回true
    // 继承特性
    'toString' in person
    > true
    
  5. 判断属性是否是对象自身(非继承) hasOwnProperty();

    person.hasOwnProperty('toString');
    > false
    person.hasOwnProperty('gender');
    > true
    

3.5 流程控制

if 条件判断

if(){
}else if(){
}else{
  
}

while循环

while(){
}

do.. while

do{
  
}while()

for 循环

for(){
  
}

forEach循环

var num = [1,2,3,4,5];
num.forEach(function(value){
  console.log(value)
})

for...in

// for(var index in object){}
for(var i in age){
  if(age.hasOwnProperty(i)){
    console.log("exist")
    console.log(age[i])
  }
}

3.6 Map和Set

ES6新特性

Map

// 学生的成绩与姓名
var map = new Map([['tom', 100], ['jack', 98], ['luca', 89]]);
var name = map.get('tom'); // 通过key获得value
map.set('admin', 12345); // 新增或修改
map.delete('tom'); // 删除

Set 无序不重复的集合

set.add(2); // 添加
set.delete(1); // 删除
console.log(set.has(3)); // 是否包含某个元素

3.7 iterator

es6新特性

遍历数组

// 通过for of / for in 下标
var arr = [3, 4, 5]
for(var x of arr){
  console.log(arr[x])
}

遍历map

var map = new Map([['tom', 100], ['jack', 98], ['luca', 89]]);
for(let x of map){
  console.log(x);
}

遍历set

var set = new Set([1,2,3,4,5,6,6]);
for(let x of set){
  console.log(x)
}

4. 函数及面向对象

4.1 函数定义及变量作用域

定义

定义方式一

// 定义一个绝对值函数
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){} 但是可以吧结果赋值出去进行调用

js可以传任意个参数,甚至不需要参数

// 手动抛出参数异常
var abs = function(x){
  if(typeof x !== 'number'){
    throw 'not a number!';
  }
  if(x >= 0){
    return x;
  }else{
    return -x;
  }
}

arguments 为js中特有的关键字,代表传递进来的所有参数,为数组

var abs = function(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;
  }
}

...reset

ES6 新特性,用以获取已经定义之外的所有参数

function abc(a,b, ...reset){
  console.log("a -> "+ a);
  console.log("b -> "+ b);
  console.log("others -> "+ reset); // 后面多余的以数组形式获取
}

作用域

在js中 ,var定义变量实际是有作用域的

在函数之外调用里面定义的量为闭包知识,后头说

而在不同函数中定义相同的变量名不会冲突的

内部函数可以访问外部函数的成员,反之不行

function fun(){
  var x = 1;
  // 内部函数可以访问外部函数的成员
  function fun2(){
    var y = x + 1;
  }
  var z = y + 1; // Uncaught ReferenceError: y is not defined
}

假设,内部函数变量和外部函数变量重名

function fun(){
  var x = 1;
  function fun2(){
    var x = 'A';
    console.log('inner' + x); // innerA
  }
  console.log('outer' + x); // outer1
  fun2();
}

假设js函数查找变量从自身开始,又内向外查找,假设外部存在变量,则内部会屏蔽外部的函数变量。

提升变量的作用域

function fun(){
  var x = "x" + y;
  console.log(x);
  var y = 'y';
}
// 输出结果为 undefined
// 说明js执行引擎自动提升了y的声明,但是不会提升y的赋值,所以没有报错而是undefined

全局函数,定义在函数外的,相当于绑定到全局变量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(x) 是可以输出的
window.alert = function(){
  
};
// 此时alert() 失效

规范

建议为了减少冲突而把自定义的变量上升为全局变量

// 唯一全局变量
var myVar = {};
// 定义全局变量
myVar.name = 'z3';
myVar.add = function(a, b){ // 定义一个自己变量的加函数
	return a + b;
};

把自己的代码放入自己的空间中

es6新增特性:局部作用域let

function fun(){
	for(let i = 0; i < 100; i ++){
    console.log(i) // 可以执行
  }
  console.log(i) // 不可以执行 因为 i 为 let定义的局部变量
}

const 常量

在es6之前,常量的定义仅为所有大写字母命名而成的变量,但是可以修改

const PI = '3.14'; // 这个新特性定义的const常量不可以被修改
PI = '123'; 
console.log(PI); // 此时报错 TypeError: Assignment to constant variable.

4.2 方法

定义方法

方法就是把函数放在对象里面,对象只有属性和方法

var myFun = {
  name: 'z3',
  birth: 2000,
  // 方法
  getAge: function(){
    // 当前 - 出生
    var age = new Date().getFullYear();
    // 注意this的指向
    return now - this.birth;
  }
}
// 属性
myFun.name
// 执行方法一定要带()
myFun.getAge()

拆开写函数

function outAge(){
  // 当前 - 出生
    var age = new Date().getFullYear();
    // 注意this的指向
    return now - this.birth;
}

var myFun = {
  name: 'z3',
  birth: 2000,
  // 方法
  age: outAge

}
// myFun.age(); 可以执行
// outAge(); 返回NaN 因为this指向window 自然没有对象

apply

function outAge(){
  // 当前 - 出生
    var age = new Date().getFullYear();
    // 注意this的指向
    return now - this.birth;
}

var myFun = {
  name: 'z3',
  birth: 2000,
  // 方法
  age: outAge

}
// outAge.apply(l4, []); // this指向 l4, 参数为空

4.3 ?闭包

4.4 箭头函数(新特性)

4.5 创建对象

var stu = {
  name:'z3',
  age : 18,
  gender: 'male',
  run : function(){
    console.log(this.name + 'is running');
  }
}

var xiaom = {
  name: 'xiaoming'
}

// proto 相当于一个父类,这里类似复制更改
xiaom.__proto__ = stu;
// 之后小明没有stu的方法时可以调用stu的run方法
// 以前定义一个类
fucntion Stu(name){
  this.name = name;
}
// 给stu新增一个方法
Stu.prototype.hello = function(){
  alert('hello');
};

4.6 class 继承(ES6新特性)

  1. 定义一个类、属性、方法
// 定义一个学生类
class Stu{
  constructor(name){
    this.name = name;
  }
  hello(){
    alert("hello")
  }
}

var xiaoming = new Stu("xiaoming");
var xiaohong = new Stu("xiaohong");
  1. 继承

    // 定义一个学生类
    class Stu{
      constructor(name){
        this.name = name;
      }
      hello(){
        alert("hello")
      }
    }
    
    class junior extends Stu{
      constructor(name, grade){
        super(name);
        this.grade = grade;
      }
      
      myGrade(){
        alert("i am a junior Stu")
      }
    }
    
    
    var xiaoming = new Stu("xiaoming");
    var xiaohong = new junior("xiaohong", 1);
    

?原型链继承

image-20210212150759427

5. 常用对象

5.1 Date

var now = new Date(); // 当前标准时间
now.getFullYear(); // 年
now.getMouth(); // 月
now.getDate(); // 日
now.getDay(); // 星期几
now.getHours(); // 时
now.getMinutes(); // 分
now.getSeconds(); // 秒

now.getTime(); // 时间戳 全球统一从1970 1.1 0:00:00 开始毫秒数
console.log(new Date(x)); // 将时间戳x转为标准时间
// 转换
now.toLocaleString // 调用的是一个方式,而不是属性
// 上一行报错 f toLocaleString(){ [native code] }
now.toLocaleString() 
now.toGMTString()

5.2 JSON

json 是什么?

  • JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
  • 它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在js中一切皆为对象,任何js支持的类型都可以用json来表示;number、string...

格式为:

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

JSON字符串和JS对象的转化

var user = {
  name:'z3',
  age : 18,
  gender: 'male'
}

// 对象转化为json字符串 {"name":"z3","age":18,"gender":"male"}
var jsonUser = JSON.stringify(user);

//json 字符串转为对象 参数为json字符串
var obj = JSON.parse('{"name":"z3","age":18,"gender":"male"}'); //键值对
// json 和 js对象的区别
// json
var jsonUser = '{"name":"z3","age":18,"gender":"male"}';

var obj = {a: 'hello', b:'world'};

5.3 Ajax

  • 原生js写法 xhr异步请求
  • jQuery封装好的方法 $(“#name”).ajax(“”)
  • axios 请求

6. 操作Dom元素

整个网页就是一个Dom树形结构,进行增删改查的操作

6.1 获得Dom节点

// 对应css选择器
var h1 = document.getElementByTagName('x');
var p1 = document.getElementById('x');
var p2 = document.getElementByClassName('x');
var fat = document.getElementByTagName('father');

var chi = fat.children; // 获取父节点下的所有子节点
// fat.firstChild  // 第一个子节点
// fat.lastChild   // 最后一个子节点

6.2 创建、插入DOM


  

js

se

ee

me

创建一个新的标签


6.3 更新DOM

  • ia.innerTetx = ‘aaaa’ 修改文本值

  • ia.innerHTML = ‘bbb 支持网页标签

  • //操作css
    ia.style.color = 'red'; // 属性使用字符串包裹
    ia.sytle.fontSize= '20px'; // 驼峰命名
    ia.style.padding = '2em'
    

6.4 删除DOM

先获取父节点,再通过父节点删除自己

title

p1

p2

7. 操作Bom元素

Bom浏览器对象模型

7.1 window

window.alert();
window.innerHeight; // 内部高度
window.innerWidth; // 内部宽度
window.outerHeight; // 外部高度
window.outerWidth; // 外部高度
...

7.2 navigator

大多数时候不会使用navigator ,因为可以人为修改,不建议使用

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

7.3 screen

screen.width
1920
screen.height
1080
// 尺寸信息

7.4 ?location

hash: ""
host: "new-tab-page"   // 主机
hostname: "new-tab-page"
href: "chrome://new-tab-page/"
origin: "chrome://new-tab-page"
pathname: "/"
port: ""
protocol: "chrome:"  // 协议
reload: ? reload()   // 重新加载 刷新网页
replace: ? replace()
search: ""
toString: ? toString()
valueOf: ? valueOf()
Symbol(Symbol.toPrimitive): undefined
__proto__: Location

// 重定向
location.assign('www.xxxx.com');

7.5 Document

HTML DOM 文档树

document.title
document.title = 'xxxxx'

document.getElementById('...')
document.cookie // 获取cookie

7.6 History

history.back();    // 后退
history.forward(); // 前进

7.7 操作表单

获得提交的信息

UserName:

Gender 男性 女性

提交表单的两种方法



md5 密码加密

  • 解决问题:用户输入了口令提交时,口令框的显示会突然从几个*变成32个*(因为MD5有32个字符)
  • 注意:idmd5-password标记了name="password",而用户输入的idinput-password没有name属性。没有name属性的的数据不会被提交。

7.8 操作文件

8. jQuery

把jQuery比作一个类库




  
  
  
  Document
  


  Click here!