运算符优先级
越靠上优先级越高,优先计算
若优先级一样,则从左往右计算
若优先级不清楚,可使用()来改变运算符优先级
语句
语句是一个程序的基本单位,JavaScript的程序就是由一条一条语句构成的,按照自上而下的顺序一条一条执行的,在JS中可以使用{}为语句进行分组
同一个{}中的语句称为一组语句,也称为代码块
注:代码块只具有分组的功能,没有其他的用途
{
var a = 6;
a--;
console.log(a);
}
流程控制语句
条件判断语句
判断指定表达式的值来决定执行还是跳过某些语句,最基本的条件语句:
if…else
语法一:
if(true){
alert("干饭!!");
}
语法二:
if(true){
alert("干饭!!");
}else{
alert("学习!!");
}
语法三:
if(1){
alert("干饭!!");
}else if(2){
alert("摸鱼!!");
}else{
alert("干饭!!");
}
if语句练习
// 从键盘输入小明的期末成绩:
// 当成绩为100时,'奖励一辆BMW'
// 当成绩为[80-99]时,'奖励一台iphone15s当成绩为[60-80]时,'奖励一本参考书'其他时,什么奖励也没有
var score = prompt("请输入小明的期末成绩");
if(score<0 || score<100 ||isNaN(score)){
alert("请输入正确的分数!");
}else{
if(score == 100){
alert("奖励一辆BMW");
}else if(score>=80 && score<=99){
alert("奖励一台iPhone15s")
}else if(score>=60 && score<=80){
alert("奖励一本参考书")
}else{
alert(Null);
}
}
条件分支语句
switch…case
语法:
switch(条件表达式){
case 1:
语句
break;
case 2:
语句
break;
case 3:
语句
break;
default:
语句
break;
}
case后表达式的值和switch后条件表达式的值进行全等比较
如果比较结果为true
,从当前case处开始执行代码
如果比较结果为false
,则继续向下比较
如果所有比较结果都为false,则只执行default后的语句
switch语句练习
// 对于成绩大于60分的,输出"合格"。低于60分的,输出"不合格"
var score = prompt("请输入成绩");
if(score<0 || score>100){
alert("请输入正确的成绩")
}else{
switch(true){
case score>=60:
alert("合格");
break;
default:
alert("不合格");
break;
}
}
循环语句
通过循环语句可以反复执行一段代码多次
while
语法:
while(条件表达式){
语句...
}
while语句在执行时,
先对条件表达式进行求值判断,
如果值为true
,则执行循环体,
循环体执行完毕以后,继续对表达式进行判断如果为true,则继续执行循环体,以此类推如果值为false
,则终止循环
var n = 1;
while(true){
alert(n++);
}
像这种将条件表达式写死为true的循环,叫做死循环//该循环不会停止,除非浏览器关闭,死循环在开发中慎用
例子
输出1-10
var i = 1; //初始化一个变量
while (i <= 10) {
console.log(i); //在循环中设置一个条件表达式
i++; //定义一个更新表达式,每次更新初始化变量
}
do…while
do{
语句...
}while(条件表达式);
do…while语句在执行时,会先执行循环体,
循环体执行完毕以后,在对while后的条件表达式进行判断,
如果结果为true
,则继续执行循环体,执行完毕继续判断以此类推如果
结果为false
,则终止循环
例子
输出1-10
var i = 1;//初始化一个变量
do {
console.log(i);
i++;//定义一个更新表达式,每次更新初始化变量
} while (i <= 10);//在循环中设置一个条件表达式
while与do…while的区别
while
先判断后执行
do...while
先执行后判断
for
for语句也是循环控制语句,称它为for循环
语法:
for(初始化表达式 ; 条件表达式 ; 更新表达式){
语句...
}
例子
输出1-10
for(i = 0;i<= 10;i ++){
console.log(i);
}
for循环执行流程:
- 执行初始化表达式,初始化变量
- 执行条件表达式,判断是否执行循环
- 如果为true,则执行循环
如果为false,终止循环- 执行更新表达式,更新表达式执行完毕循环重复
for循环三个部分都可以省略(死循环),也可以写在外部
for循环练习
//打印1-100之间奇数和
for(i = 0,sum = 0;i <= 100;i++){
if(i%2 != 0){
sum += i;
}
}
console.log(sum);
//打印1-100之间所有7的倍数的个数及总和
var count = 0;
var sum = 0;
for(i = 1;i <= 100;i++){
if(i%7 == 0){
count++;
sum += i;
}
}
console.log(count);
console.log(sum);
//水仙花数是指一个3位数,它的每个位上的数字的3次幂之和等于它本身。
//(例如:1^3 + 5^3 + 3^3 = 153),请打印所有的水仙花数
for(i = 100;i< 1000;i++){
var hundred = parseInt(i/100);
var ten = parseInt(i/10%10);
var unit = i%10;
if(Math.pow(hundred,3)+Math.pow(ten,3)+Math.pow(unit,3) == i){
console.log(i);
}
}
质数练习
// 在页面中接收一个用户输入的数字,并判断该数是否是质数。
// 质数:只能被1和它自身整除的数,1不是质数也不是合数,质数必须是大于1的自然数。
var n = prompt();
var m = Math.sqrt(n);
if(n > 0){
if(n == 1){
alert("不是质数也不是合数");
var n = prompt();
}
for(var i = 2;i < m;i++){
if(n%i == 0){
break;
}
}
if(i > m){
alert( n +" is a prime.");
}else{
alert( n +" is not a prime.");
}
}
for循环的嵌套
var n = prompt();
for(i = 1; i <= (n+1)/2; i++){
for(j =1; j<=(n+1)/2-i;j++){
document.write(" ");
}
for(j = 1; j<= 2*(i - 1)+1;j++){
document.write("*");
}
document.write("</br>");
}
//打印九九乘法表
for(var i = 1;i <= 9;i++){
for(var j = 1;j <= i;j++){
document.write(j+"*"+i+"="+i*j+" ");
}
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){
console.log(i);
}
}
break与continue
break
:结束最近的一次循环,可以在循环和switch语句中使用。
continue
:结束本次循环,执行下一次循环,只能在循环中使用。
可以为循环语句创建一个label,来标识当前的循环
outer:
for(i = 0;i <= 5;i++){
console.log("外部循环"+i);
for(j = 0;j <= 5;j++){
break outer;
console.log("内部循环"+j);
}
}
Object对象
对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
对象的分类:
- 内建对象
- 由ES标准中定义的对象,在任何的ES的实现中都可以使用
- 比如:Math String Number Boolean Function Object…
- 宿主对象
- 由JS的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
- 比如 BOM DOM
- 自定义对象
- 由开发人员自己创建的对象
var obj = new Object(); //创建一个对象
obj.name = "wdd";
obj.gender = "男";
obj.age = 3; //向对象中添加属性
/*obj.age = 2;*/ //修改对象的属性值
delete obj.gender; //删除对象的属性
console.log(obj); //读取对象的属性
注:如果读取对象中没有的属性,不会报错而是会返回undefined
向对象中添加属性
属性名
对象的属性名不强制要求遵守标识符的规范
但尽量按照标识符规范
如果要使用特殊的属性名,不能采用.的方式来操作需要使用另一种方式:
语法:
对象["属性名"]= 属性值
读取时也需要采用这种方式
var obj = new Object();
obj["a"] = 666;
console.log(obj["a"]);
使用[]这种形式去操作属性,更加的灵活
在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性
var obj = new Object();
obj["a"] = "666";
var n = "a";
console.log(obj[n]);
属性值
JS对象的属性值,可以是任意数据类型
甚至可以是一个对象
var obj = new Object();
obj["a"] = "666";
var n = "a";
var obj2 = new Object();
obj2.name = "999";
obj.test = obj2;
console.log(obj.test);
in 运算符
通过该运算符可以检查一个对象中是否含有指定的属性
如果有则返回 true
,没有则返回 false
语法:
“属性名” in
对象
console.log(obj.test2);
检查obj中是否含有test2属性
var obj = new Object();
obj["a"] = "666";
var n = "a";
var obj2 = new Object();
obj2.name = "999";
obj.test = obj2;
console.log(obj.test);
console.log("test2" in obj);
基本&引用数据类型
JS中的变量都是保存到栈内存中的,
基本数据类型的值直接在栈内存中存储,
值与值之间是独立存在,修改一个变量不会影响其他的变量
对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响
var a = 666;
var b = true;
var c = "wawu";
var d = {name: 'wdd', age: 3};
栈内存
变量 | 属性值 |
---|---|
d | 0x000 |
c | wawu |
b | true |
a | 666 |
堆内存
0x000 | name: ‘wdd’ age: 3 |
栈的特点:先进后出,后进先出
当比较两个基本数据类型的值时,就是比较值。
而比较两个引用数据类型时,它是比较的对象的内存地址
如果两个对象是一摸一样的,但是地址不同,它也会返回false
对象字面量
语法:
var obj = {属性名:属性值,属性名:属性值...};
例子
var obj = {
name:"wdd",
gender:"男",
age:2
};
console.log(obj);