文章目录
简介
运行JavaScript
两种方法:
1.使用javascript:前缀构建执行JavaScript代码的URL
<body>
<a href="javascript:alert('运行!');">运行JavaScript</a>
</body>
2.使用<script…/>元素来包含JavaScript代码
<body>
<script type="text/javascript">
alert("运行");
</script>
</body>
导入JavaScript文件
<script type="text/javascript" src="test.js"></script>
使用script元素的defer推迟脚本执行
defer属性告诉浏览器要等整个页面载入之后、解析完毕之后才执行<script…/>元素中的脚本。
该属性只能作用于外部脚本文件,它对于<script…/>元素内嵌的脚本不起作用。
<script type="text/javascript" src="test.js" defer></script>
使用script元素的async异步执行脚本
在传统模式下,浏览器会按照从上到下的方式解析HTML页面的元素。指定async属性的<script…/>元素会启动新线程、异步执行<script…/>元素导入的脚本文件,浏览器也会继续向下解析、处理页面内容。
该属性只能作用于外部脚本文件,它对于<script…/>元素内嵌的脚本不起作用。
<script type="text/javascript" src="test.js" async></script>
noscript元素
该元素用来向不支持JavaScript或禁用了JavaScript的浏览器显示提示信息。用法:直接在该元素内放提示信息即可,无须指定任何属性。
<noscript>
该浏览器不支持JavaScript
</noscript>
数据类型和变量
定义变量的方式
1.隐式定义
直接给变量赋值。
<script type="text/javascript">
a = "Hello";
alert(a);
</script>
2.显示定义
使用var关键字定义变量。
<script type="text/javascript">
var a;
a = "Hello";
alert(a);
</script>
使用过程中变量的数据类型可以随意改变。JavaScript中的变量是区分大小写的。
类型转换
JavaScript支持自动类型转换。
值 | 字符串类型 | 数值型 | 布尔型 | 对象 |
---|---|---|---|---|
undefined | “undefined” | NaN | false | Error |
null | “null” | 0 | false | Error |
字符串 | 不变 | 数字或NaN | true | String对象 |
空字符串 | 不变 | 0 | false | String对象 |
0 | ”0“ | 0 | false | Number对象 |
NaN | “NaN” | NaN | false | Number对象 |
Infinity | ”Infinity“ | Infinity | true | Number对象 |
-Infinity | ”-Infinity“ | -Infinity | true | Number对象 |
数值 | 数值字符串 | 不变 | true | Number对象 |
true | “true” | 1 | 不变 | Boolean对象 |
false | “false” | 0 | 不变 | Boolean对象 |
对象 | toString()返回值 | valueOf(),toString()或NaN | true | 不变 |
强制类型转换
- toString() 将布尔值、数值等转换成字符串。
- parseInt() 将字符串、布尔值等转换成整数。
- parseFloat() 将字符串、布尔值等转换成浮点数。
当使用parseInt()或parseFloat()时注意:
- 字符串值 若是一个数值字符串,则可以转换成一个数值,否则将被转换成NaN。
- undefined、null、布尔值及其他对象 一律转换成NaN。
当使用toString()时:转换结果全是object。
变量作用域
全局变量
- 在全局范围(不在函数内)定义的变量(不管是否使用var)
- 不使用var定义的变量(在函数里不用var定义也是全局变量)
局部变量
- 在函数里定义的变量(使用var定义),离开函数失效。
如果全局变量和局部变量使用相同的变量名,则局部变量将覆盖全局变量。
JavaScript的变量没有块范围,即在if语句块内定义的变量,在块外也可以使用。
定义变量用var和不用var的区别:
- 使用var定义,程序将强制定义一个新变量。
- 不使用var定义,程序总将该变量当成全局变量。如果前面定义了同名的全局变量,此时就是对已有的全局变量赋值;如果前面没有定义,此时就是定义一个新的全局变量。
变量提升
变量声明总是被解释”提升“到函数体的顶部。
示例:
<script type="text/javascript">
var str = "全局变量";
function test(){
document.writeln(str + "<br>");
var str = "局部变量”;
document.writeln(str + "<br>");
}
test();
</script>
执行结果:
undefined
局部变量
上面test()函数等同于如下形式:
function test(){
var str;
document.writeln(str + "<br>");
str = "局部变量”;
document.writeln(str + "<br>");
}
- 变量提升只是提升变量声明部分,并不会提升变量赋值部分。
- 变量提升不需要定义变量的语句真正执行,只要在函数中包括了定义变量的语句,该变量声明就会被提升到函数体的顶部。
新增的let变量
var定义变量存在的问题:
- 没有块作用域
- 全局变量会自动添加全局window对象的属性
- 会提前装载(即变量提升)
let变量解决了上述问题。
使用const定义常量
只能在定义时指定初始值(且必须指定,如果不指定,会出错),以后不允许再改变。
const MAX_AGE = 120;
基本数据类型
数值类型
包含整数或浮点数。
科学技术法:以E为间隔符号,E不区分大小写。
<script type="text/javascript">
var a,b;
a = 5E2;
b = 1.23e-3;
</script>
如果数值只有小数部分,则可以省略整数部分的0,但小数点不能省略。
a = .43e3;
JavaScript除了支持十进制外,也支持十六进制数和八进制数。
a = 0x12; //十六进制
b = 014; //八进制
当数值变量的值超出了其表数范围时,将出现两个特殊值:Infinity(正无穷大)和-Infinity(负无穷大)。
- Infinity与-Infinity之间可以进行算术运算,结果为NaN。
- 与其他普通数值进行算术运算时,得到的结果仍然是无穷大。
- 两个Infinity总是相等,两个-Infinity总是相等。
- JavaScript中的算术运算允许除数为0,正数除零的结果是Infinity,负数除零的结果是-Infinity,零除零的结果是NaN。
NaN,表示非数,即Not a Number。0除0,两个无穷大执行算术运算都将产生NaN。NaN不与任何数值变量相等,NaN==NaN返回false。JavaScript提供isNaN()函数来判断某个变量是否为NaN。
特殊值通过JavaScript的内嵌类Number访问。
Number类的常量 | 特殊值 |
---|---|
Number.MAX_VALUE | 数值型变量允许的最大值 |
Number.MIN_VALUE | 数值型变量允许的最小值 |
Number.POSITIVE_INFINITY | Infinity(正无穷大) |
Number.NEGATIVE_INFINITY | -Infinity(负无穷大) |
Number.NaN | NaN(非数) |
对于浮点数值的比较,由于精度丢失的问题,建议使用差值比较法——判断两个浮点型变量是否相等,通过判断两个浮点型变量的差值,只要差值小于一个足够小的数即可认为相等。
字符串类型
必须用引号括起来,可以单引号,也可以是双引号。
JavaScript没有字符类型。
JavaScript以String内建类表示字符串,该类的基本方法:
- String() 类似面向对象的构造器,可以构建一个字符串。
- charAt() 获取字符串指定索引处的字符。
- charCodeAt() 获取字符串指定索引处的字符的Unicode值。
- length 属性,直接返回字符串长度,JavaScript中的中文字符算一个字符。
- toUpperCase() 将所有字母转换成大写字母
- toLowerCase() 将所有字母转换成小写字母
- fromCharCode() 静态方法,直接通过String类调用该方法 ,将一系列Unicode值转换成字符串。
- indexOf() 返回字符串中特定字符串第一次出现的位置。
- lastIndexOf() 返回字符串中特定字符串最后一次出现的位置。
- substring() 返回字符串的某个子串。
- slice() 返回字符串的某个子串,功能比substring()更强大,支持负数参数。
- match() 使用正则表达式搜索目标子字符串。
- search() 使用正则表达式搜索目标子字符串。
- concat() 用于将多个字符串拼加成一个字符串。
- split() 将某个字符串分隔成多个字符串,可以指定分隔符。
- replace() 将字符串中某个子串以特定字符串替代。
indexOf()和lastIndexOf() 用于判断某个子串的位置。
- indexOf(searchString [, startIndex])
- lastIndexOf(searchString [, startIndex])
searchString为要搜索的字符串,startIndex为搜索起始位置。如果字符串中没有包含目标字符串,则返回-1。
substring()和slice()
- substring(start [, end]) ,从start开始,到end之前(不包含end),要是没有end参数,将从start处一直截取到字符串尾。
- slice(start [, end]),与substring()的功能基本一致,区别是可以接受负数作为索引,当使用负索引值时,表示从字符串的右边开始计算索引,即最右边的索引为-1。(可以将负索引值转为 正索引值=字符串长度+负索引值)
match()和search() 都支持使用正则表示式作为子串
- match() 返回值为字符串数组或null,如果搜索到匹配子串,则返回字符串数组;否则返回null。
- search() 返回值为整型变量,如果搜索到匹配子串,则返回子串的索引值;否则返回-1.
如果要在字符串中使用单引号、双引号等特殊字符,则必须使用转义字符。
- \b 退格
- \t 制表符
- \n 换行
- \v 垂直制表符
- \r 回车
- " 双引号
- ’ 单引号
- \ 反斜线
- \OOO 八进制
- \xHH 十六进制
- \uHHHH 十六进制(该数值指定)