JavaScript 学习之路-语法篇(上)

上篇文章介绍了 JavaScript 的基本概念和发展概况,这篇文章将开始讲 JavaScript 的一些基本语法概念。

前言

学一门编程语言,首先无非就是了解它的基本语法,例如变量、标识符、关键字、数据类型以及函数等等,然后应用这些东西去写出你相要的程序,当然程序也分很多种,就像只输出一句hello world也是一个程序对吧。那么这些在 JavaScript 里是如何规定和体现的呢?

语法(不基于 ES6)

JavaScript 是区分大小写的,所以 Maymay 是两个不同的变量名称。当使用变量时,一般驼峰式的命名写法,例如定义一个打招呼的变量是这样 var sayHello = 'hello world;' ,当然并没有强制规定要这样写。这里的 sayHello 称作 标识符标识符的第一个字符必须是字母、下划线或者 $ ,这意味着你不能命名一个变量诸如 12say 或者 ^hello 等等,另外也不能用一些关键字作为标识符,否则都会报错。所以,养成一个良好的命名习惯很有必要,多用一些英文字符命名,实在不会英文可以用拼音代替,并且尽量避开一些关键字和保留字。关于关键字和保留字下面会提到。

当你写了 var sayHello = "hello world"; 时,实际上就写了一条语句 。语句是我们能看懂的编程代码,它会被编译成计算机能识别的二进制代码,浏览器去解释执行这些代码就会有效果出来,比如上面那句在加上一条打印输出语句console.log(sayHello); 就能在控制台输出你经常看到的 hello world 了。当你想注释掉语句怎么办?JS 里的注释跟大多语言类似,单行注释采用 //,多行注释用 /* 这里是需要注释的内容 */ 就可以实现。

严格模式

ES5 新引入了严格模式这一概念,在严格模式里,很多内容都作出了完整规范的限制,比如你像前面一样声明一个 sayHello 变量时,如果前面没有 var 关键字,那运行就会报错,为何这样呢?因为浏览器不懂它到底是干嘛的,你在前面加上 var ,浏览器会明白它是一个变量,加上 const 关键字,浏览器会懂它是一个不可变的常量,所以你什么都不说,让别人去猜,它肯定就不鸟你了,这解释纯属瞎猜瞎扯,可以听听,切莫当真。想要启用严格模式,只需在你的 js 文件里加上下面这句代码:

"use strict";

浏览器就能严格的目光来看待所有内容了,这个模式是被建议采用的,这样可以避免一些不必要的错误发生,可以先了解下。

关键字和保留字

这类单词通常具有某种用途,比如前面说到的 var 和 const 分别是用来定义变量和常量的,所以不能用他们做标识符,以免不必要的冲突。常用的关键字有以下这些:

break    do      instanceof    typeof    case    else    new    var
catch    finally   return      void    continue   for   switch   while
debugger function   this       with    default    if    throw    delete
in       try

而保留字,顾名思义,就是保留着,将来可能也会被用作关键字,因此最好也不要用它们。ECMA-262 第 3 版定义的保留字有:

abstract  enum    int     short   boolean   export   interface     static   byte
extends   long    super   char    final     native   synchronized  class    float  
package   throws  const   goto    private   transient  debugger    implements protected
volatile  double  import  public  

这些关键字和保留字不用时时刻刻去记住它,多熟悉下,用到的时候去查查其实也不浪费多少时间,像这些就肯定不能用作变量名称来命名了,看着都别扭。

变量

JavaScript 的变量相比 java,c 等语言来说是相对轻松的。你可以随意定义变量的内容和类型,不用像 java 那般去区别是整型还是浮点型还是字符串类型等。像声明一个数组:

var arr = [1,'hello',undefined,'15',8];
console.log(arr);   //  [1, "hello", undefined, "15", 8]

var str = "hello world";
str = 100;
console.log(str);   // 100

是可以的,简直就是大杂烩啊有没有,各种类型都可以放上去,可以说语法是很松散的。第二个例子中先是给 str 赋了一个字符串型,然后又把它改成了数字类型,仍然正常输出了。

数据类型

上面提到的「字符串」、「数字」等就是所谓的 数据类型 。像 java 有八大基本数据类型,在 JavaScript 里,有五大基本数据类型:undefinednullBooleanNumberString .这些基本数据类型可以用 typeof 操作符来检测。下面看看例子:

typeof 'hello world'  // string
typeof 20   // number
typeof null  // object
typeof "hello"  // string
typeof true    // boolean
typeof 2.3   // number
typeof undefined   // undefined

从上面的测试中我们可以总结出,JavaScript 字符串不分单双引号;数字不分浮点型或者整型,全部为 number 型;对 null 检测类型为 object 对象;对 undefined 检测为 undefined 。

undefined 通常是一个变量声明了但没有赋值,那么它的值就是 undefined,所以你对代码 var str 进行 typeof 就会得到 undefined 。

null 跟 undefined 有着千丝万缕的关系,比较奇妙的就是运行 undefined == null 时会返回 true 。通常认为他们两个是相等的,但如果是全等符 === 就会返回 false 了。前面为什么对 null 应用 typeof 会返回 object 呢?因为 JavaScript 解释器认为 null 是一个空的对象的引用,觉得它是个对象,只是被置为空了。

Boolean 应该很熟悉了,有两个值 true 或 false ,这两个值是区分大小写的,所以你不能把 true 写成 True ,这是隔壁 python 的写法。很多基本类型都可以转换成布尔值,例如非空字符串会转成 true,非零数字会转 true,而空字符串和 0、NaN 等都等同于 false 。除此之外,还有对象 object 也会转 true ,相应的 null 对象则是 false 。

Number 类型应用广泛,有整数和浮点数等等。需要特别记住的是 JavaScript 中浮点数的最高精度是 17 位小数,但在进行算术运算时往往精度会不如预期,所以你会看到 0.1 + 0.2 == 0.3 是 false ,这也是面试中经常会问到的点,0.1 和 0.2 相加是不等于 0.3 的!另外值得注意的是 NaN,它表示的是应该返回数值但却没有返回,通常在其他语言中发生这样都会直接报错,导致程序停止运行,而 JS 不会,它会返回 NaN,让程序继续运行。比如你弄数值弄着弄着搞出个字符串类型,这不是搞笑么,所以返回个 NaN,你自己体会。

String 类型同样经常遇到,声明字符串可以单引号也可以双引号,它采用的是 Unicode 字符编码。字符串有个 length 属性,可以返回长度。还有想要连接两个字符串的话,可以用 + 连接。例如下面这样

var s = 'hello';
console.log(s + ' world');   // hello world

它还有个常用的 toString() 方法,可以将其他值转换为字符串,这里典型应用就是可以输出数值的二进制表示等等。

var num = 10;
console.log(num.toString());   // "10"
console.log(num.toString(2));  // 1010
console.log(num.toString(16));  // a

可以看到,在 toString() 传入一个相应的数字就能转换成几进制的值。默认是转换成十进制的。

未完待续... ...

你可能感兴趣的:(JavaScript 学习之路-语法篇(上))