补充函数
prompt()函数
①prompt()可以弹出一个带有文本框的提示框,用户可以在文本框中输入内容
② 该函数需要一个字符串作为参数,该字符串会作为提示框的提示文字
③ 用户输入的内容作为函数的返回值,此时我们需要定义一个变量接受返回值
如:
var height=prompt("请输入你的身高:");
var face=prompt("请输入你的颜值:");
alert (height+","+face);
④警示框中想输入多项内容时,要在添加的内容前面加+
⑤prompt的返回值类型是string,如果需要对输入的数字进行大小比较,则需要进行强制类型转换,即在prompt前加+
例如:
var number1=+prompt("请输入数字1");
alert (typeof number1);
条件判断语句———if语句
会先对条件表达式进行求值判断,如果是true执行if后的语句,如果false则不执行。
语法①:
if(条件表达式) {执行语句}
语法②:
if(条件表达式1){执行语句} else{执行语句2}
语法③:
if(条件表达式1){执行语句}if else(条件表达式2){执行语句2} else{执行语句3}
使用语法三时,计算机会从上往下判断表达式,并只执行第一个true的代码块,然后直接结束if语句。
条件分支语句——switch…case语句
在执行时会依次将case后的表达式的值和switch后的条件进行比较:
注:分支语句后一定要加break来退出我们的整个switch语句
语法:
switch(条件表达式)
{
case 表达式1:
执行语句1;
break;
case 表达式2:
执行语句2;
break;
case 表达式3:
执行语句3;
break;
default:
执行语句4;
break;
}
循环语句
可以反复执行一段代码多次
创建一个循环往往需要三个步骤
①初始化一个变量
var i=0;
②在循环中设置一个条件表达式
while(i<10)
③定义一个更新表达式,每次更新初始化变量
{i++;}
while 循环
先对条件表达式进行求值判断,如果true则执行循环体,执行完毕后,继续对表达式进行判断,如果true,则继续执行循环体,以此类推
当求值结果为false则会终止循环。
- 语法:
while(条件表达式) {执行语句}
do… while循环
会先执行循环体,循环体执行完毕后再对while后的条件表达式进行判断,如果是true,则继续循环体,以此类推。如果是结果是false,则终止循环(保证循环体至少执行依次)
- 语法:
do{执行语句;} while(条件表达式)
for循环
for循环中提供了专门的位置放置初始化表达式,条件表达式,更新表达式。其实和while循环一样,不过规范了简洁了。
- 语法:
for(初始化表达式;条件表达式;更新表达式) {执行语句;}
- 执行流程:
①执行初始化表达式,初始化变量;
②判断条件表达式;若真,则执行语块中的执行表达式;
③执行更新表达式,然后重复循环; - 注意:
①初始化表达式只会执行一次,第一次循环中执行一次后都不会再在后面的循环中执行了。
②如果括号内不写任何表达式,只写两个分号,则这是一个死循环。
③括号中的分号前可以用逗号分开写多个表达式。
for循环练习
- ①判断质数
var num=prompt("请输入判断数字:");
var flag=true;
if(num<=1)
{
alert("输入错误");
}
else
{
for(var i=2;i<num;i++)
{
if(num%i==0)
{
flag=false;
}
}
if(flag)
{
alert(num+"是质数!!!");
}
else
alert(num+"不是质数!!!");
}
- ②实现三角形输出
 代表空格
for(i=0;i<5;i++)
{
for(j=0;j<i+1;j++)
{
document.write("*    ");
}
document.write("<br/>");
}
- ③实现99乘法表
for(var i=1;i<=9;i++)
{
for(var j=1;j<=i;j++)
{
document.write("<span>"+i+"*"+j+"="+i*j+"<span>");
}
document.write("<br/>");
}
④实现输出范围内的质数
for(var i=2;i<100;i++)
{
var flag=true;
for(var j=2;j<i;j++)
{
if(i%j==0)
{
flag=false;
}
}
if(flag)
document.write(i);
}
6、break与continue
- break关键字
①可以用来退出switch或循环语句,不能用于退出if语句;
理解例子中的break与if和for的关系:
for(var i=0;i<5;i++)
{
if(i==2)
{
break;
}
document.write(i);
}
②默认立即终止离他最近的循环语句;如果想要终止指定循环,可以为循环语句创建一个标签来表示当前循环。
语法:
标签名字:循环语句 break 标签名字;
例:
outer:
for(var i=0;i<5;i++)
{
document.write(i+"外层循环")
for(var j=0;j<5;j++)
{
document.write(j+"内部循环");
break outer;
}
}
- continue关键字
可以用来跳过当前一次循环;
默认作用于离它最近循环,也可以用标签指定循环来特定跳过指定循环;
- return
return可以结束整个函数
7、计时器:
测试程序性能
在程序执行前开始一个计时器。
- 语法:
consle.time("计时器名字")
在程序执行完后结束计时器
- 语法:
console.timeEnd("计时器名字")
用优化性能后范围内输出质数来和优化前的比较做例子:(因为它们输出其中的质数花的时间一样,所以就不要输出了,浪费时间;放大范围,这样子差距就明显了)
console.time("normal");
for(var i=2;i<10000;i++)
{
var flag=true;
for(var j=2;j<i;j++)
{
if(i%j==0)
{
flag=false;
}
}
//if(flag)
//document.write(i);
}
console.timeEnd("normal");
console.time("develop");
for(var i=2;i<10000;i++)
{
var flag=true;
for(var j=2;j<i;j++)
{
if(i%j==0)
{
flag=false;
break;
}
}
//if(flag)
//document.write(i);
}
console.timeEnd("develop");
8、求根函数:
语法:
Math.sqrt(求根数)
九、引用数据类型
(一)对象:
- 概念: 基本数据类型是单一的值,值和值之间没有任何联系,我们创建的变量都是独立的不能成为整体。
对象是一种复合的数据类型,在对象中保存多个不同数据类型的属性。(理解为装值的)
(二) 分类:
- 内建对象:ES标准中定义的对象,在任何的ES的实现中都可以使用。
- 宿主对象:由JS运行环境提供的对象,目前来说主要由浏览器提供的对象。
- 自定义对象: 由开发人员自己创建的对象。
(三)自定义对象相关语法
使用new关键字调用constructor构造函数专门创建对象;
使用typeof检查一个对象,会返回object;
- 自定义对象
语法:
var 对象名称=new Object();
例子
var obj=new Object();
- 向对象添加属性
语法:
对象名称. 属性名称=属性值;
例子
obj.name=“孙悟空”;
obj.gender=“男”;
obj.age=18;
- 读取对象属性
语法:
对象名称.属性名;
例子
document.write(obj.gender);
- 修改对象的属性值
语法
对象名称。属性名称=新值;
例子
obj.name=“马大姐”;
- 删除对象中的属性
语法
delete 对象名称.属性名称
例子
delete obj.name;
- 检查对象中是否含有指定的属性
使用 in运算符,可以检查对象中是否含有指定的属性,如果有返回true,否则返回false
语法:
"属性名称"in 对象名称
例子
var obj2=new Object();
obj2.name=“孙悟空”;
console.log(“name” in obj2);
(四)属性
概念: 对象中保存的值叫做属性;
如果对象没有要读取的属性不会报错,会返回undefined;
属性名称不强制要求遵守标识符的规范,但最好遵守;
当我们使用特殊的属性名时,不能用.的方式来操作,会报错。
这时有另一种推荐的方法来添加,而我们对应读取时也要用这种方式。
语法:
对象名称["属性名称"]=属性值;
特点:
这种方式更为灵活,当读取时,在[]中传递一个变量,这样当变量值是多少,就会传递变量值对应的属性值*
例子
var obj=new Object();
obj["145"]=18;
var n=145;
console.log(obj[n]);
console.log(obj[145]);
属性值可以是任意数据类型,甚至可以对对象。
例子:
var obj1=new Object();
obj1.name="猪八戒";
var obj2=new Object();
obj2.name="孙悟空";
obj1.obj2=obj2;//注意这里没加双引号了
console.log(obj1.obj2.name);
(五)枚举
使用for…in 语句 枚举对象中的属性
①for…in语句中查询的对象有几个属性,循环体就执行几次。
②每执行一次,会将查询的对象中的一个属性的名字赋值给变量。
语法:
for(var 变量 in 对象){}
例如:
var obj={
name:"孙悟空",
age:18,
gender:"男"
}
for(var n in obj){
console.log(n);//可以查到对象里面的属性名;
console.log(obj[n])//可以查到属性值,用[]是因为n这个变量并不是对象中的属性,只是在这个for..in语句中定义用来查询的变量名称。
}
(六)对象字面量
使用对象字面量创建对象并直接指定属性
语法:创建对象
var 对象名称={};
语法:创建对象的同时指定属性
(其中,对象字面量的属性名称可以加引号,也可以不加,建议不加,但如果使用特殊的名称就必须加)
var 对象名称={属性名称:属性值,属性名称:属性值};
(七)栈内存与堆内存
JS中的变量是保存在栈内存中的:
基本数据类型的值直接在栈内存中存储,其中保存的变量的值与值之间是独立存在的,修改一个变量的值不会影响其他的变量
而在栈内存中的对象变量保存的值是它的内存地址,地址是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间(对象引用)。
例子1现象:如果一个对象的属性改变,另外一个与它建立联系的对象呀我会改变,并不会判断此改变是在联立联系前还是后
var obj=new Object;
obj.name="孙悟空";
var obj1=obj;
obj.name="猪八戒";
document.write(obj1.name);
例子2现象:当其中一个对象将属性改成了null,并不会影响与之与联系的对象,因为这样子只是意味着与保存的地址断开了联系。
var obj=new Object;
obj.name="孙悟空";
var obj1=obj;
obj=null;
console.log(obj);
console.log(obj1);
当比较两个变量时,就是比较值,但比较两个对象时,是比较对象的内存地址。
所以定义了的两个对象,即使两个对象里面的属性一模一样,但两者开辟的是两个空间,所以两个对象是不相等的。