js特点
- 解释型语言—-直接运行不需要编译
- 类似c和java的语法结构
- 动态语言—-变量类型任意
- 基于原型的面向对象
输出语句
-
alert("要输出的内容");
- 该语句会在浏览器窗口中弹出一个警告框
-
document.write("要输出的内容");
- 该内容将会被写到body标签中,并在页面中显示
-
console.log("要输出的内容");
- 该内容会被写到开发者工具的控制台中
编写位置
写到标签的指定属性中
js代码,虽然可以写在标签的属性中,但是它们属于结构与行为耦合,不方便维护,不推荐使用。
1、οnclick="alert('点击事件。');"
<button onclick="alert('讨厌,你点我干嘛~~');">点我一下</button>
2、超链接的href属性
<a href="javascript:alert('让你点你就点!!');">你也点我一下</a>
<a href="javascript:;">你也点我一下</a>
写在script标签中
<script type="text/javascript">
alert("我是script标签中的代码!!");
</script>
写在外部文件中
<!--
可以将js代码编写到外部js文件中,然后通过script标签引入
写到外部文件中可以在不同的页面中同时引用,也可以利用到浏览器的缓存机制
!!!推荐使用
-->
<!--
script标签一旦用于引入外部文件了,就不能在编写代码了,即使编写了浏览器也会忽略
如果需要则可以再创建一个新的script标签用于编写内部代码
-->
<script type="text/javascript" src="js/script.js"></script>
基本语法
单行注释、多行注释
//
/* */
JS严格区分大小写;js语句以分号结尾;js会自动忽略空格
字面量和变量
标识符
- 在JS中所有的可以由我们自主命名的都可以称为是标识符,例如:变量名、函数名、属性名都属于标识符
- 命名一个标识符时需要遵守如下的规则:
- 标识符中可以含有字母、数字、_、$
- 标识符不能以数字开头
- 标识符不能是ES中的关键字或保留字
- 标识符一般都采用驼峰命名法
- 首字母小写,每个单词的开头字母大写,其余字母小写 helloWorld xxxYyyZzz
- JS底层保存标识符时,实际上是采用的Unicode编码, 所以理论上讲,所有的utf-8中含有的内容都可以作为标识符(包含中文)
数据类型
-
数据类型指的就是字面量的类型
-
在JS中一共有六种数据类型
- 1、String 字符串
- 2、Number 数值
- 3、Boolean 布尔值
- 4、Null 空值
- 5、Undefined 未定义
- 6、Object 对象
-
其中String Number Boolean Null Undefined属于基本数据类型
-
而Object属于引用数据类型
String字符串
- 在JS中字符串需要使用引号引起来
- 使用双引号或单引号都可以,但是不要混着用
- 引号不能嵌套,双引号不能放双引号,单引号不能放单引号
str = "我说:"今天天气真不错!""; //报错
修改为:
str = "我说:"今天\t天气真不错!"";
or
str = '我说:"今天天气真不错!"';
Number
-
在JS中所有的数值都是Number类型,包括整数和浮点数(小数)
-
数字的最大值
-
Number.MAX_VALUE
1.7976931348623157e+308
-
Number.MIN_VALUE 大于0的最小值
5e-324
-
如果使用Number表示的数字超过了最大值,则会返回一个
- Infinity 表示正无穷
- -Infinity 表示负无穷
- 使用typeof检查Infinity也会返回number
-
NaN 是一个特殊的数字,表示Not A Number
- 使用typeof检查一个NaN也会返回number
-
-
其他进制的数字的表示:
- 0b 开头表示二进制,但是不是所有的浏览器都支持
- 0 开头表示八进制
- 0x 开头表示十六进制
-
运算符 typeof ——检查一个变量的类型
- 语法:typeof 变量
- 检查字符串时,会返回string
- 检查数值时,会返回number(包含Infinity、NAN)
-
运算
-
在JS中整数的运算基本可以保证精确
-
如果使用JS进行浮点运算,可能得到一个不精确的结果
-
所以千万不要使用JS进行对精确度要求比较高的运算
-
运算最终要转为二进制运算,二进制无法表示1/10
-
布尔值
Null和Undefined
Object(引用数据类型)
对象是JS中的引用数据类型
对象是一种复合数据类型,在对象中可以保存多个不同数据类型的属性
使用typeof检查一个对象时,会返回object
对象的分类
-
内建对象:由ES标准中定义的对象,在任何的ES的实现中都可以使用,比如:Math、String、Number、Boolean、Function、Object ...
-
宿主对象:由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象,比如 BOM DOM。如:console、document
-
自定义对象:由开发人员自己创建的对象。
创建对象
- 方式一:
- var obj = new Object();
- 方式二:使用对象字面量{},更简洁
- var obj = {};
向对象中添加属性
-
语法:
对象.属性名 = 属性值;
对象["属性名"] = 属性值;
-
属性名没有任何要求,不需要遵守标识符的规范,但是在开发中,尽量按照标识符的要求去写。
-
属性值也可以任意的数据类型,甚至也可以是一个对象。
读取对象中的属性
- 语法:
-
对象.属性名
-
对象["属性名"]—属性名特殊时
obj["nihao"]="你好"
-
- 如果读取一个对象中没有的属性,它不会报错,而是返回一个undefined
删除对象中的属性
-
语法:
delete 对象.属性名
delete 对象["属性名"]
使用in检查对象中是否含有指定属性
- 语法:"属性名" in 对象
- 如果在对象中含有该属性,则返回true,如果没有则返回false
使用对象字面量,在创建对象时直接向对象中添加属性
语法:
var obj = {
属性名:属性值,
属性名:属性值,
属性名:属性值,
属性名:属性值
}
基本数据类型和引用数据类型
-
基本数据类型
String Number Boolean Null Undefined
-
引用数据类型
Object
-
基本数据类型的数据,变量是直接保存的它的值,保存在栈。
变量与变量之间是互相独立的,修改一个变量不会影响其他的变量。
-
引用数据类型的数据,变量是保存的对象的引用(内存地址)(引用存在栈中),保存在堆。
如果多个变量指向的是同一个对象,此时修改一个变量的属性,会影响其他的变量。
-
比较两个变量时,对于基本数据类型,比较的就是值,
对于引用数据类型比较的是地址,地址相同才相同
类型转换
类型转换就是指将其他的数据类型,转换为String、Number 或 Boolean
转换为String
- 方式一(强制类型转换):调用被转换数据的toString()方法
-
该方法不会影响到原变量,它会将转换的结果返回
-
注意:null和undefined这两个值没有toString()方法,
如果调用它们的toString()方法,会报错!
-
例子:
var a = 123; a = a.toString();
-
- 方式二(强制类型转换):调用String()函数
-
原理:
对于Number Boolean String都会调用他们的toString()方法来将其转换为字符串,
对于null值,直接转换为字符串"null"。
对于undefined直接转换为字符串"undefined"
-
例子:
var a = 123; a = String(a);
-
- 方式三(隐式的类型转换): 为任意的数据类型 +""
-
原理:和String()函数一样
-
例子:
var a = true; a = a + "";
-
转换为Number
- 方式一(强制类型转换):调用Number()函数
-
例子:
var s = "123"; s = Number(s);
-
转换的情况:
1.字符串 --> 数字 - 如果字符串是一个合法的数字,则直接转换为对应的数字 - 如果字符串是一个非法的数字,则转换为NaN - 如果是一个空串或纯空格的字符串,则转换为0
2.布尔值 --> 数字 - true转换为1 - false转换为0
3.空值 --> 数字 - null转换为0
4.未定义 --> 数字 - undefined 转换为NaN
-
- 方式二(强制类型转换):调用parseInt()或parseFloat()
-
这两个函数专门用来将一个字符串转换为数字的
-
parseInt()
- 可以将一个字符串中的有效的整数位提取出来,并转换为Number
- 例子:
var a = "123.456px"; a = parseInt(a); //123
- 如果需要可以在parseInt()中指定一个第二个参数,来指定进制
-
parseFloat()
- 可以将一个字符串中的有效的小数位提取出来,并转换为Number
- 例子:
var a = "123.456px"; a = parseFloat(a); [//123.456](//123.456)
-
- 方式三(隐式的类型转换):使用**一元的+**来进行隐式的类型转换
-
例子:
var a = "123"; a = +a;
-
原理:和Number()函数一样
-
转换为布尔值
- 方式一(强制类型转换):使用Boolean()函数
-
例子:
var s = "false"; s = Boolean(s); //true
-
转换的情况
字符串 --> 布尔 - 除了空串其余全是true
数值 --> 布尔 - 除了0和NaN其余的全是true
null、undefined ---> 布尔 - 都是false
对象 ---> 布尔 - 都是true
-
- 方式二(隐式类型转换): 为任意的数据类型做两次非运算,即可将其转换为布尔值
-
例子:
var a = "hello"; a = !!a; //true
-
运算符
运算符也称为操作符,通过运算符可以对一个或多个值进行运算或操作
typeof运算符
- 用来检查一个变量的数据类型
- 语法:typeof 变量
- 它会返回一个用于描述类型的字符串作为结果
算数运算符
- +对两个值进行加法运算并返回结果
- -对两个值进行减法运算并返回结果
- *对两个值进行乘法运算并返回结果
- / 对两个值进行除法运算并返回结果
- % 对两个值进行取余运算并返回结果
- 除了加法以外,对非Number类型的值进行运算时,都会先转换为Number然后在做运算。
- 而做加法运算时,如果是两个字符串进行相加,则会做拼串操作,将两个字符连接为一个字符串。
- 任何值和字符串做加法,都会先转换为字符串,然后再拼串
一元运算符
-
一元运算符只需要一个操作数
-
一元的+
-
就是正号,不会对值产生任何影响,但是可以将一个非数字转换为数字
-
例子:
var a = true; a = +a;
-
-
一元的-
-
就是负号,可以对一个数字进行符号位取反
-
例子:
var a = 10; a = -a;
-
-
自增
-
自增可以使变量在原值的基础上自增1
-
自增使用 ++
-
自增可以使用 前++(++a)后++(a++)
-
无论是++a 还是 a++都会立即使原变量自增1
不同的是++a和a++的值是不同的,
++a的值是变量的新值(自增后的值) a++的值是变量的原值(自增前的值)
-
-
自减
-
自减可以使变量在原值的基础上自减1
-
自减使用 --
-
自减可以使用 前--(--a)后--(a--)
-
无论是--a 还是 a--都会立即使原变量自减1
不同的是--a和a--的值是不同的,
--a的值是变量的新值(自减后的值) a--的值是变量的原值(自减前的值)
-
逻辑运算符
-
!
- 非运算可以对一个布尔值进行取反,true变false false边true
- 当对非布尔值使用!时,会先将其转换为布尔值然后再取反
- 我们可以利用!来将其他的数据类型转换为布尔值
-
&&
-
&&可以对符号两侧的值进行与运算
-
只有两端的值都为true时,才会返回true。只要有一个false就会返回false。
-
与是一个短路的与,如果第一个值是false,则不再检查第二个值
-
对于非布尔值,它会将其转换为布尔值然后做运算,并返回原值
-
规则:
1.如果第一个值为false,则返回第一个值
2.如果第一个值为true,则返回第二个值
1 && 3:第一个为true,返回第二个(3)
-
-
||
-
||可以对符号两侧的值进行或运算
-
只有两端都是false时,才会返回false。只要有一个true,就会返回true。
-
或是一个短路的或,如果第一个值是true,则不再检查第二个值
-
对于非布尔值,它会将其转换为布尔值然后做运算,并返回原值
-
规则:
1.如果第一个值为true,则返回第一个值
2.如果第一个值为false,则返回第二个值
-
赋值运算符
-
=
- 可以将符号右侧的值赋值给左侧变量
-
+=
- a += 5 相当于 a = a+5
- var str = "hello"; str += "world";
-
-=
- a -= 5 相当于 a = a-5
-
*=
- a *= 5 相当于 a = a**5
-
/=
- a /= 5 相当于 a = a/5
-
%=
- a %= 5 相当于 a = a%5
关系运算符
-
关系运算符用来比较两个值之间的大小关系的
-
关系运算符的规则和数学中一致,用来比较两个值之间的关系,
如果关系成立则返回true,关系不成立则返回false。
-
如果比较的两个值是非数值,会将其转换为Number然后再比较。
-
如果比较的两个值都是字符串,此时会比较字符串的Unicode编码,而不会转换为Number。
相等运算符
-
==
- 相等,判断左右两个值是否相等,如果相等返回true,如果不等返回false
- 相等会自动对两个值进行类型转换,如果对不同的类型进行比较,会将其转换为相同的类型然后再比较,转换后相等它也会返回true
- null == undefined //true
- NaN==NaN //false
-
!=
- 不等,判断左右两个值是否不等,如果不等则返回true,如果相等则返回false
- 不等也会做自动的类型转换。
-
===
-
全等,判断左右两个值是否全等,它和相等类似,只不过它不会进行自动的类型转换,
如果两个值的类型不同,则直接返回false
+0===-0 //true
NaN===NaN //false
null === undefined //false
-
-
!==
- 不全等,和不等类似,但是它不会进行自动的类型转换,如果两个值的类型不同,它会直接返回true
特殊的值:
-
null和undefined
-
由于undefined衍生自null,所以null == undefined 会返回true。
-
但是 null === undefined 会返回false。
-
-
NaN
- NaN不与任何值相等,包括它自身 NaN == NaN //false
-
判断一个值是否是NaN
- 使用isNaN()函数
-
Object.is():与===基本一致(Object.is(+0,-0) false;Object.is(NaN,NaN) true)
三元运算符:
- ?:
-
语法:条件表达式?语句1:语句2;
-
执行流程:
先对条件表达式求值判断,
如果判断结果为true,则执行语句1,并返回执行结果 如果判断结果为false,则执行语句2,并返回执行结果
-
优先级:
-
和数学中一样,JS中的运算符也是具有优先级的,
比如 先乘除 后加减 先与 后或
-
具体的优先级可以参考优先级的表格,在表格中越靠上的优先级越高,
优先级越高的越优先计算,优先级相同的,从左往右计算。
-
优先级不需要记忆,如果越到拿不准的,使用()来改变优先级。
从上到下,优先级递减
流程控制语句
-
程序都是自上向下的顺序执行的,
通过流程控制语句可以改变程序执行的顺序,或者反复的执行某一段的程序。
-
分类:
1.条件判断语句
2.条件分支语句
3.循环语句
条件判断语句
-
条件判断语句也称为if语句
-
语法一:
if(条件表达式){ 语句... }
-
执行流程:
if语句执行时,会先对条件表达式进行求值判断,
如果值为true,则执行if后的语句 如果值为false,则不执行
-
-
语法二:
if(条件表达式){ 语句... }else{ 语句... }
-
执行流程:
if...else语句执行时,会对条件表达式进行求值判断,
如果值为true,则执行if后的语句 如果值为false,则执行else后的语句
-
-
语法三:
if(条件表达式){ 语句... }else if(条件表达式){ 语句... }else if(条件表达式){ 语句... }else if(条件表达式){ 语句... }else{ 语句... }
- 执行流程
-
if...else if...else语句执行时,会自上至下依次对条件表达式进行求值判断,
如果判断结果为true,则执行当前if后的语句,执行完成后语句结束。 如果判断结果为false,则继续向下判断,直到找到为true的为止。 如果所有的条件表达式都是false,则执行else后的语句
-
- 执行流程
条件分支语句
- switch语句
-
语法:
switch(条件表达式){ case 表达式: 语句... break; case 表达式: 语句... break; case 表达式: 语句... break; default: 语句... break; }
-
执行流程:
-
switch...case...语句在执行时,会依次将case后的表达式的值和switch后的表达式的值进行全等比较,
如果比较结果为false,则继续向下比较。如果比较结果为true,则从当前case处开始向下执行代码。 如果所有的case判断结果都为false,则从default处开始执行代码。
-
-
循环语句
-
通过循环语句可以反复执行某些语句多次
-
while循环
-
语法:
while(条件表达式){ 语句... }
-
执行流程:
while语句在执行时,会先对条件表达式进行求值判断,
如果判断结果为false,则终止循环
如果判断结果为true,则执行循环体
循环体执行完毕,继续对条件表达式进行求值判断,依此类推
-
-
do...while循环
-
语法:
do{ 语句... }while(条件表达式)
-
执行流程
do...while在执行时,会先执行do后的循环体,然后在对条件表达式进行判断,
如果判断判断结果为false,则终止循环。 如果判断结果为true,则继续执行循环体,依此类推
-
-
和while的区别:
while:先判断后执行
do...while: 先执行后判断
- do...while可以确保循环体至少执行一次。
-
for循环
-
语法:
for(①初始化表达式 ; ②条件表达式 ; ④更新表达式){ ③语句... }
-
执行流程:
首先执行①初始化表达式,初始化一个变量,
然后对②条件表达式进行求值判断,如果为false则终止循环
如果判断结果为true,则执行③循环体
循环体执行完毕,执行④更新表达式,对变量进行更新。
更新表达式执行完毕重复②
-
-
break
break关键字,可以用来退出switch或循环语句,不能在if语句中使用break和continue。
break关键字,会立即终止离它最近的那个循环语句。
-
label
可以为循环语句创建一个label,来标识当前的循环。
- 使用break语句时,可以在break后跟着一个label,这样break将会结束指定的循环,而不是最近的。
-
continue
continue关键字可以用来跳过当次循环,同样continue也是默认只会对离它最近的循环循环起作用。
-
死循环
while(true){ } for(;;){ }
计时器:console.time()、console.timeEnd()
//求质数的例子--改进后的例子
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//测试如下的程序的性能
//在程序执行前,开启计时器
//console.time("计时器的名字") // 可以用来开启一个计时器
//它需要一个字符串作为参数,这个字符串将会作为计时器的标识
console.time("test");
//打印2-100之间所有的数
for (var i = 2; i <= 100000; i++) {
var flag = true;
for (var j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
//如果进入判断则证明i不是质数,修改flag值为false
flag = false;
//一旦进入判断,则证明i不可能是质数了,此时循环再执行已经没有任何意义了
//使用break来结束循环
break;
//不加break 215ms
//加break 25ms
//修改j<=后 2.6
}
}
//如果是质数,则打印i的值
if (flag) {
//console.log(i);
}
}
//终止计时器
//console.timeEnd()用来停止一个计时器,需要一个计时器的名字作为参数
console.timeEnd("test");
/*
* 36
* 1 36
* 2 18
* 3 12
* 4 9
* 6 6
*/
//可以通过Math.sqrt()对一个数进行开方
var result = Math.sqrt(97);
console.log("result = " + result)
</script>
</head>
<body>
</body>
</html>