javascript入门基础
创始人
2024-06-01 22:52:48
0

目录

前言

引入:html中嵌入javascript有三种方式

0. 变量(var、let)

1. 函数

1.1 普通函数 和 箭头函数

1.1.2 普通函数中的this

1.1.3 箭头函数没有自己的this

1.1.4 普通函数有arguments方法,箭头函数没有

1.1.5 箭头函数没有new.target

1.1.6 箭头函数没有变量提升

1.1.7 箭头函数不能作为构造函数使用

2、函数高级

2.1原型与原型链

2.1.1原型(prototype)

2.1.2显示原型与隐式原型

2.1.3原型链

2.1.4原型链属性问题

2.1.5 探索instanceof

2.1.6 原型面试题

2.2 闭包

2.2.1 理解闭包

2.2.2 常见的闭包

2.2.3 闭包的作用

2.2.4 闭包的生命周期

2.2.6 闭包的缺点及解决

2.3 Promise(异步)

Promise基础语法

Promise进阶语法

Promise.all的用法

3. 数据类型

3.0 基本类型、引用类型

3.1 String(简要)

3.2 Object(简要)

3.3 null、NaN和undefined 的区别

4. JS事件

4.1 常用事件

4.2 注册事件方式

4.3 设置节点的属性

4.4 捕捉回车键

4.5 JS的控制语句

5. DOM

5.1 文本框value

5.2 inner HTML和innerText属性

5.3 获取日期/日期 Date

6. BOM

6.1 open与close

6.2 弹出确认框

6.3 历史记录

6.4 设置地址栏的url

7. 有哪些方法可以通过浏览器往服务器发请求


前言

Java运行在JVM当中,JavaScript运行在浏览器的脚本语言在内存当中,完整的javascript由语言基础,BOM,DOM组成

JavaScript包括三大块:

  • ECMAScript:JS的核心语法(ES规范 / ECMA-262标准)
  • DOM:(Document Object Model)(文档对象模型:对网页当中的节点进行增删改的过程。)HTML文档被当做一棵DOM树来看待。
  • BOM:(Browser Object Model)(浏览器对象模型),比如:打开一个新的浏览器窗口、关闭浏览器窗口、后退、前进、浏览器地址栏上的地址等,都是BOM编程。

引入:html中嵌入javascript有三种方式

第一种方式事件句柄="js代码"


//window可以省略

第二种方式:javascript脚本块 


完整代码




HTML中嵌入JS代码的第二种方式

第三种方式:外部引入js文件


2.1.2显示原型与隐式原型

1.每个函数function都有一个prototype,即显示原型(属性)
2.每个实例对象都有一个__proto__,可称为隐式原型(属性)
3.对象的隐式原型的值为其对应构造函数的显示原型的值
4.总结:

  • 函数的prototype属性:在定义函数时自动添加的,默认值是一个空Object对象
  • 对象的__proto__属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
  • 能直接操作显示原型,但不能直接操作隐式原型(ES6之前)

图解

2.1.3原型链

原型链(别名:隐式原型链)
访问一个对象属性时,
先在自身属性中查找,找到返回
如果没有,再沿着__proto__这条链向上查找,找到返回
如果最终没有找到,则返回undefined

作用:
1.查找对象的属性(方法)
2.构造函数/原型/实体对象的关系(图解)
3.构造函数/原型/实体对象的关系2(图解)

     

图解

2.1.4原型链属性问题

1.读取对象的属性值时,会自动到原型链中查找
2.设置对象的属性值时,不会查找原型链,如果当前对象中没有此属性,直接添加此属性并设置其值
3.方法一般定义在原型中,属性一般通过构造函数定义在对象本身上

     

2.1.5 探索instanceof

1.instanceof是如何判断的?
表达式:A instanceof B
如果B函数的显示原型对象在A对象的原型链上,返回true,否则返回false

2.Function是通过new自己产生的实例

     

2.1.6 原型面试题


图解

2.2 闭包

2.2.1 理解闭包

1.如何产生闭包?
当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包。

2.闭包到底是什么?
理解一:闭包是嵌套的内部函数
理解二:包含被引用变量(函数)的对象
注:闭包存在于嵌套的内部函数中

3.产生闭包的条件?
函数嵌套
内部函数引用了外部函数的数据(变量/函数)

function fn1(){var a = 2;function fn2(){     //执行函数定义就会产生闭包(不用调用内部函数)console.log(a);}fn2();
}
fn1();

2.2.2 常见的闭包

1.将函数作为另一个函数的返回值
2.将函数作为实参传递给另一个函数调用

/***********************************************/
//普通函数
//计数:函数内部需要调用函数外的变量(非闭包)
let a = 10
function base(){ a++;console.log(a); 
}
base()
base()
a = 1000
base()/***********************************************/
//闭包写法
//计数:函数嵌套
function count(){ console.log('out');  let num = 10; //内部函数function inner(){ num++;console.log(num); } return inner; 
}const closure = count(); // 执行外部函数:输出out ,返回内部函数(闭包)
// 闭包的调用使得变量num 成为一个私有变量 
closure(); // 11
closure(); // 12       
num = 1000      
closure(); // 13                                                                                    

2.2.3 闭包的作用

闭包的作用

  • 使用函数内部的变量在函数执行完后,仍然存活在内存中(延长了局部变量的生命周期)
  • 让函数外部可以操作(读写)到函数内部的数据(变量/函数)

2.2.4 闭包的生命周期

  • 产生:在嵌套内部函数定义执行完时就产生了(不是在调用)
  • 死亡:在嵌套的内部函数成为垃圾对象时

2.2.6 闭包的缺点及解决

1.缺点:

  • 函数执行完后,函数内的局部变量没有释放,占用内存时间会变长
  • 容易造成内存泄漏

2.解决

  • 能不用闭包就不用
  • 及时释放

2.3 Promise(异步)

Promise 是一种异步编程的解决方案。

  • 简单来说,Promise是一个容器,里面包含着一个异步操作的结果
  • 从语法上来说,promise(小写的p)是一个对象,从它可以获取异步操作的最终状态
  • 而Promise是一个构造函数,自己身上由reject resolve all方法,原型上有then catch方法

Promise有三种状态,pending 初始态,fulfilled 成功状态,rejected失败状态,只有异步操作的结果可以决定当前是哪一种状态,其他任何操作都无法改变这个状态。Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆,只能由 pending变成fulfilled或者由pending变成rejected

Promise主要解决的问题

  • 回调地狱:第一个回调的结果,被内层的第二个回调所需要
  • promise可以支持多个并发的请求,获取并发请求中的数据
  • 这个promise可以解决异步的问题,本身不能说promise是异步的

Promise基础语法

/*Promise的语法+ Promise 是 ES6 内置的构造函数+ 语法:new Promise(function(){你要执行的异步的事情 })=> 实例化的时候,这个函数接收两个参数=> resolve,reject+ 语法:=>实例化对象身上由两个方法1. then()-> promise对象.then(function(){})2. catch()-> promise对象.catch(function(){})=> then方法的函数传递给了实例化的 resolve=> catch方法的函数传递给了实例化的 reject
*/const p = new Promise(function (resolve, reject) {// resolve是成功的回调函数 当你书写resolve()的时候,实际上是在调用then里面的函数// reject是失败的回调函数 当你书写reject()的时候,实际上是在调用catch里面的函数ajax({url: './server/a.php',dataType: 'json',success(res) {resolve(res)},error(err) {reject(err)}})
})// 在 new Promise里面做一些回调的事情
// 将回调的结果转移到外面 then catch中
// 在 promise中做一件异步的事情,把结果放在外部的函数中去执行
p.then(function (res) { console.log('我执行了', res) })
p.catch(function (err) { console.log('我失败了', err) })

Promise进阶语法

/*Promise的进阶语法+ 当你在一个 promise对象的 then里面返回一个新的 promise对象+ 你可以在这个 then的后面继续来一个 then接收第一个 then里面 promise对象的结果
*/new Promise(function (resolve, reject) {ajax({ur1: './server/a.php',dataType: 'json',success(res) {resolve(res)}})
})
.then(function (res) {console.log('需求1:', res)return new Promise(function (resolve, reject) {ajax({ur1: './server/b.php',data: res,dataType: 'json',success(res) {resolve(res)}})})
})
.then(function (res) {console.log('需求2:', res)return new Promise(function (resolve, reject) {ajax({url: './server/b.php',data: res,dataType: 'json',success(res) {resolve(res)}})})
})
.then(function (res) {

Promise.all的用法

const p1 = new Promise((resolve, reject) => {setTimeout(() => {resolve('结果1')}, 1000);
})
const p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('结果2')}, 1000);
})
const p3 = new Promise((resolve, reject) => {setTimeout(() => {resolve('结果3')}, 1000);
})// 三个都成功则成功,只要有一个失败就失败
// 成功时则会返回一个数组
Promise.all([p1, p2, p3]).then(res => {console.log(res);
})

3. 数据类型

3.0 基本类型、引用类型

数据类型有: 基本类型、引用类型

基本类型:

  • String: 任意字符串
  • Number: 任意的数字
  • boolean: true/false
  • undefined: 未定义
  • null: 空

引用类型:

  • Object:任意对象
  • Function:一种特别的对象(可以执行)
  • Array:一种特别的对象(数值下标,内部数据是有序的)
var i;
alert(typeof i); // "undefined"var k = 10;
alert(typeof k); // "number"var f = "abc";
alert(typeof f); // "string"var d = null;
alert(typeof d); // "object"  null属于Null类型,但是typeof运算符的结果是"object"var flag = false;
alert(typeof flag); // "boolean"var obj = new Object();
alert(typeof obj); // "object"function sayHello(){}
alert(typeof sayHello); // "function"

typeof:可以判断:undefined、数值、字符串、布尔值,不能判断: null与object object与array

instanceof:可以判断对象的具体类型

===:可以判断undefined、null

var d = null;
alert(typeof d); // "object"  null属于Null类型,但是typeof运算符的结果是"object"
typeof运算符的语法格式:typeof 变量名function sum(a, b){if(typeof a == "number" && typeof b == "number"){return a + b;}alert(a + "," + b + "必须都为数字!");
}

3.1 String(简要)

在JS当中字符串可以使用单引号,也可以使用双引号,String是一个内置的类,可以直接用,String的父类是Object。

var s = 'a234234';

常用函数

函数名功能
indexOf获取指定字符串在当前字符串中第一次出现处的索引
lastIndexOf获取指定字符串在当前字符串中最后一次出现处的索引
replace替换
split拆分字符串
substring截取子字符串
toLowerCase转换小写
toUpperCase

转换大写

alert("http://www.baidu.com".indexOf("http")); // 0
alert("http://www.baidu.com".indexOf("https")); // -1// 判断一个字符串中是否包含某个子字符串?
alert("http://www.baidu.com".indexOf("https") >= 0 ? "包含" : "不包含"); // 不包含// replace (注意:只替换了第一个)
alert("name=value%name=value%name=value".replace("%","&")); // name=value&name=value%name=value// 继续调用replace方法,就会替换第“二”个.
// 想全部替换需要使用正则表达式.
alert("name=value%name=value%name=value".replace("%","&").replace("%", "&")); // name=value&name=value&name=value

substr和substring的区别?

// substr(startIndex, length)
alert("abcdefxyz".substr(2,4)); //cdef,(下标,长度)
// substring(startIndex, endIndex) 注意:不包含endIndex
alert("abcdefxyz".substring(2,4)); //cd,【开始下标,结束下标)

3.2 Object(简要)

Object类型是所有类型的超类,自定义的任何类型,默认继承Object

实例

/* 
//定义函数的第一种方式
function User(a, b, c){ // a b c是形参,属于局部变量.// 声明属性 (this表示当前对象)// User类中有三个属性:sno/sname/sagethis.sno = a;this.sname = b;this.sage = c;
}// 创建对象
var u2 = new User(222, "jackson", 55);
alert(u2.sno);
alert(u2.sname);
alert(u2.sage);// 访问一个对象的属性,还可以使用这种语法
alert(u2["sno"]);
alert(u2["sname"]);
alert(u2["sage"]);
*///定义函数的第二种方式
Product = function(price){// 属性this.price = price;// 函数this.getPrice = function(){return this.price;}
}var xigua = new Product(4.0);
var pri = xigua.getPrice();
alert(pri);

动态扩展属性

属性有:prototype属性(常用的,主要是这个):作用是给类动态的扩展属性和函数。

// 可以通过prototype这个属性来给类动态扩展属性以及函数
Product.prototype.getPname = function(){return this.pname;
}// 调用后期扩展的getPname()函数
var pname = xigua.getPname();
alert(pname)// 给String扩展一个函数
String.prototype.suiyi = function(){alert("这是给String类型扩展的一个函数,叫做suiyi");
}"abc".suiyi();

JS语言怎么定义类,怎么创建对象?(弱类型)

User = function(username,password){this.username = username;this.password = password;
}
var u = new User();
var u = new User("zhangsan");
var u = new User("zhangsan","123");	

3.3 null、NaN和undefined 的区别

  • 数据类型不一致
  • ==(等同运算符:只判断值是否相等)
    ===(全等运算符:既判断值是否相等,又判断数据类型是否相等)
// null NaN undefined 数据类型不一致.
alert(typeof null); // "object"
alert(typeof NaN); // "number"
alert(typeof undefined); // "undefined"// null和undefined可以等同.
alert(null == NaN); // false
alert(null == undefined); // true
alert(undefined == NaN); // false// 在JS当中有两个比较特殊的运算符
alert(null === NaN); // false
alert(null === undefined); // false
alert(undefined === NaN); // false

4. JS事件

任何一个事件都会对应一个事件句柄,事件句柄是在事件前添加on

4.1 常用事件

blur失去焦点 、focus获得焦点
(所谓焦点是光标的获得与失去)

click鼠标单击、dblclick鼠标双击

keydown键盘按下、keyup键盘弹起

mousedown鼠标按下、mouseover鼠标经过
mousemove鼠标移动、mouseout鼠标离开
mouseup鼠标弹起

reset表单重置、submit表单提交

change下拉列表选中项改变,或文本框内容改变
select文本被选定
load页面加载完毕(整个HTML页面中所有的元素全部加载完毕之后发生。)
 

4.2 注册事件方式

  • 第一种注册方式:直接在标签中使用事件句柄


  • 第二种注册方式:使用js代码完成事件注册


4.3 设置节点的属性

通过点击一个按钮框,将其变为复选框


4.4 捕捉回车键

回车键的键值是13、ESC键的键值是27
按钮键是onclick,而回车键onkeydown

usernameElt.onkeydown = function(event){if(event.keyCode === 13){alert("正在进行验证....");}
}

4.5 JS的控制语句

var arr = [false,true,1,2,"abc",3.14]; 
for(var i = 0; i < arr.length; i++){alert(arr[i]);
}

for in结构

for(var i in arr){alert(arr[i]);
}

for in结构还可以遍历对象属性

// for..in语句可以遍历对象的属性
User = function(username,password){this.username = username;this.password = password;
}var u = new User("张三", "444");for(var item in u){alert(u[item]);//不用加双引号
}

with结构

with(u){alert(username + "," + password);
}

5. DOM

DOM:Document Object Model(文档对象模型)HTML文档被当做一棵DOM树来看待。

var domObj = document.getElementById("id");

DOM和BOM的区别

  • BOM的顶级对象是:window
  • DOM的顶级对象是:document
  • 实际上BOM是包括DOM的!

5.1 文本框value

1.通过点击按钮框获取value值



2.失去焦点对象获取value值,通过this指针




5.2 inner HTML和innerText属性

innerHTML会把后面的“字符串”当做一段HTML代码解释并执行。
innerText,即使后面是一段HTML代码,也只是将其当做普通的字符串来看待

5.3 获取日期/日期 Date

// 当以上格式不是自己想要的,可以通过日期获取年月日等信息,自定制日期格式.
var t = new Date();
var year = t.getFullYear(); // 返回年信息,以全格式返回.
var month = t.getMonth(); // 月份是:0-11
// var dayOfWeek = t.getDay(); // 获取的一周的第几天(0-6)
var day = t.getDate(); // 获取日信息.
document.write(year + "年" + (month+1) + "月" + day + "日");



6. BOM

BOM编程中,window对象是顶级对象,代表浏览器窗口

6.1 open与close

打开window.open();
关闭window.close();






将当前窗口设置为顶级窗口 代码演示

if(window.top != window.self){window.top.location = window.self.location;
}

6.2 弹出确认框

  • 消息框window.alert('消息框');
  • 确认框window.confirm('确认框');

6.3 历史记录

历史纪录的后退window.history().back();​​​​​​或window.history().go(-1);
历史纪录的前进window.open();



6.4 设置地址栏的url

var xx = window.location;
xx.href = "http://网址";
//或者window.location.href = "http://网址";
//或者window.location = "http://网址";
//或者document.location.href = "http://网址";同理href可以省略

7. 有哪些方法可以通过浏览器往服务器发请求

  1. 表单form的提交。
  2. 超链接。用户只能点击这个超链接
  3. document.location
  4. window.location
  5. window.open(“url”)
  6. 直接在浏览器地址栏上输入URL,然后回车。(这个也可以手动输入,提交数据也可以成为动态的。)

以上所有的请求方式均可以携带数据给服务器,只有通过表单提交的数据才是动态的

相关内容

热门资讯

王者定位怎么关安卓系统,轻松实... 你是不是也和我一样,对王者荣耀这款游戏爱得深沉呢?不过,有时候游戏里的设置让人头疼,比如安卓系统的王...
树莓派安卓系统流畅,打造便携式... 亲爱的读者们,你是否曾想过,将树莓派与安卓系统结合,会擦出怎样的火花呢?今天,就让我带你一起探索这个...
安卓系统智能机顶盒,引领家庭娱... 你有没有想过,家里的电视也能变得智能起来?没错,就是那个陪伴我们多年的老电视,现在也能摇身一变,成为...
安卓系统很差了吗现在,性能优劣... 最近是不是有不少朋友在讨论安卓系统的问题呢?有人说它越来越差了,也有人觉得它还是那个熟悉的“老朋友”...
安卓系统uc安装包,Andro... 你有没有发现,手机里的安卓系统越来越强大了?今天,咱们就来聊聊这个话题——安卓系统中的UC安装包。你...
安卓系统谷歌能删吗,谷歌能否删... 你有没有想过,那个一直陪伴你手机生活的安卓系统,它背后的谷歌爸爸,是不是也能被你随意删掉呢?这可不是...
安卓系统会不会更耗电,解析其功... 你有没有发现,手机用着用着,电池就有点不给力了?尤其是那些用安卓系统的手机,有时候感觉电就像流水一样...
安卓系统中无效目录,安卓系统无... 你有没有遇到过在安卓系统中,明明文件夹就在那里,但是就是找不到的情况?别急,今天就来给你揭秘安卓系统...
国产安卓机哪个系统好用,探寻最... 你有没有想过,国产安卓机哪个系统最好用呢?这可是个让人纠结的问题,毕竟每个系统都有它的特色和亮点。今...
安卓系统cpua9,引领性能与... 你有没有发现,最近你的安卓手机运行得是不是比以前顺畅多了?这可多亏了那个强大的安卓系统CPUA9啊!...
安卓系统usb驱动程序,功能、... 你有没有遇到过这种情况:手机里存了那么多宝贝照片和视频,想传输到电脑上保存,结果电脑却像个小顽皮,死...
安卓操作系统怎么关闭,轻松关闭... 手机里的安卓操作系统是不是有时候让你觉得有点儿烦呢?别急,今天就来手把手教你如何轻松关闭安卓操作系统...
追星手机壳推荐安卓系统,盘点热... 你有没有发现,现在追星族们对手机壳的热爱简直到了疯狂的地步?没错,就是那种能让你一秒变身偶像迷妹的手...
ios系统用安卓系统游戏下载软... 你有没有想过,明明是iOS系统的手机,却想玩安卓系统的游戏?这可不是什么天方夜谭,现在就有这么神奇的...
安卓高系统怎么用美化,打造专属... 亲爱的安卓用户们,你是不是也和我一样,对手机系统美化情有独钟呢?想要让你的安卓手机焕然一新,变得个性...
安卓系统怎么开夜间模式,安卓系... 亲爱的手机控们,你是不是在夜晚使用安卓手机时,眼睛感到有些不适?别担心,今天我要给你揭秘一个超级实用...
王者安卓系统用苹果人脸,一场视... 你知道吗?最近在手机圈里可是掀起了一股不小的波澜呢!那就是王者安卓系统竟然用上了苹果人脸识别技术!是...
安卓444怎么升级系统,轻松迈... 你那安卓444的小家伙是不是已经有点儿落伍了?别急,今天就来给你详细说说怎么给它来个系统升级,让它焕...
安卓系统raw修图软件,探索安... 你有没有发现,手机拍照越来越方便了,但有时候拍出来的照片还是不够完美呢?别急,今天就来给你安利几款安...
安卓系统的王者切换苹果,从安卓... 你知道吗?最近身边的朋友圈里掀起了一股热潮,那就是安卓系统的王者们纷纷切换到苹果阵营。这可真是让人大...