上篇文章介绍了 JavaScript 的基本概念和发展概况,这篇文章将开始讲 JavaScript 的一些基本语法概念。
前言
学一门编程语言,首先无非就是了解它的基本语法,例如变量、标识符、关键字、数据类型以及函数等等,然后应用这些东西去写出你相要的程序,当然程序也分很多种,就像只输出一句hello world
也是一个程序对吧。那么这些在 JavaScript 里是如何规定和体现的呢?
语法(不基于 ES6)
JavaScript 是区分大小写的,所以 May
和 may
是两个不同的变量名称。当使用变量时,一般驼峰式的命名写法,例如定义一个打招呼的变量是这样 var sayHello = 'hello world;'
,当然并没有强制规定要这样写。这里的 sayHello
称作 标识符
,标识符的第一个字符必须是字母、下划线或者 $ ,这意味着你不能命名一个变量诸如 12say
或者 ^hello
等等,另外也不能用一些关键字作为标识符,否则都会报错。所以,养成一个良好的命名习惯很有必要,多用一些英文字符命名,实在不会英文可以用拼音代替,并且尽量避开一些关键字和保留字。关于关键字和保留字下面会提到。
当你写了 var sayHello = "hello world";
时,实际上就写了一条语句
。语句是我们能看懂的编程代码,它会被编译成计算机能识别的二进制代码,浏览器去解释执行这些代码就会有效果出来,比如上面那句在加上一条打印输出语句console.log(sayHello);
就能在控制台输出你经常看到的 hello world
了。当你想注释掉语句怎么办?JS 里的注释跟大多语言类似,单行注释采用 //
,多行注释用 /* 这里是需要注释的内容 */
就可以实现。
严格模式
ES5 新引入了严格模式
这一概念,在严格模式里,很多内容都作出了完整规范的限制,比如你像前面一样声明一个 sayHello
变量时,如果前面没有 var
关键字,那运行就会报错,为何这样呢?因为浏览器不懂它到底是干嘛的,你在前面加上 var
,浏览器会明白它是一个变量,加上 const
关键字,浏览器会懂它是一个不可变的常量,所以你什么都不说,让别人去猜,它肯定就不鸟你了,这解释纯属瞎猜瞎扯,可以听听,切莫当真。想要启用严格模式
,只需在你的 js 文件里加上下面这句代码:
1 | "use strict"; |
浏览器就能严格的目光来看待所有内容了,这个模式是被建议采用的,这样可以避免一些不必要的错误发生,可以先了解下。
关键字和保留字
这类单词通常具有某种用途,比如前面说到的 var 和 const 分别是用来定义变量和常量的,所以不能用他们做标识符,以免不必要的冲突。常用的关键字有以下这些:
1 | break do instanceof typeof case else new var |
而保留字,顾名思义,就是保留着,将来可能也会被用作关键字,因此最好也不要用它们。ECMA-262 第 3 版定义的保留字有:
1 | abstract enum int short boolean export interface static byte |
这些关键字和保留字不用时时刻刻去记住它,多熟悉下,用到的时候去查查其实也不浪费多少时间,像这些就肯定不能用作变量名称来命名了,看着都别扭。
变量
JavaScript 的变量相比 java,c 等语言来说是相对轻松的。你可以随意定义变量的内容和类型,不用像 java 那般去区别是整型还是浮点型还是字符串类型等。像声明一个数组:
1 | var arr = [1,'hello',undefined,'15',8]; |
是可以的,简直就是大杂烩啊有没有,各种类型都可以放上去,可以说语法是很松散的。第二个例子中先是给 str 赋了一个字符串型,然后又把它改成了数字类型,仍然正常输出了。
数据类型
上面提到的「字符串」、「数字」等就是所谓的 数据类型
。像 java 有八大基本数据类型,在 JavaScript 里,有五大基本数据类型:undefined
,null
,Boolean
,Number
,String
.这些基本数据类型可以用 typeof
操作符来检测。下面看看例子:
1 | typeof 'hello world' // string |
从上面的测试中我们可以总结出,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
属性,可以返回长度。还有想要连接两个字符串的话,可以用 +
连接。例如下面这样
1 | var s = 'hello'; |
它还有个常用的 toString() 方法,可以将其他值转换为字符串,这里典型应用就是可以输出数值的二进制表示等等。
1 | var num = 10; |
可以看到,在 toString() 传入一个相应的数字就能转换成几进制的值。默认是转换成十进制的。
未完待续… …
v1.5.2