JavaScript学习笔记——上
学习小工具:
HTML/CSS/JS 在线工具可以在线编辑 HTML、CSS、JS 代码,并实时查看效果
你也可以将优质代码保存分享:HTML/CSS/JS 在线工具
一、JavaScript 简介
1,HTML定义了网页的内容,CSS定义了网页的布局和网页中内容的样式,而JavaScript控制了网页的行为。
2,javascript是一种脚本语言。
3,javascript的主要使用范围
**JavaScript:直接写入HTML输入流:**ducument.write(“HTML语句”)
**JavaScript:对点击事件的反应:**onclick
**JavaScript:改变HTML内容:**DOM
**JavaScript:改变HTML图象:**更新图片链接
**JavaScript:改变HTML样式:**改变样式值
**JavaScript:验证输入:**可以用于验证用户的输入
二、JavaScript 用法
首先javascript的脚本代码必须写在<script></script>
标签中间,<script>
标签可以放在HTML的<body>
或<head>
部分中。
浏览器会解释并执行位于<script>
标签中的javascript代码
1,JavaScript函数与事件
直接写在<script>
标签中的代码会被浏览器直接解释并执行,通常我们需要再某个事件发生时再执行代码,所以我们需要用到函数,当我们把代码放进函数里面,就可以再事件发生时再调用该代码,比如用户点击按钮时。
记住在使用脚本函数时格式为函数名+()
<head>
<script>
function myFunction() {
document.getElementById('demo').innerHTML="我的第一个JavaScript函数";
}
</script>
</head>
<!--通常我们把script标签写在头部标签中-->
<body>
<p id='demo'>点击之后看效果</p>
<button onclick="myFunction()">Click me</button>
</body>
2,外部脚本文件js
也可以把JavaScript脚本写在外部文件中,再通过script标签引用进来使用。
let clickCount = 0; // 记录点击次数
function myFunction() {
const demoElement = document.getElementById("demo");
if (demoElement) {
clickCount++; // 增加点击次数
demoElement.innerHTML = "你点击了 " + clickCount + " 次!";
} else {
console.error("元素未找到:id 为 'demo' 的元素不存在!");
}
}
<p id="demo">点击按钮计数</p>
<button type="button" onclick="myFunction()">Click me</button>
注:上述脚本可以实现记录用户点击按钮的次数。
三、JavaScript 浏览器中运行
1,运行和调试
我们可以在浏览器中右击页面选择“检查”来开启开发者工具(或直接按F12)来在浏览器上对JavaScript代码的进行运行和调试。
2,Console控制台
可以直接在控制台Console窗口输入JavaScript代码进行调试。
3,脚本
可以在源代码–>片段中写自己的脚本并执行
四、JavaScript 输出
JavaScript 可以通过不同的方式来输出数据:
1,使用 window.alert()
弹出警告框。
window.alert()
和alert()
没有区别,只是有些编译器在输入window
之后会有提示window
中的方法。
window.alert('好好学习,天天向上!');
alert('好好学习,天天向上!');
2,使用 document.write()
方法将内容写到 HTML 文档中。
通过document.write()
可以把想要加在HTML文档中的内容加进去,但是如果在文档已经加载完之后再执行则会把整个HTML页面覆盖掉。
document.write('我学会写入方法了!');
//把下面的函数通过onclick绑定到一个页面按钮上,点击按钮就会把整个页面覆盖掉
function MyFunction(){
document.write('这段话会把整个页面覆盖掉');
}
3,使用 innerHTML
写入到 HTML 元素。
如果需要从JavaScript中访问一个HTML元素,可以使用document.getElementById(id)
方法。
而且可以通过innerHTML
来获取或插入元素内容。
和innerText的区别就是,innerHTML可以写入html语言,而innerText只能写入纯文本
<body>
<p id='demo'>
这是修改前的段落内容
</p>
<button type='button' onclick='MyFunction()'>
Click me!
</button>
<script>
function MyFunction(){
alert(document.getElementById('demo').innerHTML);
document.getElementById('demo').innerHTML="段落已修改";
}
</script>
</body>
4,使用 console.log() 写入到浏览器的控制台。
console
是控制台,用来调试JavaScript脚本,有四种常用方法:
方法 | 作用 |
---|---|
warn | 输出警告信息 |
log | 输出到日志 通常用这个来调试代码 |
info | 输出信息 |
error | 输出信息时,在前面加一个红叉,表示出错 |
五、JavaScript 语法
1,字面量
数字(Number)字面量可以是整数或者小数,或者是科学计数;
字符串(String)字面量可以使用单引号也可以使用双引号;
表达式字面量用于计算;
数组(Array)字面量定义一个数组;
对象(Object)字面量定义一个对象;
函数(Function)字面量定义一个函数。
2,变量
i,可以把变量看作存储数据的容器
ii,定义规则:
a,必须以字母、$或_开头,且对大小写很敏感
b,使用var
关键词来声明变量
c,也可以用let
或const
来声明
d,区别在于let
声明的变量在同一个作用域内不可再声明第二次
const
用于声明一个或多个常量,声明时必须进行初始化,且不可再更改
iii,也可以通过JavaScript变量来做算数,使用=和+这类运算符
3,操作符
算术运算符,赋值运算符等。
4,语句
用分号隔开。
5,关键字
abstract | else | instanceof | super |
boolean | enum | int | switch |
break | export | interface | synchronized |
byte | extends | let | this |
case | false | long | throw |
catch | final | native | throws |
char | finally | new | transient |
class | float | null | true |
const | for | package | try |
continue | function | private | typeof |
debugger | goto | protected | var |
default | if | public | void |
delete | implements | return | volatile |
do | import | short | while |
double | in | static | with |
6,注释
单行注释以//
开头
多行注释以/*
开头,以*/
结尾
7,函数写法
引用一个函数=调用函数(执行函数内的语句)
8,大小写
JavaScript对大小写比较敏感,例如函数getElementById
和getElemetbyID
是不同的。
六、JavaScript 语句
1,含义
JavaScript语句是发送给浏览器的命令,告诉浏览器要做的事情,
例如:下面的语句就是告诉浏览器向id="demo"
的HTML元素输出“你好!”
document.getElementById("demo").innerHTML="你好!";
2,写法
JavaScript语句要用分号隔开每句语句(只要不影响下一句或者上一句运行,也可以不隔开);
JavaScript会忽略多余的空格,不过空格一般不会影响语句执行,反而会提高可读性;
可以在文本字符串中使用反斜杠\
来对代码行进行换行,但是不能在非文本字符串中使用;
JavaScript是脚本语言,浏览器会在读取代码时,支行的执行脚本代码;
JavaScript可以分批地组合起来,可以理解为函数:
//以下代码块作用于向id为demo和myDIV的元素输出两个字符串
function MyFunction(){
document.getElementById("demo").innerHTML="Hello!";
document.getElementById("myDIV").innerHTML="How are you?";
}
3,语句标识符
语句 | 描述 |
---|---|
var | 声明一个变量 |
function | 定义一个函数 |
while | 当条件语句为true 时,执行语句块 |
do...while | 执行一个语句块,在条件语句为true 时继续执行该语句块 |
for...in | 用于遍历数组或者对象的属性(对数组或者对象的属性进行循环操作) |
for | 在条件语句为true 时,可以将代码块执行指定的次数 |
break | 用于跳出循环 |
continue | 跳过循环中的一个迭代 |
throw | 抛出(生成)错误 |
catch | 语句块,在try 语句块执行出错时执行 |
try | 实现错误处理,与catch一同使用 |
if...else | 用于基于不用的条件来执行不同的动作 |
switch | 用于基于不同条件来执行不同动作 |
return | 退出函数 |
七、JavaScript 数据类型
1,动态数据类型
JavaScript拥有动态类型,相同变量可用作不同类型;
变量数据类型可以使用typeof
操作符来查看。
2,字符串
字符串可以是引号中的任意文本,并且单引号或双引号都可以使用;
只要不匹配字符串的内容即可。
3,数字
JavaScript只有一种数字类型,可以带小数点也可以不带。
var x1 = 34.00;//34
var x2 = 34;//34
/*
js会自动把小数点后的0省略,如果想指定保留的小数位数
需要使用toFixed()函数来把数字转换成字符串,并指定保留小数位数
*/
var x3 = (34).toFixed(2);//34.00
4,布尔
ture
或false
5,数组
创建方法:
//创建之后再逐一赋值
var arr = new Array();
arr[0] = 'a';
arr[1] = 'b';
arr[2] = 'c';
//创建同时赋值
var arr01 = new Array('a', 'b', 'c');
//简写
var cars=['Saab', 'Volvo', 'BMW']
6,对象
对象由花括号分隔,在括号內部,对象的属性以名称和值对的形式来定义;
对象有两种寻址方式:直接寻址和间接寻址(使用.
或用名称)
属性由逗号分隔:
var person={
firstname : "John",
lastname : "Doe",
id : 5566
}
7,声明变量
当声明新变量时,可以使用关键词“new”来声明其类型:
var a = new String;
var b = new Number;
var c = new Boolean;
var d = new Array;
var e = new Object;
注:JavaScript变量均为对象,当您声明一个变量时,就相当于创建了一个新的对象。
八、JavaScript 对象
1,定义
JavaScript对象其实就是变量的容器,对象的属性和方法包裹成的一个代码块就是JavaScript对象。
2,初始化对象
var car = {
car.name = 'Fiat',
car.model = 500,
car.weight = 850kg,
car.color = 'white',
start:function(){
}
drive:function(){
},
break(){
},
stop(){
}
}
定义对象时,每个属性和方法之间要用','
隔开,不然有可能会编译失败;
写对象属性时的写法类似于Python的字典,只不过把冒号换成等于号;
写对象方法时有两种方式,方法名:function(){函数体}
,也可以把:function
省略掉。
3,属性和方法的访问
可以通过对象名.属性名
访问对象的属性;
访问方法时要注意在方法名之后加括号,如果不加括号则会返回方法的定义。
九、JavaScript 函数
1,对象里方法和JS函数的区别
函数是对js操作过程的封装,对象里的方法实质上也是js函数,不过js对象是变量的容器,容器内都是名称和值对的写法,所以js函数在对象外可以写成function 函数名()
,但是在对象内必须写成函数名:function()
。简单来说就是作用一样,写法不同。
2,函数声明
函数就是包裹在花括号中的代码块,前面用关键词function声明:
function functionName()
{
//执行代码
}
3,全局变量和局部变量
在函数外声明的变量称为全局变量,作用于全局,网页上所有的脚本和函数都可以访问它;
在js函数内声明的变量称为局部变量,作用于函数内部,只有该函数可以访问它;
你可以在不同函数声明相同名字的变量,只有声明其的函数可以访问;
局部变量会在函数运行以后被删除,而全局变量会在页面关闭之后再删除。
注:类似于私有属性和公有属性的定义
4,有参函数和有返回值函数
有参函数:
在定义函数时,把参数当作变量来声明,在调用函数的时候可以发送参数到函数里使用,参数顺序必须和定义时一致。
返回值:
return 返回值
语句在执行时会结束函数,并把返回值返回到函数,这时调用函数,函数就会称为一个值。
5,函数表达式
函数可以通过一个表达式定义,函数表达式存储在变量中:
var x = function(a,b){return a*b};
//把函数表达式存储在变量之后,变量就可以作为一个函数使用
var z = x(2,3);//z=6
函数表达式类似于python中的匿名函数,但是又不一样,js的函数表达式是把函数存储在一个变量中,之后还可以调用,但是匿名函数只在定义的时候可以使用一次,之后就会销毁,生命周期很短。
6,Function()
构造函数
不经常用,但是也可以构造函数:
var myFunction = new Function('a','b',return a*b);
var x = myFunction(3,4);
7,自调用函数(自执行函数)
此类函数在声明时会自动执行,且不需要声明函数名(这才是真正的匿名函数),在调用完后直接销毁。
(function(){
document.getElementById('demo').innerHTML='自我调用的匿名函数';
})();
//创建立即执行函数的四种方式
//一、
(function() {
alert("Brackets around the function");
})();
//二、
(function() {
alert("Brackets around the whole thing");
}());
//三、
!function() {
alert("Bitwise NOT operator starts the expression");
}();
//四、
+function() {
alert("Unary plus starts the expression");
}();
这种函数最常用的创建方法就是要把函数体用括号括起来,然后再在后面加一个括号,这样就会直接执行。
8,箭头函数
ES6新增了箭头函数,箭头函数表达式的语法比普通函数表达式更简洁。
/*
多个参数时:
(参数1, 参数2, …, 参数N) => { 函数声明 }
(参数1, 参数2, …, 参数N) => 表达式(单一)
// 相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }
单个参数时:
参数 => {函数声明}
*/
//实例:
// ES5
var x = function(x, y) {
return x * y;
}
// ES6
const x = (x, y) => x * y;
箭头函数是不能提升(就是可以在声明前调用,函数表达式也不可以提升)的,所以需要在使用之前定义;
使用 const 比使用 var 更安全,因为函数表达式始终是一个常量;
如果函数部分只是一个语句,则可以省略 return 关键字和大括号 {},这样做是一个比较好的习惯。
9,回调函数????(博主也没太学会)
十、JavaScript 函数闭包
1,概念
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在JavaScript中,闭包会随着函数的创建而被同时创建。
2,实例
//函数作为返回值
function test() {
const a = 1;
//函数定义
return function() {
//这里的a会去找上面的a
console.log('a: ',a);
}
}
const fn = test();
const a = 2;
//函数执行
fn();// a: 1
3,实用的闭包
function makeSizer(size){
return function() {
document.body.style.fontSize = size + 'px';
}
}
var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);
document.getElementById("size-12").onclick = size12;
document.getElementById("size-14").onclick = size14;
document.getElementById("size-16").onclick = size16;
实质上,makeSizer
是一个函数工厂,它创建了一个可以调整字体到指定大小的函数,然后下面实例时把字体大小当作参数传进去,实例化的三个函数都是闭包,它们共享相同的函数定义,但是保存了不同的词法环境。
4,词法环境
JS中的每个函数都有一个隐藏的属性叫做词法环境[[Environment]]
;
每个函数在执行中访问变量时都遵循一个原则——首先搜索内部词法环境,然后在搜索外部词法环境,再往外部搜索直到链的结尾,也就是从内至外搜索变量;
在函数执行完毕之后会把内部函数体全部销毁,所以为了可以多次调用并且变量不重置,就创造了闭包;
利用函数在执行完毕之后只销毁一层词法环境的特性,我们可以把函数嵌套使用,这样函数内部就会有两层词法环境,那么外层的词法环境在函数执行完毕时可以保留下来,从而实现多次使用,直到重新声明函数。
注:以上均为个人理解
十一、JavaScript 事件
1,定义
HTML事件是发生在HTML元素上的事情,当在HTML页面中使用JavaScript时,JavaScript可以触发这些事件。
2,常见的HTML事件
事件 | 描述 |
---|---|
onchange | HTML元素改变 |
onclick | 用户点击HTML元素 |
onmouseover | 用户指针移动到指定元素上时发生 |
onmouseout | 用户指针从一个HTML元素上移开时发生 |
onkeydown | 用户按下键盘按键 |
onload | 浏览器已完成页面的加载 |
3,JavaScript事件的发生
当HTML事件发生时,可以触发JavaScript的脚本,从而对HTML页面进行一些操作。
十二、JavaScript 条件语句
1,条件运算符
//语法:
variablename=(condition)?value1:value2;
//实例:
voteable=(age<18)?"年龄太小":"年龄已达到";
//判断age是否小于18,如果小于,则voteable="年龄太小",否则"年龄已到达"
2,if...else
语句
//语法
if(条件一){执行语句一;}else if(条件二){执行语句二;}else{执行语句三;}
//实例:本实例可以获取实时时间并判断是早上、白天还是晚上
var d = new Data();
var time = d.getHours();
if(time<10){
document.write("早上好");
}else if(time>=10&&time<20){
document.write("白天好");
}else{
document.write("晚上好");
};
3,switch() case
语句
switch
语句用来选择要执行条件比较多,执行多个代码块之一。
工作原理:首先设置表达式 n(通常是一个变量)。随后表达式的值会与结构中的每个 case 的值做比较。如果存在匹配,则与该 case 关联的代码块会被执行。请使用 break 来阻止代码自动地向下一个 case 运行。
var d=new Date().getDay();
switch (d)
{
case 0:x="今天是星期日";
break;
case 1:x="今天是星期一";
break;
case 2:x="今天是星期二";
break;
case 3:x="今天是星期三";
break;
case 4:x="今天是星期四";
break;
case 5:x="今天是星期五";
break;
case 6:x="今天是星期六";
break;
}
如果不加break
则会从判断条件匹配那一条开始把之后的语句全部执行一遍,直到执行完毕或执行到break
。
十三、JavaScript 循环
1,for
循环
如果有一个模块需要反复输出相同语句或只改变其中一个值的多条相同语句,就可以使用循环语句。
/*语法:
语句 1 (代码块)开始前执行
语句 2 定义运行循环(代码块)的条件
语句 3 在循环(代码块)已被执行之后执行
*/
for (语句 1; 语句 2; 语句 3)
{
被执行的代码块
}
//一般写法
document.write("这是第1个模块"+"<br />");
document.write("这是第2个模块"+"<br />");
document.write("这是第3个模块"+"<br />");
document.write("这是第4个模块"+"<br />");
document.write("这是第5个模块"+"<br />");
document.write("这是第6个模块"+"<br />");
document.write("这是第7个模块"+"<br />");
document.write("这是第8个模块"+"<br />");
document.write("这是第9个模块"+"<br />");
document.write("这是第10个模块"+"<br />");
document.write("这是第11个模块"+"<br />");
document.write("这是第12个模块"+"<br />");
//循环写法
var num = 12;
for (var i=1;i<=num;i++)
{
document.write("这是第个"+i+"模块" + "<br>");
}
2,for/in循环
//语法:
for(x in 遍历对象)
{
代码块;
};
//实例:
var person={fname:"Bill",lname:"Gates",age:56};
//遍历对象里的所有属性
for (x in person) // x 为属性名
{
txt=txt + person[x];
document.write(txt)
};
3,while
/do...while
循环
只要循环条件为真就可以一直循环代码
//语法:
while(循环条件){
循环体;
};
do{
循环体;
}while(循环条件);
//实例:
var i = 0;
while(i<5){
document.write(这是第个"+i+"模块+ "<br>");
i++;
}
//do...while语句至少会执行一次循环体
do{
document.write(这是第个"+i+"模块+ "<br>");
i++;
}while(i<5)
4,break
和continue
语句
break
语句用于跳出循环。
continue
用于跳过循环中的一个迭代。
十四、JavaScript null 和 undefined
null只是表示空值,有对象引用,但是没有值,类型是对象object
;
undefined是一种数据类型,表示没有赋值的变量;
两者的区别就是,值相等,但是数据类型不同;
也就是说:
null === undefined;//false
null == undefined;//true
typeof null;//object
typeof undefined;//undefined
十五、JavaScript 类型转换
1,typeof
操作符
你可以使用typeof
操作符来查看JavaScript变量的数据类型。
2,constructor
属性
constructor
属性会返回对象的构造函数:
"John".constructor // 返回函数 String() { [native code] }
(3.14).constructor // 返回函数 Number() { [native code] }
false.constructor // 返回函数 Boolean() { [native code] }
[1,2,3,4].constructor // 返回函数 Array() { [native code] }
{name:'John', age:34}.constructor // 返回函数 Object() { [native code] }
new Date().constructor // 返回函数 Date() { [native code] }
function () {}.constructor // 返回函数 Function(){ [native code] }
//如何判断一个对象的类型
function isDate(object){
//得到对象的
return object.constructor.toString.indexOf("Date") > -1;
}
3,将数字转换成字符串
全局方法String()
可以把任何类型的数字,字母,变量或者表达式转换成字符串;
Number
方法中的toString()
也有同样效果。
4,将布尔值转换成字符串
String()
或toString()
5,将日期转换成字符串
Date()
可以直接返回字符串;
全局方法String()
转换字符串;
Date
方法toString()
可以转换字符串。
6,转换成数字
全局方法Number()
可以将字符串,布尔值和日期转换成数字;