Javascript 基础
写在前面: 此博客记录自己学习Javascript学习笔记,如有侵权,联系删!
学习来源: 尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通)
Hello World
控制浏览器弹出一个警告框
alert("哥,你真帅啊!!");
让计算机在页面中输出一个内容
document.write()
可以向body中输出一个内容
document.write("看我出不出来~~~");
向控制台输出一个内容
console.log()
的作用是向控制台输出一个内容
console.log("你猜我在哪出来呢?");
JavaScript 编写位置
1、外部引入
可以将js代码编写到外部js文件中,然后通过script标签引入
写到外部文件中可以在不同的页面中同时引用,也可以利用到浏览器的缓存机制
推荐使用的方式
<script type="text/javascript" src="js/script.js"></script>
2、外部引入+内部编写
script标签一旦用于引入外部文件了,就不能在编写代码了,即使编写了浏览器也会忽略
如果需要则可以在创建一个新的script标签用于编写内部代码
<script type="text/javascript" src="js/script.js"></script>
<script type="text/javascript">
alert("我是内部的JS代码");
</script>
3、放入html标签中
可以将js代码编写到标签的onclick
属性中
当我们点击按钮时,js代码才会执行
虽然可以写在标签的属性中,但是他们属于结构与行为耦合,不方便维护,不推荐使用
<button onclick="alert('讨厌,你点我干嘛~~');">点我一下</button>
4、放入a
标签的href
属性
可以将js代码写在超链接的href属性中,这样当点击超链接时,会执行js代码
<a href="javascript:alert('让你点你就点!!');">你也点我一下</a>
基本语法
1、注释
- 多行注释 - JS注释
多行注释,注释中的内容不会被执行,但是可以在源代码中查看
要养成良好的编写注释的习惯,也可以通过注释来对代码进行一些简单的调试
/*
*alert("hello");
*document.write("hello");
*
*/
- 单行注释
//alert("hello");
//document.write("hello");
2、语法
(1)、JS中严格区分大小写
(2)、JS中每一条语句以分号(;)结尾
如果不写分号,浏览器会自动添加,但是会消耗一些系统资源,
而且有些时候,浏览器会加错分号,所以在开发中分号必须写
(3)、JS中会忽略多个空格和换行,所以我们可以利用空格和换行对代码进行格式化
标识符
- 在JS中所有的可以由我们自主命名的都可以称为是标识符
例如:变量名、函数名、属性名都属于标识符
- 命名一个标识符时需要遵守如下规则:
1、标识符中可以含有字母、数字、_、$
2、标识符不能以数字开头
3、标识符不能是ES中的关键字或保留字
4、标识符一般都采用驼峰命名法
首字母小写,每个单词的开头字母大写,其余字母小写
helloWorld xxxYyyZzz
- JS底层保存标识符时实际上是采用的Unicode编码,
所以理论上讲,所有的utf-8中含有的内容都可以作为标识符
千万不要这么用
var 锄禾日当午 = 789;
console.log(锄禾日当午);
数据类型
typeof
操作符
数据类型指的就是字面量的类型,在JS中一共有六种数据类型
String
字符串(基本数据类型)Number
数值(基本数据类型)Boolean
布尔值(基本数据类型)Null
空值(基本数据类型)Undefined
未定义(基本数据类型)Object
对象(引用数据类型)
其中String
Number
Boolean
Null
Undefined
属于基本数据类型,而Object
属于引用数据类型
typeof 操作符
可以使用一个运算符 typeof,来检查一个变量的类型
语法: typeof 变量
- 检查字符串时,会返回string
- 检查数值时,会返回number
String 类型
- 在JS中字符串需要使用引号引起来
- 使用双引号或单引号都可以,但是不要混着用
- 引号不能嵌套,双引号不能放双引号,单引号不能放单引号
var str = 'hello';
str = '我说:"今天天气真不错!"';
在字符串中我们可以使用\作为转义字符:当表示一些特殊符号时可以使用\进行转义
\"
表示"
\'
表示'
\n
表示换行
\t
表示制表符
\\
表示\
str = "我说:\"今天\t天气真不错!\"";
str1 = "\\\\\\";
alert("str");//输出字面量 字符串str
alert(str);//输出变量str
alert(str1);//输出变量str1
var str2 = "hello";
str2 = "你好";
str2 = 3;
//输出变量str2
alert(str2);// 3
//alert("hello,你好");
//console.log("我就是不出来~~~");
Number 类型
在JS中所有的数值都是Number
类型,包括整数和浮点数(小数)
JS中可以表示的数字的最大值
Number.MAX_VALUE //1.7976931348623157e+308
Number.MIN_VALUE
大于0的最小值
Number.MIN_VALUE//5e-324
如果使用Number
表示的数字超过了最大值,则会返回一个Infinity
- Infinity 表示正无穷
- -Infinity 表示负无穷
- 使用
typeof
检查Infinity
也会返回number
console.log(Number.MAX_VALUE * Number.MAX_VALUE);// Infinity
console.log(-Number.MAX_VALUE * Number.MAX_VALUE);// -Infinity
console.log(typeof Infinity);// number
NaN
是一个特殊的数字,表示Not A Number
- 使用typeof检查一个
NaN
也会返回number
console.log(typeof NaN);// number
注意:
1、在JS中整数的运算基本可以保证精确
2、如果使用JS进行浮点运算,可能得到一个不精确的结果,所以千万不要使用JS进行对精确度要求比较高的运算
Boolean 类型
Boolean
布尔值
布尔值只有两个,主要用来做逻辑判断
true
- 表示真false
- 表示假
使用typeof检查一个布尔值时,会返回boolean
var bool = false;
console.log(typeof bool);//boolean
console.log(bool);//false
Null 类型
Null
(空值)类型的值只有一个,就是null
null
这个值专门用来表示一个为空的对象
使用typeof
检查一个null
值时,会返回object
var a = null;
console.log(typeof a);// object
Undefined 类型
Undefined
(未定义)类型的值只有一个,就undefind
当声明一个变量,但是并不给变量赋值时,它的值就是undefined
使用typeof
检查一个undefined
时也会返回undefined
var b = undefined;
console.log(typeof b);// undefined
Object(对象) 类型
Object
对象
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性。
对象的分类:
1、内建对象
- 由ES标准中定义的对象,在任何的ES的实现中都可以使用
- 比如:
Math
String
Number
Boolean
Function
Object
…等
2、宿主对象
- 由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
- 比如
BOM
DOM
3、自定义对象
- 由开发人员自己创建的对象
创建对象
- 使用new关键字调用的函数,是构造函数
constructor
- 构造函数是专门用来创建对象的函数
- 使用
typeof
检查一个对象时,会返回object
var obj = new Object();
在对象中保存的值称为”属性”
向对象添加属性
语法: 对象.属性名 = 属性值;
//向obj中添加一个name属性
obj.name = "孙悟空";
//向obj中添加一个gender属性
obj.gender = "男";
//向obj中添加一个age属性
obj.age = 18;
对象的属性值可以是任何的数据类型,也可以是个函数
obj.sayName = function(){
console.log(obj.name);
};
function fun(){
console.log(obj.name);
};
调方法
obj.sayName();
读取对象中的属性
语法:对象.属性名
console.log(obj.gender);
修改对象的属性值
语法:对象.属性名 = 新值
obj.name = "tom";
删除对象的属性
语法:delete 对象.属性名
delete obj.name;
枚举对象的属性
使用for ... in
语句
语法:
for(var 变量 in 对象){
}
for...in
语句 对象中有几个属性,循环体就会执行几次
每次执行时,会将对象中的一个属性的名字赋值给变量
var obj = {
name:"孙悟空",
age:18,
gender:"男",
address:"花果山"
};
for(var n in obj){
console.log("属性名:"+n);
console.log("属性值:"+obj[n]);
}
数据类型的存储
基本数据类型
String
Number
Boolean
Null
Undefined
引用数据类型
Object
JS中的变量都是保存到栈内存中的
基本数据类型的值直接在栈内存中存储,
- 值与值之间是独立存在,修改一个变量不会影响其他的变量
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,
- 而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,
- 当一个通过一个变量修改属性时,另一个也会受到影响
强制类型转换
指将一个数据类型强制转换为其他的数据类型
类型转换主要指,将其他的数据类型,转换为String
Number
Boolean
等
转换为 String 类型
将其他的数据类型转换为String
方式一:
- 调用被转换数据类型的
toString()
方法 - 该方法不会影响到原变量,它会将转换的结果返回
- 但是注意:
null
和undefined
这两个值没有toString()
方法,
如果调用他们的方法,会报错
var a = 123;
//调用a的toString()方法
//调用xxx的yyy()方法,就是xxx.yyy()
a = a.toString();
console.log(a);// “123”
a = true;
a = a.toString();
console.log(a);// “true”
a = null;
a = a.toString();
console.log(a);//报错
a = undefined;
a = a.toString();
console.log(a);//报错
方式二:
- 调用
String()
函数,并将被转换的数据作为参数传递给函数 - 使用
String()
函数做强制类型转换时,
1、对于Number
和Boolean
实际上就是调用的toString()
方法
2、但是对于null
和undefined
,就不会调用toString()
方法
(1)它会将null
直接转换为"null"
(2)将undefined
直接转换为"undefined"
a = 123;
//调用String()函数,来将a转换为字符串
a = String(a);
console.log(a);//"123"
a = null;
a = String(a);
console.log(a);//"null"
a = undefined;
a = String(a);
console.log(a);//"undefuned"
转换为 Number 类型
将其他的数据类型转换为Number
转换方式一:
使用Number()
函数
- 字符串 --> 数字
1、如果是纯数字的字符串,则直接将其转换为数字
2、如果字符串中有非数字的内容,则转换为NaN
3、如果字符串是一个空串或者是一个全是空格的字符串,则转换为0
- 布尔 --> 数字
true
转成1
false
转成0
null
–> 数字0
undefined
–> 数字NaN
//调用Number()函数来将a转换为Number类型
var a = "123";
a = Number(a);
console.log(typeof a);// Number
console.log(a);// 123
a = false;
a = Number(a);
console.log(typeof a);// Number
console.log(a);// 0
a = null;
a = Number(a);
console.log(typeof a);// Number
console.log(a);// 0
a = undefined;
a = Number(a);
console.log(typeof a);// Number
console.log(a);// NaN
转换方式二:
- 这种方式专门用来对付字符串
parseInt()
把一个字符串转换为一个整数parseFloat()
把一个字符串转换为一个浮点数
//调用parseInt()函数将a转换为Number
//parseInt()可以将一个字符串中的有效的整数内容去出来,
//然后转换为Number
a = "123567a567px";
a = parseInt(a);
console.log(typeof a);// Number
console.log(a);// 123567
//parseFloat()作用和parseInt()类似,不同的是它可以获得有效的小数
a = "123.456.789px";
a = parseFloat(a);
console.log(typeof a);// Number
console.log(a);// 123.456
//如果对非String使用parseInt()或parseFloat()
//它会先将其转换为String然后在操作
a = true;
a = parseInt(a);
console.log(typeof a);// Number
console.log(a);// NaN
a = 198.23;
a = parseInt(a);
console.log(typeof a);// Number
console.log(a);// 198
进制数字转换
16进制: 如果需要表示16进制的数字,则需要以0x开头
8进制: 如果需要表示8进制的数字,则需要以0开头
2进制: 如果要要表示2进制的数字,则需要以0b开头
但是不是所有的浏览器都支持
//十六进制
a = 0x10;
a = 0xff;
a = 0xCafe;
//八进制数字
a = 070;
//二进制数字
a = 0b10;
//向"070"这种字符串,有些浏览器会当成8进制解析,有些会当成10进制解析
a = "070";
//可以在parseInt()中传递一个第二个参数,来指定数字的进制
a = parseInt(a,10);
console.log(typeof a);
console.log(a);// 70
转换为 Boolean 类型
将其他的数据类型转换为Boolean
使用Boolean()
函数
- 数字 —> 布尔
除了0
和NaN
,其余的都是true
- 字符串 —> 布尔
除了空串,其余的都是true
null
和undefined
都会转换为false
- 对象也会转换为
true
var a = 123; //true
a = -123; //true
a = 0; //false
a = Infinity; //true
a = NaN; //false
//调用Boolean()函数来将a转换为布尔值
a = Boolean(a);
a = " ";//true
a = "";//false
a = Boolean(a);
a = null;
a = Boolean(a);//false
a = undefined;
a = Boolean(a);//false
console.log(typeof a);
console.log(a);
运算符
运算符也叫操作符
通过运算符可以对一个或多个值进行运算,并获取运算结果
- 比如:
typeof
就是运算符,可以来获得一个值的类型
它会将该值的类型以字符串的形式返回number
string
boolean
undefined
object
算数运算符
当对非Number
类型的值进行运算时,会将这些值转换为Number
然后在运算
注意:
何值和NaN
做运算都得NaN
任何值做- * /运算时都会自动转换为Number
,可以通过为一个值-0
*1
/1
来将其转换为Number
+
- +可以对两个值进行加法运算,并将结果返回
- 如果对两个字符串进行加法运算,则会做拼串
会将两个字符串拼接为一个字符串,并返回 - 任何的值和字符串做加法运算,都会先转换为字符串,然后再和字符串做拼串的操作
var a = 123;
var result = typeof a;
//console.log(typeof result);
result = a + 1;//124
result = 456 + 789;//1245
result = true + 1;//2
result = true + false;//1
result = 2 + null;// 2
result = 2 + NaN;//NaN
result = "你好" + "大帅哥"; //你好大帅哥
var str = "锄禾日当午," +
"汗滴禾下土," +
"谁知盘中餐," +
"粒粒皆辛苦";
result = 123 + "1"; //"1231"
result = true + "hello"; //truehello
//任何值和字符串相加都会转换为字符串,并做拼串操作
/*
* 我们可以利用这一特点,来将一个任意的数据类型转换为String
* 我们只需要为任意的数据类型 + 一个 "" 即可将其转换为String
* 这是一种隐式的类型转换,由浏览器自动完成,实际上它也是调用String()函数
*/
var c = 123;
c = c + "";//"123"
result = 1 + 2 + "3"; //33
result = "1" + 2 + 3; //123
console.log("result = "+result);
-
- 可以对两个值进行减法运算,并将结果返回
result = 100 - 5;//95
result = 100 - true;//99
result = 100 - "1";//99
console.log("result = "+result);
*
- 可以对两个值进行乘法运算
result = 2 * 2;//4
result = 2 * "8";//16
result = 2 * undefined;//NaN
result = 2 * null;//0
console.log("result = "+result);
/
- 可以对两个值进行除法运算
result = 4 / 2;//2
result = 3 / 2;//1.5
console.log("result = "+result);
%
- % 取模运算(取余数)
result = 9 % 3;//0
result = 9 % 4;//1
result = 9 % 5;//4
console.log("result = "+result);
一元运算符
+
正号
- 正号不会对数字产生任何影响
-
负号
- 负号可以对数字进行负号的取反
对于非Number
类型的值,
- 它会将先转换为
Number
,然后在运算 - 可以对一个其他的数据类型使用+,来将其转换为
number
- 它的原理和
Number()
函数一样
var a = 123;
a = -a;//-123
a = true;//true
a = "18";//18 string
a = +a;//18 number
console.log("a=" + a);
var result = 1 + +"2" + 3;//6
console.log("result =" + result);
自增(++)和自减(–)
自增 ++
- 通过自增可以使变量在自身的基础上增加1
- 对于一个变量自增以后,原变量的值会立即自增1
- 自增分成两种:后
++(a++)
和 前++(++a)
1、无论是a++
还是++a
,都会立即使原变量的值自增1
不同的是a++
和++a
的值不同
2、a++
的值等于原变量的值(自增前的值)
3、++a
的值等于新值 (自增后的值)
var a = 1;
//使a自增1
var b = a++;//1
console.log(a);//2
var a = 1;
//使a自增1
var b = ++a;//2
console.log(a);//2
自减 –
- 通过自减可以使变量在自身的基础上减1
- 自减分成两种:后
--(a--)
和 前--(--a)
1、无论是a--
还是--a
都会立即使原变量的值自减1
不同的是a--
和--a
的值不同
2、a--
是变量的原值 (自减前的值)
3、--a
是变量的新值 (自减以后的值)
var b= 10;
var c = b--;//10
console.log(b);//9
var b = 10;
//使a自增1
var v = --b;//9
console.log(b);//9
运算符
逻辑运算符
JS中为我们提供了三种逻辑运算符
!
非
- !可以用来对一个值进行非运算
- 所谓非运算就是值对一个布尔值进行取反操作,
true
变false
,false
变true
- 如果对一个值进行两次取反,它不会变化
- 如果对非布尔值进行元素,则会将其转换为布尔值,然后再取反
所以我们可以利用该特点,来将一个其他的数据类型转换为布尔值
可以为一个任意数据类型取两次反,来将其转换为布尔值,
原理和Boolean()
函数一样
var a = false;
//对a进行非运算
a = !a;
console.log("a = "+a);//true
var b = 10;
b = !!b;
console.log("b = "+b);//true
console.log(typeof b);//boolean
&&
与
- &&可以对符号两侧的值进行与运算并返回结果
- 运算规则
- 两个值中只要有一个值为
false
就返回false
,
只有两个值都为true
时,才会返回true
- JS中的“与”属于短路的与,
如果第一个值为false
,则不会看第二个值
//如果两个值都是true则返回true
var result = true && true;//true
//只要有一个false,就返回false
result = true && false;//false
result = false && true;//false
result = false && false;//false
console.log("result = "+ result);
//第一个值为true,会检查第二个值
true && alert("看我出不出来!!");
//第一个值为false,不会检查第二个值
false && alert("看我出不出来!!");
||
或
- ||可以对符号两侧的值进行或运算并返回结果
- 运算规则:
两个值中只要有一个true
,就返回true
如果两个值都为false
,才返回false
- 注意: JS中的“或”属于短路的或
如果第一个值为true
,则不会检查第二个值
//两个都是false,则返回false
result = false || false;
//只有有一个true,就返回true
result = true || false;
result = false || true ;
result = true || true ;
//console.log("result = "+result);
//第一个值为false,则会检查第二个值
false || alert("123");
//第一个值为true,则不再检查第二个值
true || alert("123");
&&
||
非布尔值的情况
- 对于非布尔值进行与或运算时,
会先将其转换为布尔值,然后再运算,并且返回原值 - 与运算("
&&
"):
如果第一个值为true
,则必然返回第二个值
如果第一个值为false
,则直接返回第一个值
//与运算:如果两个值都为true,则返回后边的
var result = 5 && 6;
//与运算:如果两个值中有false,则返回靠前的false
//false && true
result = 0 && 2;//0
result = 2 && 0;//0
//false && false
result = NaN && 0;//NaN
result = 0 && NaN;//0
- 或运算("
||
")
如果第一个值为true
,则直接返回第一个值
如果第一个值为false
,则返回第二个值
//如果第一个值为true,则直接返回第一个值
result = 2 || 1;//2
result = 2 || NaN;//2
result = 2 || 0;//2
//如果第一个值为false,则直接返回第二个值
result = NaN || 1;//1
result = NaN || 0;//0
result = "" || "hello";//hello
result = -1 || "你好";//-1
赋值运算符
=
赋值运算符
- 可以将符号右侧的值赋值给符号左侧的变量
+=
a += 5 等价于 a = a + 5
-=
a -= 5 等价于 a = a - 5
*=
a *= 5 等价于 a = a * 5
/=
a /= 5 等价于 a = a / 5
%=
a %= 5 等价于 a = a % 5
关系运算符
通过关系运算符可以比较两个值之间的大小关系,如果关系成立它会返回true
,如果关系不成立则返回false
>
大于号
- 判断符号左侧的值是否大于右侧的值
- 如果关系成立,返回
true
,如果关系不成立则返回false
var result = 5 > 10;//false
>=
大于等于
- 判断符号左侧的值是否大于或等于右侧的值
var result;
result = 5 >= 5; //true
result = 5 >= 4; //true
<
小于号
- 判断符号左侧的值是否小于右侧的值
- 如果关系成立,返回
true
,如果关系不成立则返回false
var result;
result = 5 < 4; //false
<=
小于等于
- 判断符号左侧的值是否小于或等于右侧的值
var result;
result = 4 <= 4; //true
非数值的情况
- 对于非数值进行比较时,会将其转换为数字然后在比较
console.log(1 > true); //false
console.log(1 >= true); //true
console.log(1 > "0"); //true
console.log(10 > null); //true
//任何值和NaN做任何比较都是false
console.log(10 <= "hello"); //false
- 如果符号两侧的值都是字符串时,不会将其转换为数字进行比较,而会分别比较字符串中字符的
Unicode
编码
//比较两个字符串时,比较的是字符串的字符编码
console.log("a" < "b");//true
//比较字符编码时是一位一位进行比较
//如果两位一样,则比较下一位,所以借用它来对英文进行排序
console.log("abc" < "bcd");//true
//比较中文时没有意义
console.log("戒" > "我"); //true
//如果比较的两个字符串型的数字,可能会得到不可预期的结果
//注意:在比较两个字符串型的数字时,一定一定一定要转型
console.log("11123123123123123123" < +"5"); //true
相等运算符
相等运算符用来比较两个值是否相等,如果相等会返回true
,否则返回false
==
相等
- 当使用
==
来 比 较两个值时,如果值的类型不同,
则会自动进行类型转换,将其转换为相同的类型
然后在比较
console.log(1 == 1); //true
vara = 10;
console.log(a == 4); //false
console.log("1" == 1); //true
console.log(true == "1"); //true
console.log(null == 0); //false
/*
* undefined 衍生自 null
* 所以这两个值做相等判断时,会返回true
*/
console.log(undefined == null);//true
/*
* NaN不和任何值相等,包括他本身
*/
//console.log(NaN == NaN); //false
var b = NaN;
//判断b的值是否是NaN
console.log(b == NaN);//false
/*
* 可以通过isNaN()函数来判断一个值是否是NaN
* 如果该值是NaN则返回true,否则返回false
*/
console.log(isNaN(b));//true
!=
不相等
- 不相等用来判断两个值是否不相等,如果不相等返回
true
,否则返回false
- 使用
!=
来做不相等运算 - 不相等也会对变量进行自动的类型转换,如果转换后相等它也会返回
false
console.log(10 != 5); //true
console.log(10 != 10); //false
console.log("abcd" != "abcd"); //false
console.log("1" != 1);//false
===
全等
- 用来判断两个值是否全等,它和相等类似,不同的是它不会做自动的类型转换
如果两个值的类型不同,直接返回false
console.log("123" === 123);//false
console.log(null === undefined);//false
!==
不全等
- 用来判断两个值是否不全等,和不等类似,不同的是它不会做自动的类型转换
如果两个值的类型不同,直接返回true
console.log(1 !== "1"); //true
条件运算符(三元(目)运算符)
条件运算符也叫三元运算符
语法:
条件表达式?语句1:语句2;
- 执行的流程:
条件运算符在执行时,首先对条件表达式进行求值
如果该值为true
,则执行语句1,并返回执行结果
如果该值为false
,则执行语句2,并返回执行结果
如果条件的表达式的求值结果是一个非布尔值,会将其转换为布尔值然后在运算
var a = 300;
var b = 143;
var c = 50;
a > b ? alert("a大"):alert("b大");
in运算符
通过该运算符可以检查一个对象中是否含有指定的属性
- 如果有则返回true,没有则返回false
- 语法:
"属性名" in 对象
//检查obj中是否含有test2属性
console.log("test2" in obj);
console.log("test" in obj);
console.log("name" in obj);
运算符的优先级
我们并不需要记忆,如果遇到优先级不清楚,可以使用()
来改变优先级
代码块
我们的程序是由一条一条语句构成的
- 语句是按照
自上向下
的顺序一条一条执行的 - 在JS中可以使用
{}
来为语句进行分组, - 同一个
{}
中的语句我们称为是一组语句, - 它们要么都执行,要么都不执行
一个{}
中的语句我们也称为叫一个代码块,在代码块的后边就不用再编写了
- JS中的代码块,只具有分组的的作用,没有其他的用途
- 代码块内容的内容,在外部是完全可见的
语句
流程控制语句
流程控制语句
- JS中的程序是从上到下一行一行执行的
- 通过流程控制语句可以控制程序执行流程,
使程序可以根据一定的条件来选择执行 - 语句的分类:
1.条件判断语句
2.条件分支语句
3.循环语句
条件判断语句:
- 使用条件判断语句可以在执行某个语句之前进行判断,
如果条件成立才会执行语句,条件不成立则语句不执行。 - if语句
if语句在执行时,会先对条件表达式进行求值判断,
如果条件表达式的值为true
,则执行if后的语句,
如果条件表达式的值为false
,则不会执行if后的语句。
if语句只能控制紧随其后的那个语句,
如果希望if语句可以控制多条语句,
可以将这些语句统一放到代码块中
if语句后的代码块不是必须的,但是在开发中尽量写上代码块,即使if后只有一条语句
if(条件表达式){
语句...
}
if语句
一般的if
语句
var num = 20;
//如果num为10,则输出哈哈哈哈哈哈
if(num == 10){
alert("哈哈哈哈哈哈");
}else if(num == 20){
alert("嘿嘿");
}else{
alert("嘎嘎");
}
条件分支(switch)语句
条件分支语句也叫switch语句
switch(条件表达式){
case 表达式:
语句...
break;
case 表达式:
语句...
break;
default:
语句...
break;
}
执行流程:
switch...case..
语句
在执行时会依次将case
后的表达式的值和switch
后的条件表达式的值进行全等比较,
- 如果比较结果为
true
,则从当前case
处开始执行代码。- 当前
case
后的所有的代码都会执行,我们可以在case
的后边跟着一个break
关键字,这样可以确保只会执行当前case
后的语句,而不会执行其他的case
- 当前
- 如果比较结果为
false
,则继续向下比较 - 如果所有的比较结果都为
false
,则只执行default
后的语句
switch
语句和if语句的功能实际上有重复的,使用switch
可以实现if的功能,
- 同样使用if也可以实现
switch
的功能,所以我们使用时,可以根据自己的习惯选择。
var num = 3;
/*if(num == 1){
console.log("壹");
}else if(num == 2){
console.log("贰");
}else if(num == 3){
console.log("叁");
}*/
num = "hello";
switch(num){
case 1:
console.log("壹");
//使用break可以来退出switch语句
break;
case 2:
console.log("贰");
break;
case 3:
console.log("叁");
break;
default:
console.log("非法数字~~");
break;
}
(while)循环语句
循环语句:
- 通过循环语句可以反复的执行一段代码多次
while循环
- 语法:
while(条件表达式){
语句...
}
创建一个循环
//1.创初始化一个变量
var i = 11;
//2.在循环中设置一个条件表达式
while(i <= 10){
//3.定义一个更新表达式,每次更新初始化变量
document.write(i++ +"<br />")
}
- while语句在执行时,
1、先对条件表达式进行求值判断,
2、如果值为true,则执行循环体,
3、循环体执行完毕以后,继续对表达式进行判断
4、如果为true,则继续执行循环体,以此类推
5、如果值为false,则终止循环
do…while循环
- 语法:
do{
语句...
}while(条件表达式)
创建do…while循环
var i = 11;
do{
document.write(i++ +"<br />");
}while(i <= 10);
- 执行流程:
1、do…while语句在执行时,会先执行循环体,
2、循环体执行完毕以后,在对while后的条件表达式进行判断,
3、如果结果为true,则继续执行循环体,执行完毕继续判断以此类推
4、如果结果为false,则终止循环
实际上这两个语句功能类似
不同:
- while是先判断后执行,而do…while会先执行后判断
- do…while可以保证循环体至少执行一次,而while不能
死循环
这种将条件表达式写死为true的循环,叫做死循环
该循环不会停止,除非浏览器关闭,死循环在开发中慎用
可以使用break,来终止循环
var n = 1;
while(true){
alert(n++);
//判断n是否是10
if(n == 10){
//退出循环
break;
}
for循环
for语句,也是一个循环语句,也称为for循环
在for循环中,为我们提供了专门的位置用来放三个表达式:
1、初始化表达式
2、条件表达式
3、更新表达式
for循环的语法:
for(①初始化表达式;②条件表达式;④更新表达式){
③语句...
}
for循环的执行流程:
1、执行初始化表达式,初始化变量(初始化表达式只会执行一次)
2、执行条件表达式,判断是否执行循环。
3、如果为true,则执行循环
如果为false,终止循环
4、执行更新表达式,更新表达式执行完毕继续重复②
for(var i = 0 ; i < 10 ; i++ ){
alert(i);
}
for循环中的三个部分都可以省略,也可以写在外部
如果在for循环中不写任何的表达式,只写两个;
此时循环是一个死循环会一直执行下去,慎用
for(;;){
alert("hello");
}
break 和 continue
break
关键字可以用来退出switch
或循环语句
continue
关键字可以用来跳过当次循环
不能在if语句中使用break
和continue
break
关键字,会立即终止离他最近的那个循环语句
continue
也是默认只会对离他最近的循环循环起作用
函数
函数function
- 函数也是一个对象
- 函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码)
- 函数中可以保存一些代码在需要的时候调用
- 使用
typeof
检查一个函数对象时,会返回function
我们在实际开发中很少使用构造函数来创建一个函数对象
创建一个函数对象,可以将要封装的代码以字符串的形式传递给构造函数
var fun = new Function("console.log('Hello 这是我的第一个函数');");
封装到函数中的代码不会立即执行
函数中的代码会在函数调用的时候执行
调用函数语法:函数对象()
当调用函数时,函数中封装的代码会按照顺序执行
使用 函数声明 来创建一个函数
语法:
function 函数名([形参1,形参2...形参N]){
语句...
}
function fun2(){
console.log("这是我的第二个函数~~~");
alert("哈哈哈哈哈");
document.write("~~~~(>_<)~~~~");
}
console.log(fun2);
//调用fun2
fun2();
使用 函数表达式 来创建一个函数
var 函数名 = function([形参1,形参2...形参N]){
语句....
}
var fun3 = function(){
console.log("我是匿名函数中封装的代码");
};
//调用fun3
fun3();
函数返回值
可以使用 return 来设置函数的返回值
- 语法:
return 值
-
return
后的值将会会作为函数的执行结果返回, -
可以定义一个变量,来接收该结果
-
在函数中
return
后的语句都不会执行 -
如果
return
语句后不跟任何值就相当于返回一个undefined
, -
如果函数中不写
return
,则也会返回undefined
-
return后可以跟任意类型的值
function sum(a , b , c){
//alert(a + b +c);
var d = a + b + c;
return d;
//return undefined;
}
调用函数
变量result的值就是函数的执行结果
函数返回什么result
的值就是什么
function sum(a , b , c){
//alert(a + b +c);
var d = a + b + c;
return d;
//return undefined;
}
var result = sum(4,7,8);
console.log("result = "+result);
立即执行函数
函数定义完,立即被调用,这种函数叫做立即执行函数
立即执行函数往往只会执行一次
(function(a,b){
console.log("a = "+a);
console.log("b = "+b);
})(123,456);
函数也可以称为对象的属性
- 如果一个函数作为一个对象的属性保存,那么我们称这个函数时这个对象的方法
- 调用这个函数就说调用对象的方法
method
,但是它只是名称上的区别没有其他的区别
var obj2 = {
name:"猪八戒",
age:18,
sayName:function(){
console.log(obj2.name);
}
};
obj2.sayName();
this
解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的 上下文对象.
根据函数的调用方式的不同,this会指向不同的对象:
1、以函数的形式调用时,this永远都是window
function fun(){
//console.log("a = "+a+", b = "+b);
console.log(this.name);
}
fun();//没有结果输出
2、以方法的形式调用时,this就是调用方法的那个对象
function fun(){
//console.log("a = "+a+", b = "+b);
console.log(this.name);
}
//创建一个对象
var obj = {
name:"孙悟空",
sayName:fun
};
var obj2 = {
name:"沙和尚",
sayName:fun
};
var name = "全局的name属性";
obj2.sayName();//沙和尚
原型(prototype)
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
这个属性对应着一个对象,这个对象就是我们所谓的原型对象
如果函数作为普通函数调用prototype
没有任何作用
当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,
指向该构造函数的原型对象,我们可以通过__proto__
来访问该属性
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,
我们可以将对象中共有的内容,统一设置到原型对象中。
当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,
如果没有则会去原型对象中寻找,如果找到则直接使用
以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,
这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了
JavaScript对象
Array 对象
Array 对象属性
属性 | 描述 |
---|---|
constructor | 返回对创建此对象的数组函数的引用。 |
length | 设置或返回数组中元素的数目。 |
prototype | 使您有能力向对象添加属性和方法。 |
Array 对象方法
方法 | 描述 |
---|---|
concat() | 连接两个或更多的数组,并返回结果。 |
join() | 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 |
pop() | 删除并返回数组的最后一个元素 |
push() | 向数组的末尾添加一个或更多元素,并返回新的长度。 |
reverse() | 颠倒数组中元素的顺序。 |
shift() | 删除并返回数组的第一个元素 |
slice() | 从某个已有的数组返回选定的元素 |
sort() | 对数组的元素进行排序 |
splice() | 删除元素,并向数组添加新元素。 |
toSource() | 返回该对象的源代码。 |
toString() | 把数组转换为字符串,并返回结果。 |
toLocaleString() | 把数组转换为本地数组,并返回结果。 |
unshift() | 向数组的开头添加一个或更多元素,并返回新的长度。 |
valueOf() | 返回数组对象的原始值 |
Boolean 对象
Boolean 对象属性
|属性 |描述 |
|:-------- |: -----|
|constructor|返回对创建此对象的 Boolean 函数的引用|
|prototype|使您有能力向对象添加属性和方法。|
Boolean 对象方法
方法 | 描述 |
---|---|
toSource() | 返回该对象的源代码。 |
toString() | 把逻辑值转换为字符串,并返回结果。 |
valueOf() | 返回 Boolean 对象的原始值。 |
String 对象
String 对象属性
属性 | 描述 |
---|---|
constructor | 对创建该对象的函数的引用 |
length | 字符串的长度 |
prototype | 允许您向对象添加属性和方法 |
String 对象方法
方法 | 描述 |
---|---|
anchor() | 创建 HTML 锚。 |
big() | 用大号字体显示字符串。 |
blink() | 显示闪动字符串。 |
bold() | 使用粗体显示字符串。 |
charAt() | 返回在指定位置的字符。 |
charCodeAt() | 返回在指定的位置的字符的 Unicode 编码。 |
concat() | 连接字符串。 |
fixed() | 以打字机文本显示字符串 |
fontcolor() | 使用指定的颜色来显示字符串。 |
fontsize() | 使用指定的尺寸来显示字符串。 |
fromCharCode() | 从字符编码创建一个字符串。 |
indexOf() | 检索字符串。 |
italics() | 使用斜体显示字符串。 |
lastIndexOf() | 从后向前搜索字符串。 |
link() | 将字符串显示为链接。 |
localeCompare() | 用本地特定的顺序来比较两个字符串。 |
match() | 找到一个或多个正则表达式的匹配。 |
replace() | 替换与正则表达式匹配的子串。 |
search() | 检索与正则表达式相匹配的值。 |
slice() | 提取字符串的片断,并在新的字符串中返回被提取的部分。 |
small() | 使用小字号来显示字符串。 |
split() | 把字符串分割为字符串数组。 |
strike() | 使用删除线来显示字符串。 |
sub() | 把字符串显示为下标。 |
substr() | 起始索引号提取字符串中指定数目的字符。 |
substring() | 提取字符串中两个指定的索引号之间的字符。 |
sup() | 把字符串显示为上标。 |
toLocaleLowerCase() | 把字符串转换为小写。 |
toLocaleUpperCase() | 把字符串转换为大写。 |
toLowerCase() | 把字符串转换为小写。 |
toUpperCase() | 把字符串转换为大写。 |
toSource() | 代表对象的源代码。 |
toString() | 返回字符串。 |
valueOf() | 返回某个字符串对象的原始值。 |