上一章我们学完了样式,接下来我们开始学习js,废话不多说,直接进入学习哈!!
JavaScript概述
H5是一种新的技术,就目前而言,我们所知的H5都是一些标签,但是有了JS之后,这些标签深层的扩展功能才得以实现。
JavaScript是什么?
-
JavaScript是一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言
-
直译式:直接编译并执行,代码不进行预编译
-
脚本:凡是不能独立执行需要依赖其他程序的,通常都叫做脚本
-
HTML文件必须在浏览器里执行,JS文件必须嵌入到HTML文件里才能执行
-
脚本语言:依附于某个程序来运行,为某个程序提供服务的语言
-
动态类型:声明一个变量,能够随时改变它的类型
-
静态类型:声明一个变量,不能改变它的类型
-
弱类型:允许变量类型的隐式转换,允许强制类型转换(编译时检查很弱)
-
强类型:变量对象在编译时确定类型,不允许类型的隐式转换(编译时检查严格)
-
基于原型:原型的主要作用是继承,对象之间的继承,主要是靠原型链接
JavaScript能干什么?
- 前端网页开发(Javascript的老本行)
- 移动开发 webapp 混合式应用
- 网站后端开发(Node.js可以让js在后端运行)
- 插件开发(由于js跨平台这一特性,很多插件使用js进行开发,因为一次开发可以保证跨平台使用)
- 桌面开发(主要是指chrome浏览器能把js写的程序打包成桌面应用)
- 游戏开发 等等。。。
前端网页三剑客(HTML,CSS,JavaScript)
- Html:负责一个页面的结构(结构层)
- Css:负责一个页面的样式(样式层)
- JavaScript:负责与用户交互,加强用户体验(行为层)
js在前端网页中的作用:
- 校验数据
- 前后端数据交互
- 给网页增加动态功能
- 响应用户操作
- 加强用户体验 等等。。。
跨平台特性
跨平台概念是软件开发中一个重要的概念,即不依赖于操作系统,也不依赖硬件环境。一个操作系统下开发的应用,放到另一个操作系统下依然可以运行。
JavaScript简史
- 90年代 28.8kb/s
- 1995 网景Netscape2加入LiveScript,改名 JavaScript (布兰登·艾克)
- Nombas推出ScriptEase
- 微软在IE3中加入JScript
- 1997 ECMA TC39
ECMA-262
标准 命名ECMAScript
- JavaScript兼容于ECMA标准,通常也称为ECMAScript
JavaScript由三大部分组成:核心部分(ECMA-262)、文档对象模型(DOM)、浏览器对象模型(BOM)
- ECMA:欧洲计算机制造商协会European Computer Manufacturers Association
- TC39:ECMA的第39号技术专家委员会(简称TC39)负责制订ECMAScript标准,成员包括Microsoft、Mozilla、Google等大公司
ECMAScript(简称ES)版本名称:
-
1997年7月,ECMAScript 1.0发布。(ES1)
-
1998年6月,ECMAScript 2.0版发布。(ES2)
-
1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。(ES3)
-
2008年7月ECMAScript 4.0版本比较激进被废弃,替代方案将现有功能小幅度升级发布为ECMAScript 3.1,之后改名为ECMAScript 5,所以各类文章所说的ECMAScript 3.1等同于ECMAScript 5(ES5)
-
2011年6月,ECMAscript 5.1版发布,到了2012年底,所有主要浏览器都支持ECMAScript 5.1版的全部功能。(ES5)
-
在这之后,版本发布规则发生变化, 标准委员会决定,标准在每年的6月份正式发布一次,作为当年的正式版本。接下来的时间,就在这个版本的基础上做改动,直到下一年的6月份,草案就自然变成了新一年的版本,只要用年份标记就可以了。
-
2015年6月发布了ECMAScript 6.0 版本正式名称就是《ECMAScript 2015标准》(简称 ES2015)-> ES6
-
2016年6月小幅修订的《ECMAScript 2016标准》如期发布(简称 ES2016)-> ES7
-
2017(简称 ES2017)-> ES8
-
2018(简称 ES2018)-> ES9
-
2019(简称 ES2019)-> ES10
-
2020(简称 ES2020)-> ES11
…
学习参考文档
- JavaScript | MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
JS引入运行
内部引入:在html文件中直接写在script标签内部
<script type="text/javascript"> //type属性可以省略
alert('hello world');
</script>
标签内引入:直接写在标签内
<button onclick="alert('hello world');">按钮</button>
外部引入:在html文件中通过script标签的src属性引入外部js文件
<script src="test.js"></script>
思考:?
<script src="test.js">
alert('hello world');
</script>
常用调试方法
-
alert( ) 浏览器弹窗,弹出的内容就是()括号中的内容
-
console.log( ) 在控制台打印相关信息
-
document.write( ) 向文档写入字符串、html 或 javascript代码
- 注意:调试代码应当从最终的产品代码中删除掉
基本语法
- JavaScript大量借鉴了C类语言的语法,但JS的语法更加宽松
- JavaScript中的语句以一个分号 ; 结尾(不是硬性要求)
- JavaScript多条语句组合的代码块,以 { 开头,以 } 结尾
- JavaScript中的一切都区分大小写 (如 变量名、函数名等)
单行注释:
// 注释内容不可以换行
块级/多行注释:
/* 注释内容
可以换行
注释代码块 */
说明文档注释:
/**
* 文档说明的注释
* 用在插件或方法开头
* 说明参数及返回值等
*/
养成良好的代码注释习惯,既方便自己也方便他人!!
标识符
指变量
、函数
、属性名
或函数的参数名
(你自己起名字的东西)
标识符命名规范:
- 第一个字符必须是字母、下划线 _ 或美元符号 $
- 其他字符可以是字母、下划线、美元符号或数字
- 不能含有空格
- 不能以关键字或保留字命名
- 命名的基本原则(非必须):语义化,见名知意
- 驼峰命名法,userAgeNumber
- 帕斯卡命名法,UserAgeNumber
- 下划线命名法,user_age_number
- 匈牙利命名法,nUserAge,num_UserAge
ECMAScript 关键字
- ECMA-262 定义了 ECMAScript 支持的一套关键字(keyword)
- 这些关键字标识了 ECMAScript 语句的开头和/或结尾。根据规定,关键字是保留的,
不能用作标识符命名
break do try typeof
case else new instanceof
catch in return var
continue for switch while
function this with default
if throw delete ......
ECMAScript 保留字
- ECMA-262 定义了 ECMAScript 支持的一套保留字(reserved word)
- 保留字在某种意思上是为将来的关键字而保留的单词。因此保留字也
不能用作标识符命名
abstract int short boolean
export interface static byte
extends long super char
final native class float
throws const goto private
double import public ......
变量
- 变量是指没有固定的值,可以改变的数,是存储信息的容器
- 优点:方便使用,统一修改,方便维护
JS是松散类型的语言,变量可以用来保存任何类型的数据
JS中使用关键字 var 来声明变量:
- 关键字 变量名 赋值 数据
- var userName = ‘xiaocuo’;
- 左值:在等号左侧,是变量名
- 右值:在等号右侧,是存进变量中的数据
- 引用变量名:document.write( userName )
var声明变量的底层原理:
从本质上看,变量代表了一段可操作的内存,也可以认为变量是内存的符号化表示。当我们使用关键字var声明一个变量的时候,解析器根据变量的数据类型分配一定大小的内存空间。程序就可以通过变量名来访问对应的内存了。
常见错误类型
- SyntaxError:语法错误,出现语法错误时抛出
- ReferenceError:引用错误,读取不存在的变量时抛出
- TypeError:类型错误,值的类型发生错误的时候抛出
- RangeError:范围错误,数值超出合法范围时抛出
数据类型
简单数据类型(基本类型)
- 简单数据类型:string、number、boolean、undefined、null
string 类型,值为字符串
- JS中使用双引号或单引号表示字符串
- var str1 = ‘123’;
- var str2 = “abc”;
number 类型,值为数字
- var num1 = 123;
- var num2 = 123.45;
- JS中number类型包括整型、浮点型和非数字值
- NaN 即非数字值,是number类型中的一个特殊值
- NaN 用于表示本来要返回一个数值的操作数,结果未能返回数值的情况(‘a’-1) (‘b’-3)
- NaN有两个特点:(Not a Number)
- 任何涉及NAN的操作都会返回NaN
- NaN与任何值都不相等,包括它本身
- isNaN() 判断值是否为NaN,返回布尔值
- parseInt() 解析一个字符串,并返回一个整数
- parseFloat() 解析一个字符串,并返回一个浮点数
- Number.toFixed(n) 方法可把 Number 四舍五入保留n位小数,返回字符串
boolean 类型,值为布尔值
- boolean类型有两个值 : true 和 false
undefined 类型,表示值未定义
- undefined类型只有一个特殊值为 : undefined
- var und;
- 声明变量未赋值,这个变量的值就是undefined
null 类型,表示空
- null类型只有一个特殊值为 : null
- 如果变量准备在将来用于保存一个对象,那么该变量最好初始化为null
复杂数据类型(引用类型)
- 复杂数据类型:只有一种 object 类型
- object 类型,值为对象类型
- JS中 { } 表示对象,[ ] 表示数组,function 表示函数 他们都属于对象类型
- var obj1 = [1,2,3];
- var obj2 = {‘name’: ‘laowang’};
- var obj3 = function () { };
运算符
typeof 运算符
-
typeof 操作符返回一个用来表示数据类型的字符串
-
使用 typeof 操作符将会返回下列七个字符串之一:
console.log( typeof x )
typeof与后面的变量要有
空格
隔开- ‘undefined’ — 值为定义
- ‘boolean’ — 值是布尔值
- ‘string’ — 值是字符串
- ‘number’ — 值是数值
- ‘object’ — 值是对象、数组或null
- ‘function’ — 值是函数
- ‘Symbol’ — 值是Symbol类型
逗号运算符
- 使用逗号运算符可以在一条语句中执行多个操作,如:
- var a = 1, b = 2, c = 3;
- 返回整体的最后一个值
- console.log( (a,b,c) ); //c
赋值运算符
= += -= *= /= %=
- JS中的 ‘=’ 号并非数学计算中的’='号,而是赋值运算符
- 如:a = 5,应该理解为,把5这个值,赋值给变量 a
- var a = 1;
- a += 5 --> a = a + 5;
- console.log(a); // 6
算术运算符
+加 -减 *乘 /除 %取余
-
console.log(0/3); // 0
-
console.log(3/0); // Infinity
-
% 取余(求模),5%3 即 5对3取余 或 5模3
5%3 --> 2
9%3 --> 0
2%7 --> 2 7%4 --> 3
(-2)%7 --> -2 (-7)%4 --> -3
2%(-7) --> 2 (7)%(-4) --> 3
(-2)%(-7) --> -2 (-7)%(-4) --> -3
// 不考虑正负号,小的数模大的数,余小的数
// 余数的正负号,取决于第一个数的正负号
递增和递减运算符
- ++ 表示值递增加1
- – 表示值递减减1
- i++ 加加后置,先返回原始值,再递增+1
- ++i 加加前置,先递增+1,再返回递增之后的值
- 前置和后置的区别:在同一行才有区别,如果不在同一行,前置和后置都是加1,没啥区别
var i = 0;
++i 表示先递增,后取值
i++ 表示先取值,后递增
思考:?
var i = 4, v;
v = i++;
i = ++i;
alert(v);//4
alert(i);//6
var k = 0;
console.log(k++ + ++k + k * 2 + k++);//8
console.log(k);//3
关系运算符
> < == === >= <= != !==
- 关系运算符
返回布尔值
- 等于 == 只比较值是否相等(忽略类型)
- 全等 === 先比较类型(内存地址),再比较值
-
两个数字 --> 正常比较大小
-
两个字符串 --> 正常比较,比较字符的ASCII码值,
‘0’ – 48,‘A’ – 65,‘a’ – 97
-
一个数字与一个纯数字字符串,该字符串自动转成数字,再进行比较
console.log(2 == '2') console.log( 2 == Number('2') ) //隐式类型转换
-
一个数字与一个非纯数字字符串,不能正常比较,返回 false
console.log( 2 == Number('2px') ) Number('2px') -> NaN console.log( 2 == NaN )//false
三元运算符(三目运算符)
Boolean ? express1 : express2;
- 当Boolean为true时,执行express1并返回值
- 当Boolean为false时,执行express2并返回值
var str = 3 > 4 ? 'aaa' : 'bbb';
document.write(str);
优点:代码少
缺点:不方便阅读和维护
逻辑运算符
- 逻辑运算符
返回布尔值
- && 逻辑与,&&前后均为true才会返回true
- || 逻辑或,||前后有一个为true就会返回true
- ! 逻辑非,!求当前值的布尔值并取反
var res1 = true && false;//false
var res2 = false || true;//true
var res3 = !true;//false
- 短路操作
var a = 2, b = 3;
(a < b) && (a = 5);
alert(a);//5
var a = 4, b = 3;
(a < b) && (a = 5); //逻辑与,左边为false时不会再执行右边的代码
alert(a);//undefined
var a = 2, b = 3;
(a < b) || (a = 5);
alert(a);//undefined 逻辑或,左边为true时不会再执行右边的代码
var a = 4, b = 3;
(a < b) || (a = 5);
alert(a);//5
进制转换
-
进制也就是进位计数制,是人为定义的带进位的计数方法
-
十六进制是逢十六进一,十进制是逢十进一,八进制是逢八进一,二进制就是逢二进一 … 逢进制加一,原位归零
-
在javaScript中进制之间的转换提供了两个非常好用的方法:toString()、parseInt()。
-
使用 toString() 方法把十进制转为其他进制:
var x = 28;// 10进制
console.log(x.toString(2)); //把十进制转为2进制
console.log(x.toString(8));//把十进制转为8进制
console.log(x.toString(16));//把十进制转为16进制
- 使用 parseInt() 方法把其他进制转为十进制:
- parseInt() 方法,第一个参数为要转换的字符串,第二个参数指定字符串的进制
var x = "110";//二进制的字符串
console.log(parseInt(x, 2));//把这个字符串当做二进制,转为十进制
var x = "070";//八进制的字符串
console.log(parseInt(x, 8));//把这个字符串当做八进制,转为十进制
var x = "0x1c";//十六进制的字符串
console.log(parseInt(x, 16));//把这个字符串当做十六进制,转为十进制
-
在javaScript中,八进制以 0 开头,十六进制以 0x 开头,可省略
-
其他进制的相互转换,先使用parseInt转为十进制,再利用toString变为其他进制
在js中 0.1 + 0.2 != 0.3 为什么? 1.计算机中存储数字并不是存储十进制,所有数字转成二进制存储或计算 2.计算机在执行0.1+0.2时,会将这些十进制数转成二进制数再计算,然后再转成十进制返回结果 3.计算机存储数据有长度限制 4.二进制小数为数限制为52位 5.js存储数据使用 IEEE754双精度64位 存储 console.log( 0.1+0.2 )// 0.30000000000000004 十进制小数转成二进制: 小数*2 取乘积的整数部分(0 | 1),一直到乘积小数为0时转换结束 0.1 * 2 = 0.2 --> 0 0.2 * 2 = 0.4 --> 0 0.4 * 2 = 0.8 --> 0 0.8 * 2 = 1.6 --> 1 0.6 * 2 = 1.2 --> 1 0.2 * 2 = 0.4 --> 0 0.4 * 2 = 0.8 --> 0 0.8 * 2 = 1.6 --> 1 0.6 * 2 = 1.2 --> 1 0.2 * 2 = 0.4 --> 0 0.4 * 2 = 0.8 --> 0 0.8 * 2 = 1.6 --> 1 0.6 * 2 = 1.2 --> 1 0.2 * 2 = 0.4 --> 0 0.4 * 2 = 0.8 --> 0 0.8 * 2 = 1.6 --> 1 0.6 * 2 = 1.2 --> 1 0.2 * 2 = 0.4 --> 0 0.4 * 2 = 0.8 --> 0 0.8 * 2 = 1.6 --> 1 0.6 * 2 = 1.2 --> 1 ... 0.0 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 ...(52位) 同理 十进制0.2转成二进制小数位数也是无限多的。。。 两个不是十分精确的数相加 结果也是一个不精确的数
运算符优先级
- 参考地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
数据类型转换
强制转换(显式转换)
转为字符串
// 数据.toString( )方法,返回字符串值,不可以转null和undefined,会报错
var bool = true;
console.log( bool.toString() ); // 'true'
console.log( (123).toString() ); // '123'
// String( )方法,返回字符串值,所有值都能转
console.log( String(null) ); // 'null'
console.log( String(123) ); // '123'
转为数字
// Number( )方法,将数据转为数字类型
console.log( Number(true) ); // 1
console.log( Number(false) ); // 0
console.log( Number('123') ); // 123
console.log( Number('123a') ); // NaN
- parseInt( ) 与 parseFloat( ) 方法
- parseInt( )从左到右检测数据中不为数字的字符,并把之前解析到的数字值返回,如果第一个字符不为数字则返回NaN
- parseFloat( )与parseInt( )相似,parseInt( )解析整数,parseFloat( )解析浮点数
转为布尔值
// Boolean()方法,将数据转为布尔值
console.log( Boolean(2) ); // true
console.log( Boolean(0) ); // false
console.log( Boolean('abc') ); // true
console.log( Boolean('') ); // false
console.log( Boolean(null) ); // false
任何数据类型转为布尔类型的规则:
undefined、null、0、NaN、''(空字符串)及false本身,这六种数据会被转成false,其它所有数据都会被转成true
自动转换(隐式转换)
// x + y,当 + 两侧有一个是字符串类型,另一个是其它类型的时候,会先把其它类型转换成字符串再进行字符串拼接
console.log('123'+true);
console.log(123+'4');
console.log( 1 + true );
// x - y,当 - 两侧都是纯数字字符串,或者一个是纯数字字符串,一个是数字时,会先把字符串转成数字再进行减法运算
console.log('6'-'2');
console.log('6'-2);
// 还有 * / 与 - 是一样的转换规则:js会找到运算符最适合的类型并转换
// 逻辑运算符 && 、|| 、! 会发生自动类型转换
// !! 两次取反转换,保证了值没有变化,但类型已经被转为布尔值
var str = 'abc';
var bool = !!str;
console.log(bool);
// 关系运算符也会发生自动类型转换
undefined == null ->true ECMA规定的
undefined === null ->false 数据类型不同
number == string,会将string转换为number,再比较
number == boolean,会将boolean转换为number,再比较
// 非正常比较,全部返回false
对话框 prompt
prompt(str1,str2) 弹出可输入的对话框
- str1: 要显示在消息对话框中的文本
- str2:文本框中的内容
返回值:
- 点击确定按钮,文本框中的内容将作为函数的返回值
- 点击取消按钮,将返回null
- prompt得到的值都为字符串
下一篇:16.JS基础(二)
🌸友情推荐:全栈大佬笔记 Android领域肥宅