JavaScript 简介
JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script language),指的是它不具备开发操作系统的能力,而是只用来编写控制其他大型应用程序(比如浏览器)的“脚本”
从语法角度看,JavaScript 语言是一种“对象模型”语言,运行时由解释器直接执行
两个部分:基本的语法构造(比如操作符、控制结构、语句)和标准库(就是一系列具有各种功能的对象比如Array、Date、Math等) API(即只能在该环境使用的接口)
浏览器: 浏览器控制类:操作浏览器 DOM 类:操作网页的各种元素 Web 类:实现互联网的各种功能
一、基本语法
1.1语句
语句以分号结尾,一个分号就表示一个语句结束。多个语句可以写在一行内
2.变量
2.1变量基本概念
变量是对“值”的具名引用。变量就是为“值”起名,然后引用这个名字,就等同于引用这个值。变量的名字就是变量名。
var a = 1;
JavaScript 的变量名区分大小写,A和a是两个不同的变量。 如果只是声明变量而没有赋值,则该变量的值是undefined。undefined是一个特殊的值,表示无定义
可以在同一条var命令中声明多个变量。 使用var重新声明一个已经存在的变量,是无效的,但是,如果第二次声明的时候还进行了赋值,则会覆盖掉前面的值。
2.2变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部
2.3标识符
标识符(identifier)指的是用来识别各种值的合法名称。最常见的标识符就是变量名,以及后面要提到的函数名
命名规则:
第一个字符,可以是任意 Unicode 字母(包括英文字母和其他语言的字母),以及美元符号($)和下划线(_)。 第二个字符及后面的字符,除了 Unicode 字母、美元符号和下划线,还可以用数字0-9。
中文是合法的标识符,可以用作变量名。
保留字,不能用作标识符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
2.4注释
一种是单行注释,用//起头;另一种是多行注释,放在/和/之间
< !–和-- >也被视为合法的单行注释
2.5区块
JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。
对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)
3、条件语句
** if、switch** if (布尔值) 语句;
// 或者 if (布尔值) 语句
switch语句内部采用的是“严格相等运算符”===
if (m === 3) {
// 满足条件时,执行的语句
} else {
// 不满足条件时,执行的语句
}
switch (fruit) {
case "banana":
// ...
break;
case "apple":
// ...
break;
default:
// ...
}
三元运算符(即该运算符需要三个运算子)?:,也可以用于逻辑判断。
(条件) ? 表达式1 : 表达式2
3.1循环语句
** while 循环**
while (条件) 语句;
// 或者 while (条件) 语句;
while语句的循环条件是一个表达式,必须放在圆括号中。代码块部分,如果只有一条语句,可以省略大括号,否则就必须加上大括号。
while (条件) { 语句; }
** for循环** for (初始化表达式; 条件; 递增表达式) 语句
// 或者
for (初始化表达式; 条件; 递增表达式) { 语句 }
do…while循环与while循环类似,唯一的区别就是先运行一次循环体,然后判断循环条件。 do 语句 while (条件);
// 或者 do { 语句 } while (条件);
3.2break 语句和 continue 语句
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。
break语句用于跳出代码块或循环,可用于while for 循环
continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
while (i < 100){
i++;
if (i % 2 === 0) continue;
console.log('i 当前为:' + i);
} ```
上面代码只有在i为奇数时,才会输出i的值。如果i为偶数,则直接进入下一轮循环。
### 3.3标签(label)
用于跳转到程序的任意位置
label:
语句
** 与break语句和continue语句配合使用,跳出特定的循环**
满足条件时,直接跳出双层循环
top:
for (var i = 0; i < 3; i++){
for (var j = 0; j < 3; j++){
if (i === 1 && j === 1) break top;
console.log('i=' + i + ', j=' + j);
}
}
二、数据类型
1、数据类型
JavaScript 的数据类型,共有七种。
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):文本(比如Hello World)。
- 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)。
- undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值。
- null:表示空值,即此处的值为空。
- 对象(object):各种值组成的集合。
- Symbol
值、字符串、布尔值这三种类型,合称为原始类(primitive type)
对象则称为合成类型
- 狭义的对象(object)
- 数组(array)
- 函数(function)
2、typeof 运算符
确定一个值到底是什么类型。
- typeof运算符
- instanceof运算符
- Object.prototype.toString方法
函数返回function typeof可以用来检查一个没有声明的变量,而不报错,没有用var命令声明,返回undefined
null的类型是object,这是由于历史原因造成的
3、null, undefined 和布尔值
在if语句中,它们都会被自动转为false,相等运算符(==)甚至直接报告两者相等。
区别:null是一个表示“空”的对象,转为数值时为0;undefined是一个表示"此处无定义"的原始值,转为数值时为NaN。
null表示空值 undefined表示“未定义”
布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示
会返回布尔值:
前置逻辑运算符: ! (Not) 相等运算符:=,!,==,!= 比较运算符:>,>=,<,<=
以下六个值会转为false undefined null false 0 NaN ""或’’(空字符串
空数组([])和空对象({})对应的布尔值,都是true
4、数值
4.1、整数和浮点数
JavaScript 内部,所有数字都是以64位浮点数形式储存
某些运算只有整数才能完成,此时 JavaScript 会自动把64位浮点数,转成32位整数
注:浮点数不是精确的值 0.1 + 0.2 === 0.3 // false
0.3 / 0.1 // 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1) // false
4.2、数值精度
JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。
第1位:符号位,0表示正数,1表示负数 第2位到第12位(共11位):指数部分(决定数值大小) 第13位到第64位(共52位):小数部分(即有效数字)(有效数字,决定了数值的精度。)
精度为即-2^53到253
简单来说:JavaScript 对15位的十进制数都可以精确处理。
数值范围为21024到2-1023(开区间),超出这个范围的数无法表示。
如果一个数大于等于2的1024次方,那么就会发生“正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity。负向溢出”,这时会直接返回0
Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。
4.3、数值的表示法
字面形式直接表示,比如35(十进制)和0xFF(十六进制)。
数值也可以采用科学计数法表示
会自动将数值转为科学计数法表示 (1)小数点前的数字多于21位。 (2)小数点后的零多于5个。
JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。
十进制:没有前导0的数值。 八进制:有前缀0o或0O的数值,或者有前导0、且只用到0-7的八个阿拉伯数字的数值。 十六进制:有前缀0x或0X的数值。 二进制:有前缀0b或0B的数值。
4.4、特殊数值
- 正零和负零
唯一有区别的场合是,+0或-0当作分母,返回的值是不相等的。 面的代码之所以出现这样结果,是因为除以正零得到+Infinity,除以负零得到-Infinity
- NaN **数据类型依然属于Number** NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。 5 - 'x' // NaN Math.acos(2) // NaN Math.log(-1) // NaN Math.sqrt(-1) // NaN 0除以0也会得到NaN。
NaN不等于任何值,包括它本身 数组的indexOf方法内部使用的是严格相等运算符,所以该方法对NaN不成立。 NaN与任何数(包括它自己)的运算,得到的都是NaN。
- Infinity
Infinity表示“无穷”,一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到Infinity。
Infinity大于一切数值(除了NaN),-Infinity小于一切数值(除了NaN)。 Infinity与NaN比较,总是返回false。
- Infinity的四则运算,符合无穷的数学计算规则。
- 0乘以Infinity,返回NaN;0除以Infinity,返回0;Infinity除以0,返回Infinity
- Infinity加上或乘以Infinity,返回的还是Infinity。
- Infinity减去或除以Infinity,得到NaN。
- Infinity与null计算时,null会转成0,等同于与0的计算。
- Infinity与undefined计算,返回的都是NaN。
4.5、相关的全局方法
1、parseInt()
parseInt方法用于将字符串转为整数。 如果字符串头部有空格,空格会被自动去除。 parseInt的参数不是字符串,则会先转为字符串再转换。 parseInt(1.23) // 1
返回值:十进制整数/NaN。
如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分
如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN
parseInt('15e2') // 15
parseInt('15px') // 15
parseInt('+') // NaN
parseInt('+1') // 1
如果字符串以0x或0X开头,parseInt会将其按照十六进制数解析。
进制转换 默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制
parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000
如果第二个参数不是数值,会被自动转为一个整数。这个整数只有在2到36之间,才能得到有意义的结果,超出这个范围,则返回NaN。如果第二个参数是0、undefined和null,则直接忽略。
如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。如果最高位无法转换,则直接返回NaN。 parseInt(‘1546’, 2) // 1 parseInt(‘546’, 2) // NaN
2、parseFloat()
parseFloat方法用于将一个字符串转为浮点数。 如果字符串符合科学计数法,则会进行相应的转换。
包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分。
会自动过滤字符串前导的空格 parseFloat(’\t\v\r12.34\n ') // 12.34
如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN 会将空字符串转为NaN
3、isNaN()
判断一个值是否为NaN。 isNaN(NaN) // true isNaN(123) // false
只对数值有效,如果传入其他值,会被先转成数值,先使用Numbe函数r
isNaN(‘Hello’) // true // 相当于 isNaN(Number(‘Hello’)) // true
对于字符串、对象和数组,isNaN返回true 对于空数组和只有一个数值成员的数组,isNaN返回false
使用isNaN之前,最好判断一下数据类型 判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断。
function myIsNaN(value) { return value !== value; }
4、isFinite()
isFinite方法返回一个布尔值,表示某个值是否为正常的数值。
除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true。
|