JavaScript的语法和Java语言类似,每个语句以;结束,语句块用{…}。但是,JavaScript并不强制要求在每个语句的结尾加;,
浏览器中负责执行JavaScript代码的引擎会自动在每个语句的结尾补上;。
注释:
//
/…/
JavaScript严格区分大小写
数据类型
JavaScript不区分整数和浮点数,统一用Number表示
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
JavaScript在设计时,有两种 比较运算符:
第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
由于JavaScript这个设计缺陷,不要使用比较,始终坚持使用=比较。
另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:
NaN === NaN; // false
isNaN(NaN); // true
判断NaN的唯一方法是用 ();方法
JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大
数组:JavaScript的数组可以包括任意数据类型。
JavaScript的对象是一组由键-值组成的无序集合
对象
JavaScript的对象是一组由键-值组成的无序集合
要获取一个对象的属性,我们用对象变量.属性名的方式 ,
如person.name; // ‘Bob’
变量
申明一个变量用var语句
使用等号=对变量进行赋值
可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次
这种变量本身类型不固定的语言称之为动态语言
使用var申明的变量则不是全局变量
它的范围被限制在该变量被申明的函数体内
后来就ECMA就推出了strict模式,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误
‘use strict’;
不用var申明的变量会被视为全局变量,为了避免这一缺陷,所有的JavaScript代码都应该使用strict模式
字符串
还可以用\u####表示一个Unicode字符
要把多个字符串连接起来,可以用+号连接
模板字符串 alert(你好, ${name}, 你今年${age}岁了!
);
注意这里是``,Esc下面
需要特别注意的是,字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果
数组
JavaScript的Array可以包含任意数据类型,并通过索引来访问每个元素
大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误
slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array;
var arr = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’];
arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: [‘A’, ‘B’, ‘C’]
arr.slice(3); // 从索引3开始到结束: [‘D’, ‘E’, ‘F’, ‘G’]
push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉
unshift()向Array的头部添加若干元素,shift()则把Array的第一个元素删除掉
splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素
sort()
reverse()
concat()
join()
对象
JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成
访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名
[‘xxx’]
xiaohong[‘name’]; // ‘小红’
xiaohong.name; // ‘小红’
实际上JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型
如果我们要检测xiaoming是否拥有某一属性,可以用in操作符:
条件判断
JavaScript把null、undefined、0、NaN和空字符串’’视为false,其他值一概视为true,因此上述代码条件判断的结果是true
循环
for循环
for … in循环
while
do while
要过滤掉对象继承的属性,用hasOwnProperty()来实现
Array也是对象,而它的每个元素的索引被视为对象的属性.
因此,for … in循环可以直接循环出Array的索引
Map
最新的ES6规范引入了新的数据类型Map,那么Number或者其他数据类型也可以作为键
(之前键只能是字符串)
Set
在Set中,没有重复的key。
iterable
遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型.
用for … of循环遍历集合
for … of循环和for … in循环有何区别?
更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数