一、JS语法与变量
1. 初始JavaScript
1.1 前端三层
语言 | 功能 | |
---|---|---|
结构层 | HTML | 搭建结构、放置部件、描述语义 |
样式层 | CSS | 美化网页、实现布局 |
行为层 | JavaScript | 实现交互效果、数据收发、表单验证等 |
1.2 JavaScript 体系
-
语言核心
-
ES5(现阶段学习目标)
-
ES6(后期学习目标)、ES7、ES8、ES9、……
-
-
DOM(操纵 HTML)
-
BOM(操作 浏览器)
1.3 JavaScript 的语言风格和特性
-
类 C 语言风格,容易上手
-
弱类型(动态类型),简单易学
-
丰富的功能,无敌的生态,强大的性能
弱类型既是 JS 的优点,也是 JS 的缺点!在 JS 诞生之初,JS 只是一个控制浏览器网页的小型脚本语言,所以最初设计 JS 时去掉了类型系统,因为类型系统需要涉及到复杂的语法校验和编译过程,得不偿失。后来随着前端的不断发展,JS 所开发的项目越来越复杂,JS 弱类型的特性反而变成了 JS 的劣势!所以最近几年微软出品的 TypeScript 越来越火,TS 就是一个 JS 的超集,在 JS 的基础上提供了类型系统的一门全新的语言,并且 TS 代码可以编译为纯 JS 代码运行到 JS 能运行的任何地方!所以 TypeScript 未来一定是前端开发的趋势……,我们在掌握好 JS 后,最好去学习一下 TS!
2. JS的书写位置
-
在
<body>
中的<script>
标签中书写 JS 代码 -
将 JS 代码单独保存为
.js
文件,然后在 HTML 文件中使用<script src=""></script>
引入
可以用";"断句,也可以不用。
2.1 在 <body> 中书写 JS 代码
在 <body>
中的 <script>
标签中书写 JS 代码
-
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!-- 在 HTML5 之前,必须要加上 type 属性,并且里面的内容一定要正确!--> <!-- <script type="text/javascript"> </script> --> <!-- 目前都是使用 HTML5,所以不用写 type 属性,默认就是 JS --> <!-- 推荐把 <script> 写到 body 的末尾(避免 JS 发生阻塞时页面受到牵连)--> <script> // 弹窗输出一句话 // 每一句 JS 代码以分号结尾! alert('你好,JavaScript!'); </script> </body> </html>
2.2 将 JS 代码单独保存为 .js 文件
将 JS 代码单独保存为 .js 文件,然后在 HTML 文件中使用 <script src=""></script>
引入
-
文件结构
-
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <!-- <script src="./js/index.js"></script> --> </head> <body> <!-- 也可以放在 body 末尾(推荐)--> <script src="./js/index.js"></script> </body> </html>
-
index.js
alert('你好,JavaScript!');
以上两种 JS 的书写方法,对于复杂的 js 代码,强烈推荐第二种!
3. 认识输出语句和输入语句
-
alert()
:弹出消息框 -
console.log()
:控制台输出
输出语句:
3.1 alert()
alert('周吉瑞');
alert:消息、警报
-
alert
是 JS 的内置函数----------------① -
调用函数需要使用圆括号
()
-
周吉瑞
是函数的参数,此处的参数是一个字符串(JS 的字符串用''
或""
包裹) -
JS 语句末尾需要以
;
结尾
注意事项:
JS 字符串支持
''
和""
,但是目前实际开发中''
用的更多,原因在于输入时可以不用按下 shift 键!JS 语法规定是需要在句末加上
;
表示结束的!但是即便你不加;
,JS 解析引擎也会帮你自动加上,但还是推荐手动加上;
,因为极少数情况下会出现意外!JS 语法中的任何符号都应该是英文状态下的符号!
【效果】
【功能】
在浏览器(JavaScript 引擎 例如:Chrome V8)解析到 JS 文件中的 alert()
语句时,便会中断 JS 脚本的执行,同时弹出消息框,直到用户单击确定后,才继续执行后续的 JS 脚本。
3.2 console.log()
console.log('周吉瑞');
console:控制台
log:记录、日志
-
console
是 JS 的内置对象------------------② -
通过对象 “打点” 可以调用其内部的
log
方法(所谓 “方法” 就是对象能够调用的函数)
【效果】
F12 打开浏览器调试面板,点击 Console 控制台菜单。
【功能】
在浏览器(JavaScript 引擎 例如:Chrome V8)解析到 JS 文件中的 console.log()
语句时,会直接在浏览器控制台输出语句,并自动继续执行后续的 JS 脚本。
3.3 document.write()
作用:向body内输出内容
注意:如果输出的内容写的是标签,也会被解析成网页元素
document.write('<h1>我是标题</h1>')中“我是标题”以h1的字体大小显示。
输入语句:
prompt
作用:显示一个对话框,对话框中包含一条文字信息,用来提示用户输入文字
prompt('请输入您的姓名:')
4. 变量
变量:计算机语言中能储存计算结果或能表示值的抽象概念。
变量不是数值本身,它们仅仅是一个用于存储数值的容器!
4.1 定义变量
补充:
js中主要通过如下3个关键字来声明变量的:
关键字 | 解释 |
---|---|
var | 早期ECMAScript5中用于变量声明的关键字 |
let | ECMAScript6中新增的用于变量声明的关键字,相比较var,let只在代码块内生效 |
const | 声明常量的,常量一旦声明,不能修改 |
在js中声明变量还需要注意如下几点:
-
JavaScript 是一门弱类型语言,变量可以存放不同类型的值 。
-
变量名需要遵循如下规则:
-
组成字符可以是任何字母、数字、下划线(_)或美元符号($)
-
数字不能开头
-
建议使用驼峰命名
-
要想使用变量,第一步就是声明它,并给它赋值。
var a = 24; var b = '周吉瑞';
-
var
定义变量的关键字 -
a
变量名 -
=
赋值符号 -
24
变量值
4.2 使用变量
当变量被赋值后,就可以使用它了。
console.log(a); console.log(b);
注意:使用变量时,变量名不能用引号包裹,否则会被识别为字符串!
4.3 改变变量的值
变量的值可以通过再次赋值被改变,改变变量的值时不需要再书写 var
关键字。
var a = 54; a = 24; console.log(a);
4.4 变量的合法命名
-
只能由
字母
、数字
、_
、$
组成,但不能以数字开头(建议普通代码一律以字母开头) -
不能是 关键字 或 保留字
-
变量名大小写敏感,a 和 A 是两个不同的变量
函数、类名、对象的属性等也都要遵守这个标识符的命名规则!
4.5 推荐的变量命名风格
-
小驼峰命名法:
mathTestScore
(吐血推荐) -
C 风格变量命名法:
math_test_score
驼峰命名法:Java、JavaScript
下划线命名法:C、C++、Python、Golang、SQL
4.6 变量的默认值
-
一个变量只定义,但没有赋初值,默认值是
undefined
(未定义) -
一个变量只有被
var
定义,并赋初值之后,才算正式初始化完成
var a; // 只定义但没有赋初值 console.log(a); // undefined a = 24; console.log(a); // 24
4.7 变量的常见错误
-
不用
var
定义,而直接将值赋予它,虽然不引发报错,但会产生严重的作用域问题。
请一律加上
var
!
a = 24; // 未使用 var 定义的变量默认为全局变量!成为 window 对象的属性。 console.log(a); // 24 console.log(window.a); // 24 console.log(window.a === a); // true
关于作用域的问题,后面会介绍。
-
尝试使用一个既没有被
var
定义过,也没有赋过值的变量,就会产生引用错误。
console.log(c); // index.js:1 Uncaught ReferenceError: c is not defined at index.js:1
使用 strict 严格模式
JavaScript 在设计之初,为了方便初学者学习,并不强制要求用
var
申明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var
申明就被使用,那么该变量就自动被申明为全局变量:i = 10; // i 现在是全局变量在同一个 HTML 页面的不同的 JavaScript 文件中,如果都不用
var
申明,恰好都使用了变量i
,将造成变量i
互相影响,产生难以调试的错误结果。使用
var
申明的变量则不是全局变量,它的范围被限制在该变量被申明的 JS 文件或函数体内(函数的概念将稍后讲解),同名变量在不同的函数体内互不冲突。为了修补 JavaScript 这一严重设计缺陷,ECMA 在后续规范中推出了 strict 模式,在 strict 模式下运行的 JavaScript 代码,强制通过
var
申明变量,未使用var
申明变量就使用的,将导致运行错误。启用 strict 模式的方法是在 JavaScript 代码的第一行写上:
"use strict";这是一个字符串,不支持 strict 模式的浏览器会把它当做一个字符串语句执行,支持 strict 模式的浏览器将开启 strict 模式运行 JavaScript。
"use strict"; abc = "Hello, world"; console.log(abc); // 如果浏览器支持 strict 模式, // 下面的代码将报 ReferenceError 错误:Uncaught ReferenceError: abc is not defined不用
var
申明的变量会被视为全局变量,为了避免这一缺陷,所有的 JavaScript 代码都推荐使用 strict 模式。提示:
"use strict"
语句可以放在 JS 代码的任意一行上,并且它只对它所在作用域下方的代码起作用。
4.8 等号表示赋值
var a = 10; a = a + 1; console.log(a); // 11 a = a - 1; console.log(a); // 10
4.9 同时声明多个变量
var a = 0, b = 1, c = 2; // 建议每行只声明一个变量
5. 变量声明提升
-
变量声明的提升:可以提前使用一个稍后才声明的变量,而不会引发异常
-
在执行所有代码前,JS 有预解析阶段,会预读所有变量的声明(不会提升赋值,只会提升定义)
// 先使用变量(不会报错) console.log(a); // undefined // 后定义变量 var a = 10; console.log(a); // 10
实际的情况相当于:
// 变量声明提升的只是定义,不提升赋值!!! var a; console.log(a); // undefined a = 10; console.log(a); // 10
【注意事项】
-
变量声明提升是 JS 的独有特性!
-
在实际开发中,不要刻意使用变量提升的特性,一定要先定义再使用!
-
严格模式对变量提升没有约束作用,严格模式是不对变量提升进行报错的!
二、JS基本数据类型
1 数据类型和检测
1.1 JavaScript中两大数据类型
(1)基本数据类型
JS 没有字符型(char),JS 的 String 是基本类型!
-
Number(数字)
-
String(字符串)
-
Boolean(布尔)
-
Undefined(未定义)
-
Null(空)
(2)复杂(引用)数据类型
-
Object(对象)
-
Array(数组)
-
Function(函数)
-
RegExp(正则表达式)
-
Date
-
Map (key,value)
-
Set 不允许重复,无序的
-
……
1.2 typeof 运算符
使用 typeof
运算符可以检测值或者变量的类型。
typeof 是一个运算符,而不是内置函数,所以不用加
()
,如果加了也不会报错,但是并不推荐!
typeof 5; // number typeof '周吉瑞'; // string
利用浏览器控制台进行交互测试……
console.log(typeof 5); console.log(typeof '周吉瑞'); var a = '5'; console.log(typeof a);
从以上测试也可以看出,JS 是一个弱类型的语言,变量值是什么类型,那么变量就是什么类型,而不用显式地指出变量的类型。
1.3 5种基本数据类型的 typeof 检测结果
类型名 | typeof 检测结果 | 值举例 |
---|---|---|
数字类型 | number | 5 、2.5 、-0.5 |
字符串类型 | string | '前端' 、"后端" 、'3.14' |
布尔类型 | boolean | true 、false |
undefined 类型 | undefined | undefined |
null 类型 | object(可以理解为空对象) | null |
2. Number(数字)类型
2.1 一切数都是数字类型
在 JS 中,所有数字不分大小、不分整浮、不分正负,都是数字类型。
typeof 925; // number typeof 0.5; // number typeof -24; // number
2.2 小数中 0 可以省略
在表达小数的时候,整数个位的 0
可以省略。
2.3 科学计数法
较大数或较小数可以写成科学计数法。
3e8; // 300000000 typeof 3e8; // number 3e-4; // 0.0003 typeof 3e-4; // number
2.4 不同进制的数字
(1)二进制数值以 0b
开头
0b10; // 2 0b1111; // 15
(2)八进制数值以 0
开头(代码中需要写成0o)
017; // 15
(3)十六进制数值以 0x
开头
0xf; // 15
2.5 一个特殊的数字型值 NaN
NaN
是 “not a number” 的意思,即 “不是一个数”,但它属于数字类型。
typeof NaN; // number
-
0 除以 0 的结果是 NaN,事实上,在 JS 数学运算中,若结果不能得到数字,其结果往往都是 NaN
-
NaN 有一个 “奇怪” 的性质:不自等(这个知识点将在后续课程中讲解)
0 / 0; // NaN 5 - 3; // 2 '我' - '你'; // NaN '我' * '你'; // NaN '我' / '你'; // NaN '我' + '你'; // "我你"(字符串遇到加法是拼接功能) NaN == NaN; // false(NaN 不自等)
再次强调:NaN 是一个值(特殊的值),不是类型。
3. String(字符串)类型
3.1 字符串的表示
字符串要用引号包裹,双引号或者单引号均可(无论用哪种,都应该保持风格统一)。
注意:大部分 JS 项目习惯约定使用单引号(因为可以减少按下 shift 键)。
typeof "周吉瑞"; // string 或 typeof '周吉瑞'; // string
数字 10
和字符串 '10'
在语义上是不同的,前者表示一个数量,后者是一个文本。
3.2 字符串的拼接
加号可以用来拼接多个字符串。
'周' + '吉瑞'; // "周吉瑞" 'abc' + 'd' + 'ef'; // "abcdef"
3.3 字符串和变量的拼接
要将一个变量的值 “插入” 到字符串中,要满足变量左右两边至少有一边 + 字符串。
var year = 2022; var str = '北京冬奥会在' + year + '年召开'; // "北京冬奥会在2022年召开" var a = 24; var str1 = 54 + a; // 78 var str2 = '54' + a; // "5424" 1 + '10'; // "110" 2 + ''; // "2"
3.4 空字符串
一些时候需要使用空字符串,直接书写闭合的引号对即可。
var str = ""; 或 var str = '';
空字符串可以用于将变量变为字符串!
var a = 24; console.log(typeof a); // number a = a + ''; console.log(a); // "24" console.log(typeof a); // string
3.5 字符串的 length 属性
通过对 String 类型 “打点” 的方式,可以调用其内置属性。
注意:在 JS 中,String 是基本类型,之所以 String 可以 “打点” 调用属性和方法,那是因为 JS 的解释器会自动将基本类型包装成对应的 Object 类型。
字符串的 length 属性表示字符串的长度。
'我喜欢JS'.length(; // 5 '我喜欢JS,我也喜欢TS'.length; // 12 ''.length; // 0
3.6 字符串的常用方法
通过对 String 类型 “打点” 的方式,可以调用其内置方法。
“方法” 就是能够打点调用的函数,字符串类型有丰富的内置方法。
方法 | 功能 |
---|---|
charAt() | 得到指定位置字符 |
substring() | 提取子串 |
substr() | 提取子串 |
slice() | 提取子串 |
toUpperCase() | 将字符串变为大写 |
toLowerCase() | 将字符串变为小写 |
indexOf() | 检索字符串 |
trim() | 删除首尾空格 |
trimStart() | 删除首部空格 |
trimEnd() | 删除尾部空格 |
3.6.1 charAt() 方法
charAt()
方法可以得到指定位置的字符。
字符串中的每个字符都按顺序编号,编号从 0 开始。
' | 我 | 喜 | 欢 | J | S | , | 我 | 也 | 喜 | 欢 | N | O | D | E | ' |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
'我喜欢JS,我也喜欢NODE'.charAt(0); // "我" '我喜欢JS,我也喜欢NODE'.charAt(5); // "," '我喜欢JS,我也喜欢NODE'.charAt(11); // "O" '我喜欢JS,我也喜欢NODE'.charAt(99); // "" '我喜欢JS,我也喜欢NODE'.charAt(-1); // ""
超出范围的输出空字符
""
。
3.6.2 substring()、substr() 和 slice() 方法
(1)substring(a, b)
方法得到从 a 开始到 b 结束(不包括 b 处)的子串 [a, b)
编程语言的区间一般都是:左闭右开!
'我喜欢JS,我也喜欢NODE'.substring(3, 5); // "JS" '我喜欢JS,我也喜欢NODE'.substring(10, 14); // "NODE" '我喜欢JS,我也喜欢NODE'.substring(10, 99); // "NODE" '我喜欢JS,我也喜欢NODE'.substring(-1, 4); // "我喜欢J"
超出范围的部分,取到端点字符!
-
substring(a, b)
方法如果省略第二个参数,返回的子串会一直到字符串的结尾
'我喜欢JS,我也喜欢NODE'.substring(6); // "我也喜欢NODE"
-
substring(a, b)
中,a 可以大于 b,数字顺序将自动调整为小数在前
应该没有人会这样用^^
'我喜欢JS,我也喜欢NODE'.substring(3, 5); // "JS" '我喜欢JS,我也喜欢NODE'.substring(5, 3); // "JS"
(2)substr(a, b)
中,将得到从 a 开始的长度为 b 的子串
'我喜欢JS,我也喜欢NODE'.substr(3, 2); // "JS"
-
substr(a, b)
中,b 可以省略,表示到字符串结尾
'我喜欢JS,我也喜欢NODE'.substr(3); // "JS,我也喜欢NODE"
-
substr(a, b)
中,a 可以是负数,表示倒数位置
倒数第一位为 -1,而不是 -0
'我喜欢JS,我也喜欢NODE'.substr(-4, 2); // "NO"
(3)slice(a, b)
方法得到从 a 开始到 b 结束(不包括 b 处)的子串
slice:切片
'我喜欢JS,我也喜欢NODE'.slice(3, 5); // "JS"
-
slice(a, b)
的参数 a 可以是负数(与 substring(a, b) 的区别)
'我喜欢JS,我也喜欢NODE'.slice(-4, -1); // "NOD" // (-4, -1):从 倒数第4位 到 倒数第1位,不包括 倒数第1位
-
slice(a, b) 中,参数 a 必须小于参数 b,否则便会返回一个空字符串
'我喜欢JS,我也喜欢NODE'.slice(5, 2); // ""
3.6.3 toUpperCase() 和 toLowerCase() 方法
-
toUpperCase()
转为大写 -
toLowerCase()
转为小写
'I Love You'.toUpperCase(); // "I LOVE YOU" 'IMooc'.toLowerCase(); // "imooc"
注意:toUpperCase() 和 toLowerCase(),只是返回一个大小写格式,变量本身的值并没有改变。
var str = "I Love You"; console.log(str.toUpperCase()); // "I LOVE YOU" console.log(str); // "I Love You" str = str.toUpperCase(); console.log(str); // "I LOVE YOU"
3.6.4 indexOf() 方法
indexOf()
方法返回某个指定的字符串值在字符串中首次出现的位置
如果要检索的字符串没有出现,则返回 -1
这个方法用于判断字符串是否包含目标子串时特别有用!
'abcdebb'.indexOf('b'); // 1 'abcdebb'.indexOf('deb'); // 3 'abcdebb'.indexOf('m'); // -1
3.6.5 trim()、trimStart()、trimEnd() 方法
// 删除首尾空格 console.log('---' + ' 123 '.trim() + '---'); // 删除首部空格 console.log('---' + ' 123 '.trimStart() + '---'); // 删除尾部空格 console.log('---' + ' 123 '.trimEnd() + '---'); /* ---123--- ---123 --- --- 123--- */
4. 数据类型的转换
4.1 其他值 ——> 数字
4.1.1 使用 Number() 函数
Number()
函数是 JS 内置函数。
由于 Number() 属于内置构造函数,所以 Number() 的首字母 N 要大写。
(1)字符串 ——> 数字
Number('123'); // 123 Number('123.45'); // 123.45 Number('-123'); // -123 Number('-123.45'); // -123.45 // 字符串中不支持有非数值字符 Number('123年'); // NaN Number('2e3'); // 2000 Number(''); // 0 // 字符串不支持是数学表达式 Number('1+1'); // NaN // 除了字符串外,还可以直接放一个表达式 Number(1+1); // 2
(2)布尔值 ——> 数字
Number(true); // 1 Number(false); // 0
(3)undefined 和 null ——> 数字
Number(undefined); // NaN Number(null); // 0
4.1.2 使用 parseInt() 函数
parseInt()
函数的功能是将 字符串
或 浮点数
转为 整数
。
-
自动截掉第一个非数字字符之后的所有字符
parseInt('3.14'); // 3 parseInt('-3.14'); // -3 parseInt('3周吉瑞.14'); // 3 parseInt(3.14); // 3 parseInt(-3.14); // -3
-
所有文字都将被截掉
parseInt('3.14是圆周率'); // 3
-
如果字符串以非数字开头,则转为 NaN
parseInt('圆周率是3.14'); // NaN parseInt('一二三'); // NaN
-
不存在 “四舍五入”
parseInt('3.99'); // 3
-
true、false、undefined、null 转为 NaN
之所以会出现这种情况的原因是,parseInt() 的原理是先将参数转换为字符串,再将字符串转为整数。
所以,true 会先被转为
'true'
,null 会被转为 'null',其它同理……
parseInt(true); // NaN parseInt(false); // NaN parseInt(undefined); // NaN parseInt(null); // NaN
parseInt() 函数的特性会用于处理数字的净化。
parseInt('24px'); // 24 // 去除了单位,保留数值!
4.1.3 使用 parseFloat() 函数
parseFloat()
函数的功能是将字符串转为浮点数。
绝大部分原理与 parseInt() 类似。
parseFloat('3.14'); // 3.14 parseFloat(3.14); // 3.14 parseFloat('3.14是圆周率'); // 3.14 parseFloat('3.14.15'); // 3.14 parseFloat('3.99'); // 3.99 parseFloat('-3.99'); // -3.99
4.2 其他值 ——> 字符串
4.2.1 使用 String() 函数
String()
函数是 JS 内置函数。
由于 String() 属于内置构造函数,所以 String() 的首字母 S 要大写。
(1)数字 ——> 字符串
变为 “长得相同” 的字符串。
科学计数法和非 10 进制数字会转为 10 进制的标准值。
String(123); // '123' String(123.4); // '123.4' String(2e3); // '2000' Stiing(NaN); // 'NaN' //Infinity 无穷大 -Infinity无穷小 String(Infinity); // 'Infinity' String(0xf); // '15'
(2)布尔值 ——> 字符串
变为 “长得相同” 的字符串。
String(true); // 'true' String(false); // 'false'
(3)undefined 和 null ——> 字符串
变为 “长得相同” 的字符串。
String(undefined); // 'undefined' String(null); // 'null'
4.2.2 使用 toString() 方法
toString()
是几乎所有基本类型都自带的方法,功能是将值转为字符串。
纯数字不能直接 “打点” 调用 toString() 方法,要把纯数字用
()
包裹起来,此时 JS 会提升该数字为一个 Number 对象(包装对象)
toString() 方法依旧是返回一个字符串,并不改变变量原有的类型!
4.3 其他值 ——> 布尔值(了解)
Boolean()
函数是 JS 内置函数。
由于 Boolean() 属于内置构造函数,所以 Boolean() 的首字母 B 要大写。
(1)数字 ——> 布尔值
0 和 NaN 转为 false
,其他数字都转为 true
。
Boolean(123); // true Boolean(0); // false Boolean(NaN); // false Boolean(Infinity); // true Boolean(-Infinity); // true
全局属性
Infinity
是一个数值,表示无穷大。
(2)字符串 ——> 布尔值
空字符串 ''
转为 false
,其他都转为 true
。
Boolean(''); // false Boolean('abc'); // true Boolean('false'); // true
(3)undefined 和 null ——> 布尔值
转为 false。
Boolean(undefined); // false Boolean(null); // false
5. 加法器案例*(练习)
-
使用
prompt()
函数弹出浏览器输入框,让用户输入两个数字 -
由于
prompt()
函数输入的任何值都将默认为字符串,所以我们要将其先转为数字类型 -
对数字进行加法运算
-
最后用
alert()
显示结果
// 输入两个数字,并将他们转为数字类型 var a = Number(prompt('请输入第一个数字:')); var b = Number(prompt('请输入第二个数字:')); // 计算两个数字的和 var sum = a + b; // 弹出结果 alert(sum);
6. 复杂数据类型简介
除基本类型值外,JS 的世界中还有复杂数据类型。
举例:
[1, 2, 3] { a: 1, b: 2 } //map集合 function() { }
在 JS 中普通类型也可以包装为复杂类型(对象)
str01 = 'zjr'; str02 = new String('zjr'); str03 = String('zjr'); console.log(typeof str01); // string console.log(typeof str02); // object console.log(typeof str03); // string console.log(str01 === str02); // false console.log(str02 === str03); // false console.log(str01 === str03); // true // Number、Boolean 同理
复杂数据类型都是 “引用类型”(type: object),将在后续介绍。