在Javascript中,每个语句以;
结尾,语句块使用{...}
,javascript中并不强制要求在语句结尾加;
,浏览器中解释执行javascript的引擎会自动在每个语句结尾补上;
.
注意 :让JavaScript引擎自动加分号在某些情况下会改变程序的语义,导致运行结果与期望不一致。所以养成一个习惯在每个语句后添加;
.
下面一行代码包含两个语句每个语句以封号表示结束;
var x = 1;var y = 2; // 不建议一行写多个语句
代码块{...}
内的语句具有缩进,通常是4个空格。缩进不是JavaScript语法要求必须的,但缩进有助于我们理解代码的层次,所以编写代码时要遵守缩进规则。很多文本编辑器具有“自动缩进”的功能,可以帮助整理代码。
{...}
中可以嵌套,形成层级结构;JavaScript本身对嵌套的层级没有限制,但是过多的嵌套无疑会大大增加看懂代码的难度。遇到这种情况,需要把部分代码抽出来,作为函数来调用,这样可以减少代码的复杂度。
//这是一行注释
代表行注释,/*{...}*/
块注释。
Number
javascript不区分整数与浮点数,以下都是合法的Number数据类型;
123; // 整数123
0.456; // 浮点数
1.266e3; //科学技术法表示1.266*1000,等同于1266
NaN; // NaN表示 NoT a Number,当前无法计算结果时用NaN表示
-99; // 负数
Infinity; // Infinity表示无限大
Number可以直接做四则运算,规则和数学一致:
%
表示取余运算。
字符串
字符串是以单引号’或者双引号”括起来的任意文本。
布尔值
一个布尔值只有true
,false
两个值,&&
是与运算,||
是或运算,!
是非运算,它是一个单目运算符,把true
变成false
,或者反之。
布尔值经常用于条件判断中。
比较运算符
当我们对Number做比较时,可以通过比较运算符得到一个布尔值。
javascript允许任意类型相互之间做比较。
false == 0 // true
false === 0 // false
==
比较,它会自动转换数据类型再比较,很多时候会得到诡异的结果,
===
比较,它不会自动转换数据类型,如果数据类型不一样,它会返回false
,如果一样,它才会比较。由于javascript这个设计缺陷,在比较的时候,应该始终使用===
。
还有一个特例是NaN
这个特殊的Number与所有其他值都不相同
NaN === NaN; // false
最后要注意浮点数之间的比较
1 / 3 === (1 - 2 / 3); // false
这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null和undefined
null
是一个空的值,它和0
,,不一样,`0`是一个数字,
是一个长度为0的字符串,null
表示空。
null
表示空的值,undefined
表示未定义,大多数情况下我们都应该用null
,undefined
仅仅在判断函数参数是否传递的情况下有用。
数组
数组是一组按顺序排列的的集合,用[]
表示,集合中的每个值称为元素,用,
分隔开,数组中的元素可以是任何数据类型,比如
[1,"hello",true,null,3.14];
另一种创建数组的方法是使用Array():
new Array(1,2,3) // 创建了数组[1,2,3]
出于可读性考虑,强烈建议使用[]
,数组可以通过索引访问,初始索引为0:
var arr = [1,2,3];
arr[0] // 返回索引为0的元素,即1
对象
javascript对象是一组由键-值组成的无序集合,例如:
var person = {
name: 'Bob ',
age: 20,
tags: ['js','css','html'],
hasCar: false,
zipcode: null
}
javascript对象的键都是字符串类型,值可以是任意数据类型,其中每个键又称之为对象的属性,例如person
的name
属性为'Bob'
.
要获取一个对象的属性,我们用对象变量.属性名
的形式。
person.name; // 'Bob'
变量
变量在JavaScript中用一个变量名表示,变量名可以由大小写英文字母,数字,$,_,组成,不能以数字开头,不能使用JavaScript关键字,比如if
,while
.变量可以是任意数据类型,申明一个变量使用var
var a; // 申明变量a,此时变量a的值为undefined
var $b = 2 // 申明一个变量$b同时给$b赋值,其值为2
var _c = null // 申明变量_c,同时给_c赋值为null
var D = 'Hello' // D是一个字符串
变量名也可以使用中文,但不要给自己找麻烦。
在JavaScript中使用=
来赋值,一个变量可以多次赋值,且每次值可以是不同类型,但只能申明一次:
var a = 1;
a = 'hello';
a = null;
这种变量本身数据类型不固定的语言称之为动态语言,与之对应的是静态语言,静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错,例如Java就是一门静态语言,其赋值如下:
int a = 123; // a是整数类型变量,用int申明
a = 'hello'; // 错误不能把字符串赋值给整型变量
和静态语言相比,动态语言更灵活。
请不要把赋值语句的等号等同于数学的等号。比如:
var x = 10;
x = x + 2;
赋值语句先计算右侧的表达式x + 2
,得到结果12,再赋值给x
。
strict模式
javascript在设计之初,为了方便初学者学习,并不强制要求申明变量时一定要使用var
,这导致了严重的后果,如果一个变量没有通过var
申明就使用,该变量就会自动申明为全局变量:
i = 10; // 现在i是全局变量
在同一个页面的不同javascript文件中,如果都不使用var
申明,刚好都使用了变量i
,将造成变量i
相互影响,产生难以调试的错误结果。
使用var
申明的变量不是全局变量,而是局部变量,它的范围被限制在申明该变量的函数体内,同名变量在不同函数体内互不冲突。
为了修补JavaScript这一设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制使用var
来申明变量,不未经var
申明就使用变量,将导致运行错误。
启用strict模式的方法,是在JavaScript代码的第一行写上:
'use strict';
这是一个字符串,不支持strict模式的浏览器会把它当做一个字符串语句执行,支持strict模式的浏览器将开启strict模式运行JavaScript.