继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

JS(二)基本语法

慕哥9229398
关注TA
已关注
手记 1241
粉丝 199
获赞 913

1、语句&表达式

语句(statement):是为了完成某种任务而进行的操作,一般不需要返回值。

表达式(expression):是指一个为了得到返回值的计算式,一定会返回一个值。

var a = 1 + 2;

如上述代码就是一句赋值语句,1+2就是表达式,两者的区别就是语句是为了完成某种任务,而表达式是为了得到返回值。

语句一般用分号结尾,表达式不需要分号结尾,一旦表达式加上分号,就被JS引擎视为语句

1 + 1 ;'ccc';

比如上面两行语句只是单纯地产生一个值,没有任何实际的意义。

2、变量

变量是对‘值’的具名引用,简而言之,就是为‘值’起名。

var a = 1;

变量的声明和赋值是分两步走的,如上述语句:

  • 声明创建一个变量a

  • 将数值1赋值给变量a

也就是说实际步骤如下:

var a;
a = 1;

2.1 只声明变量不赋值

var a;
a // 变量值是undefined(无定义)

2.2未声明变量就直接使用

a;// ReferenceError : a is not defifned

JS会报错,告知变量未定义

2.3 var

var a = 1;// 基本等同于a = 1;

两个语句虽然基本等同,但是不写var不利于表达意图,很容易在不知不觉中创建全局变量

2.4 变量提升(hoisting)

JS 引擎工作方式是,先解析代码,获取所有被声明的变量,然后再一行行的运行,造成的结果就是所有变量的声明语句都会被提到代码头部,这就是变量提升。

我举个例子给你看

console.log(a);var a = 1;

按理说上述语句应该报错,因为打印变量a,但是a的声明赋值语句还没执行,但实际上不会报错,因为变量提升,真正的执行步骤是这样的:

var a;console.log(a);
a = 1;

所以最后的结果不是报错,而是undefined,因为a只声明未赋值。

注:变量提升只对var命令声明的变量有效,如果一个变量不是用var命令声明的,就不会发生变量提升。

比如

console.log(a)
a = 1;

这样语句将会报错,提示“ReferenceError: a is not defined”。即变量a未声明。

这是因为a不是用var命令声明的,变量提升没有发生。

3、标识符(identifier)

标识符用来是被各种值得合法名称,最常见的标识符就是变量名以及后面会提到的函数名。

注:JS语言的标识符对大小写敏感,a和A是不同的。

标识符命名规则:

  • 第一个字符:可以是任意Unicode字母(包括英文以及其他语言字母),还有美元符号$与下划线_

  • 第二个字符及后面的字符,除了Unicode字母,美元符号$和下划线_,还可以用数字0-9

// 合法标识符例子a$s000
_tmp
$elem
π// 非法标识符例子0uu$  // 标识符不能数字开头***  // 标识符不能包含星号a+b  // 标识符不能包含加号-d  // 标识符不能包含减号或连词线

JavaScript有一些保留字,不能用作标识符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。

4、注释

  • 单行注释

// 单行注释
  • 多行注释

/* 
 这样
 就是
 多行
 注释
 */
  • 此外,由于历史上 JavaScript 可以兼容 HTML 代码的注释,所以也被视为合法的单行注释。但是-->只能用再句首,否则会被当做运算符。

a = 1; <!-- a =2;
-->

5、区块(block)

JS使用{}将多个相关语句组合在一起,称为区块

注:对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。

6、条件语句

6.1 if 语句

if结构先判断一个表达式的布尔值,然后根据布尔值的真伪,执行不同的语句。

所谓布尔值,指的是 JavaScript 的两个特殊值,true表示真,false表示伪。

if(布尔值){
   语句;
}

上面是if结构的基本形式。需要注意的是,“布尔值”往往由一个条件表达式产生的,必须放在圆括号中,表示对表达式求值。

如果表达式的求值结果为true,就执行紧跟在后面的语句;如果结果为false,则跳过紧跟在后面的语句。

注:赋值表达式(=),相等运算符(==),严格相等运算符(===)要注意区分

尤其是赋值表达式,它不具备比较功能

var x = 1;var y = 2;if (x = y) {   //应该使用严格相等运算符  x===y 就可以了
  console.log(x);
}// "2"

本意是使x=y,但是在JS中就成了把y的值赋给x,所以打印x就得到了2。

至于相等运算符(==)和严格相等运算符(===)的区别,简单来讲就是:

相等运算符(==)比较两个值是否相等,严格相等运算符(===)比较它们是否为“同一个值”。
如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将它们转换成同一个类型,再用严格相等运算符进行比较。

6.2 if···else

if(condition){
  代码块;  //true statement
}else {
  代码块;  //false statement
}

其中condition可以是任意表达式,结果不一定是布尔值。

JavaScript解释器会自动调用Boolean()将表达式结果转为布尔值,如果表达式为真,执行第一个代码块内语句;如果为假,执行第二个代码块内语句

if语句可以单独使用,也可以和多个else连续使用

if (m === 0) {  // ...} else if (m === 1) {  // ...} else if (m === 2) {  // ...} else {  // ...}

这样似乎麻烦了一点,所以就引出了下面一个结构switch

6.3 switch结构

switch(expresstion){    case value1:     //该条件:(满足)这个值
        statement;   //则执行该语句
        break;       //强制输出
    case value2:
        statement;        break;    default:  
        statement;
}
  • switch和case可以使用任意表达式,不一定是常量

  • switch语句后面的表达式,与case语句后面的表示式比较运行结果时,采用的是严格相等运算符(===),而不是相等运算符(==),这意味着比较时不会发生类型转换。

webp

image

6.4 三元运算符 ? :

//语法(条件) ? 表达式1 : 表达式2// 如果“条件”为true,则返回“表达式1”的值,否则返回“表达式2”的值。

例子:

var even = (n % 2 === 0)? true : false;// 等同于var even;if(n % 2 === 0){
   even = true;
}else{
   even = false;
}

7、循环语句

7.1 while循环

前测试循环语句,先条件判断,后执行。也就是说while循环最少执行0次,一开始条件就不符合,所以不予执行。

while(expression){
   statement;
}
// 只要条件为true,就一直循环

webp

image

7.2 do···while循环

后测试循环语句,先执行后条件判断,也就意味着不管条件真假,do···while循环至少要运行一次。这是与while循环的最大区别。

do{
  statement;
}while(expression);

webp

image



作者:饥人谷_陈杨
链接:https://www.jianshu.com/p/6cd993927014


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP