文章目录
  1. 1. 语法
    1. 1.1. 区分大小写
    2. 1.2. 标示符
    3. 1.3. 严格模式 "use strict;"
    4. 1.4. 语句
      1. 1.4.1. 语句和表达式的区别
  2. 2. 关键字和保留字
  3. 3. 变量
    1. 3.1. 声明变量
  4. 4. 数据类型
    1. 4.1. undefined类型
    2. 4.2. null类型
    3. 4.3. Boolean类型
    4. 4.4. Number类型
    5. 4.5. String类型
    6. 4.6. Object类型
  5. 5. 类型转换
  6. 6. 类型检验
  7. 7. 值传递和引用传递
  8. 8. 操作符&运算符
  9. 9. 操作语句
  10. 10. 数组
  11. 11. 函数
  12. 12. 错误类型

语法

区分大小写

ECMAScript 中的一切(变量、函数名和操作符)都区分大小写。

标示符

所谓标识符,就是指变量、函数、属性的名字,或者函数的参数。
规则:

  • 第一个字符必须是一个字母、下划线_或一个美元符号$
  • 其他字符可以是字母、下划线、美元符号或数字。标识符中的字母包含扩展的ASCll或Unicode字母字符(如À和Æ);

严格模式 "use strict;"

严格模式

语句

  • 一个语句由一个或多个表达式、关键字或运算符(符号)组成。通常,在一个行上书写一个语句,但可在两个行或多个行上书写一个语句。此外,在同一个行上书写两个或多个语句,用分号分隔。通常,每个新行都开始一个新语句。最好是显式终止您的语句。可使用分号 (;) 做到这一点,分号是 JavaScript 语句的终止字符。
  • 由括号 ({}) 包围的一组 JavaScript 语句称为一个块。组织在一个块中的语句通常可以视为一个语句,比如var a = function (){};和对象字面量(a = {};),这两个结尾的也需要加分号,其他的大括号情况(for循环、ifelse判断),可以不加分号。

    1
    2
    3
    4
    abc={}bbc=function(){}//报错 Uncaught SyntaxError: Unexpected identifier
    abc=function(){}bbc=function(){}//报错 Uncaught SyntaxError: Unexpected identifier
    if(a==1){}bbc=function(){}// 正常
    for(var a = 1;a<10;a++){}bbc=function(){}//正常

语句和表达式的区别

1
var a = 1 + 3;

这条语句先用var命令,声明了变量a,然后将1 + 3的运算结果赋值给变量a。
1 + 3叫做表达式(expression),指一个为了得到返回值的计算式。语句和表达式的区别在于,前者主要为了进行某种操作,一般情况下不需要返回值;后者则是为了得到返回值,一定会返回一个值。凡是JavaScript语言中预期为值的地方,都可以使用表达式。比如,赋值语句的等号右边,预期是一个值,因此可以放置各种表达式。一条语句可以包含多个表达式。

关键字和保留字

按照规则,关键字也是语言保留的,不能用作标识符。

关键字:真正意义上的保留字。

if分支语句:if, else
switch分支语句:switch, case, default, break
循环语句:do, while, for, continue
异常处理语句:try, catch, finally, throw
获取类型:typeof, instanceof
布尔值:true, false, null
函数相关:var, void, function, return
其他:in, this,with, new, delete

保留字:结合java、C++等面向对象语言的思路,将来有可能新加入的关键字。

基本数据类型:byte, char, boolean, int, short, long, float, double, enum
继承:implements, extends, super
类与接口:class, interface
用来修饰函数的关键字:abstract, native, static, final, const, volatile, synchronized
导入导出:export, import
访问权限:private, protected, public
其他:goto, package, throws, transient, debugger, let, yield, arguments, eval
注意:红色字体为第5版严格模式下做的限制,arguments, eval这两个在严格模式下不能做标识符或属性名。
注意:第5版把在非严格模式下运行时的保留字减少到绿色字体这几个,但是为了最大的兼容性还是都不要使用了吧。

顺便整理下javascript语言中提供的有用的常用的变量和函数

数据类型:Number, Boolean, String, undefined, Object, Array, Function, Date, Math, RegExp, Error
错误类型:EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError
编码:decodeURI, decodeURIComponent, encodeURI
转义:escape, unescape
类型转换:parentInt, parentFloat
特殊值及判断:isFinite, isNaN, NaN, Infinity
其他:arguments, eval
这些都不是ECMAScript的关键字,undefined不是关键字,但是null确是关键字。
最后注意:我们常用的函数alert()不属于上面的三类。

变量

声明变量

  1. 使用关键词 var,这个语法可以同时用来声明局部(function内部)和全局变量。
  2. 在非严格模式下,无论是在全局范围内还是函数内,使用直接给变量赋值count = 3这种语法,会产生一个全部变量count(隐式全局变量),这种方式不推荐。
  3. 无法用var声明块级局部变量
1
2
3
4
5
6
7
// A single declaration.
var count;
// Multiple declarations with a single var keyword.
var count, amount, level;
// Variable declaration and initialization in one statement.
var count = 0, amount = 100;
count = 3;//无论实在全局范围内还是函数内,使用这种语法直接给变量赋值,会产生一个全部变量

如果未在 var 语句中初始化您的变量,它将自动采用 undefined 值,试图访问一个未初始化的变量会导致一个 ReferenceError 异常被抛出

如果使用var重新声明一个已经存在的变量,是无效的。

1
2
3
var x = 1;
var x;
x // 1

但是,如果第二次声明的同时还赋值了,则会覆盖掉前面的值。

这种写法在 严格模式下不会报错,但是如果是重复的属性名或者形参则会报错。

1
2
3
var x = 1;
var x = 2;
x // 2

使用var声明的全局变量和不使用var的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 定义三个全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
global_fromfunc = 3; // 反面教材
}());

// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true

// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"

原因:使用var命令声明变量时(或者使用属性赋值的方式声明变量),变量的可配置性(configurable)为false。

1
2
3
4
var a = 3;
b = 3;
console.log(Object.getOwnPropertyDescriptor(window, "a"));//Object {value: 3, writable: true, enumerable: true, configurable: false}
console.log(Object.getOwnPropertyDescriptor(window, "b"));//Object {value: 3, writable: true, enumerable: true, configurable: true}

了解另外两种变量的声明方式:

  • let:声明块范围局部变量,可选初始化值。
  • const:声明一个只读命名常量。

数据类型

ECMAScript是变量松散类型语言(动态数据类型语言),即每个变量只是一个占位符,其类型并不固定,可以随时变化,这意味着你定义变量时不必指定变量类型,而且变量类型会在脚本执行需要时自动转换。但是,数据本身和各种运算是有类型的
ECMAScript 中有5 种简单数据类型(也称为基本数据类型(primitive type)):Undefined、Null、Boolean、Number和String。还有1 种复杂数据类型——Object,Object 本质上是由一组无序的名值对组成的。(ES6又新增了第七种Symbol类型的值)。
Object对象又可以分成三个子类型:

  • 狭义的对象(object)
  • 数组(array)
  • 函数(function)function f() {} console.log(typeof f) //"function"

狭义的对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。

undefined类型

好好学学undefined!

null类型

null类型也只有一个值:null , 表示一个变量中没有包含有效数据,null表示”没有对象”。字面值null在这里意为空值空对象的意思,更确切的说,一个被赋值为null的变量没有保存有效的对象等,可以通过给一个变量赋值为null来清空变量中的内容(不删除变量)。

主要用处:

  • 作为函数的参数传递,表示该函数的参数不是对象。
  • 作为对象原型链的终点(例如声明原型链的结束 Foo.prototype = null)。
    1
    Object.getPrototypeOf(Object.prototype) // null

产生null的原因只有一个,即对一个变量显式的赋值为null 。

1
2
3
4
var p = null;
console.log(p); //null
typeof p; // "object"
typeof null; // "object"

另外,需要注意的是,typeof null 应该返回”null”,但实际上返回的是”object”,这是一个历史遗留问题,并没有其他原因,不要想太多,曾经有提案 typeof null === 'null'但提案被拒绝。

《javascript高级程序设计3》是这么解释的:从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用typeof 操作符检测null 值时会返回”object”的原因。

1
2
3
4
5
6
7
//判断null值,这个时候就不能用typeOf了,直接用if(xxx === null){}
console.log(typeof null) //"Object"
console.log(null instanceof Object) // false
var a = null,b;
console.log(a === null) //true
console.log(b === null) //false 因为 undefined !== null 三个等号为false
console.log(b == null) // true 两个等号为true

undefined == null //true 为什么相等?

Boolean类型

boolean类型只有两个字面值:truefalse 。 但在Javascript中,所有类型的值都可以转化为与boolean等价的值。要将一个值转换为其对应的Boolean值,可以调用类型转换函数Boolean()。其中转换结果为false的值有(false, “”, +0, -0, NaN, null, undefined),其他值(包括空对象、空数组)均将转换为true。

产生原因:下列运算符会返回布尔值。

  • 两元逻辑运算符: && (And),|| (Or)
  • 前置逻辑运算符: ! (Not)
  • 相等运算符:===!====!=
  • 比较运算符:>>=<<=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typeof true; // "boolean"

typeof false; // "boolean"

Boolean(new Object()); //true

Boolean(undefined); //false

Boolean(null); //false

Boolean(''); //false

Boolean(0); //false

Boolean(100); // true

Boolean([]) // true

Boolean({}) // true

所有对象的布尔值都是true,甚至连false对应的布尔对象也是true。

1
Boolean(new Boolean(false)) // true

如果JavaScript预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值,比如:
if判断语句中自动调用Boolean()。

1
if (x = y + z){} //将值 y + z 赋给变量 x,然后检查整个表达式的结果(x 的值)是否为 0。

Number类型

好好学学Number!

String类型

好好学学String!

Object类型

好好学学Object!

类型转换

类型转换

类型检验

类型检验

值传递和引用传递

值传递和引用传递

操作符&运算符

值传递和引用传递

操作语句

break switch continue do()while{}; while(){} with(){}; label for(){} for...in

数组

数组

函数

函数

错误类型

错误类型

文章目录
  1. 1. 语法
    1. 1.1. 区分大小写
    2. 1.2. 标示符
    3. 1.3. 严格模式 "use strict;"
    4. 1.4. 语句
      1. 1.4.1. 语句和表达式的区别
  2. 2. 关键字和保留字
  3. 3. 变量
    1. 3.1. 声明变量
  4. 4. 数据类型
    1. 4.1. undefined类型
    2. 4.2. null类型
    3. 4.3. Boolean类型
    4. 4.4. Number类型
    5. 4.5. String类型
    6. 4.6. Object类型
  5. 5. 类型转换
  6. 6. 类型检验
  7. 7. 值传递和引用传递
  8. 8. 操作符&运算符
  9. 9. 操作语句
  10. 10. 数组
  11. 11. 函数
  12. 12. 错误类型