语法综述

JavaScript程序一行一行地执行。一般情况下,每一行就是一个语句,语句以分号结尾,一个分号就表示一个语句结束。多个语句可以写在一行内。

  1. var a = 1 + 2 ; var b = "abc";

分号前面可以没有任何内容,JavaScript引擎将其视为空语句。

  1. ; ; ; //表示三个空语句

分号表示一条语句的结尾。但是,有一些语法结构不需要在语句的结尾添加分号,主要是以下三种情况:
(1) for 和 while 语句

  1. for(;;;){}
  2. while(true){}

注意do…while 是有分号的。
(2) 分支语句 if ,switch ,try

  1. if(true){}
  2. switch{}
  3. try {}

(3) 函数的声明语句

  1. function f(){} //没有分号
  2. var f = function f(){}; //函数表达式要有分号

变量

变量是对“值”的引用,使用变量等同于引用一个值。每一个变量都有一个变量名。如果只是声明变量而没有赋值,则该变量的值为undefined

  1. var a ;
  2. console.log(a);// undefined

使用var定义变量时会出现一个问题,变量提升。JavaScript引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升。

  1. console.log(a);
  2. var a= 1;

上面代码首先使用console.log方法,在控制台(console)显示变量a的值。这时变量a还没有声明和赋值,所以这是一种错误的做法,但是实际上不会报错。因为存在变量提升,真正运行的是下面的代码:

  1. var a;
  2. console.log(a);
  3. a = 1;

数据类型

最新的 ECMAScript 标准定义了 8 种数据类型,有 6 种原始类型和两个特殊值。
6 种原始类型分别是:

  • 数值(Number)
  • 字符串(String)
  • 布尔(Boolean)
  • 对象(Object)
  • 数组(Array)
  • 函数(Function)

2 个特殊值:

  • Null
  • Undefined

JavaScript使用 typeof 运算符 可以确定一个值到底是什么类型:

  1. typeof 123; // "number"
  2. typeof "123"; // "string"
  3. typeof false; // "boolean"
  4. typeof undefined; //"undefined"
  5. function f(){};
  6. typeof f; //"function"
  7. //除了以上所有的都是object
  8. typeof null; //"object"
  9. typeof {}; //"object"
  10. typeof []; //"object"
  11. typeof window; //"object"

从上面代码可以看到,空数组([])的类型也是object,这表示在JavaScript内部,数组本质上只是一种特殊的对象。另外,null的类型也是object,这是由于历史原因造成的,为了兼容以前的代码,后来就没法修改了,并不是说null就属于对象,本质上null是一个类似于undefined的特殊值。既然typeof对数组(array)和对象(object)的显示结果都是object,那么怎么区分它们呢? instanceof 运算符可以做到。

  1. var o = {};
  2. var a = [];
  3. o instanceof Array ; //false
  4. a instanceof Array ; //true

instanceof 运算符 用来确定一个对象是否为某个构造函数的实例。

  1. var v = new Vehicle();
  2. v instanceof Vehicle
  3. // true

instanceof运算符的左边放置对象,右边放置构造函数。在JavaScript之中,只要是对象,就有对应的构造函数。因此,instanceof运算符可以用来判断值的类型。

  1. [1, 2, 3] instanceof Array // true
  2. ({}) instanceof Object // true

上面代码表示数组和对象则分别是Array对象和Object对象的实例。最后那一行的空对象外面,之所以要加括号,是因为如果不加,JavaScript引擎会把一对大括号解释为一个代码块,而不是一个对象,从而导致这一行代码被解释为“{}; instanceof Object”,引擎就会报错。需要注意的是,由于原始类型的值不是对象,所以不能使用instanceof运算符判断类型。

  1. "" instanceof String // false
  2. 1 instanceof Number // false

上面代码中,字符串不是String对象的实例(因为字符串不是对象),数值1也不是Number对象的实例(因为数值1不是对象)。如果存在继承关系,也就是某个对象可能是多个构造函数的实例,那么instanceof运算符对这些构造函数都返回true。

  1. var a = [];
  2. a instanceof Array // true
  3. a instanceof Object // true

上面代码表示,a是一个数组,所以它是Array的实例;同时,a也是一个对象,所以它也是Object的实例。


Null 和 Undefined

null与undefined都可以表示“无”,含义非常相似。将一个变量赋值为undefined或null,个人认为几乎没区别。
对于null和undefined,可以大致上像下面这样理解。

null表示”没有对象”,即该处不应该有值。典型用法是:

  • 作为函数的参数,表示该函数的参数不是对象。

  • 作为对象原型链的终点。

undefined表示”缺少值”,就是此处应该有一个值,但是还未定义。典型用法是:

  • 变量被声明了,但没有赋值时,就等于undefined。
  • 调用函数时,应该提供的参数没有提供,该参数等于undefined。
  • 对象没有赋值的属性,该属性的值为undefined。
  • 函数没有返回值时,默认返回undefined。
  1. var i ;
  2. i //undefined
  3. function f(x){console.log(x)}
  4. f() //undefined
  5. var o = new object();
  6. o.a //undefined
  7. var x = f();
  8. x //undefined

布尔值

JavaScript预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。

  • undefined
  • null
  • 0
  • NaN
  • false
  • “”

需要特别注意的是,空字符串(“”)是false,但空数组([])和空对象({})对应的布尔值,都是true。

  1. if([]){console.log(true)}
  2. //true
  3. if({}){console.log(true)}
  4. //true

更多相关文章

  1. 还在死磕 Ajax?那可就 out 了!
  2. 补:0811作业 类与对象
  3. OOP面向对象基本演绎
  4. opp基础:类与对象的 类的继承和调用 构造器 静态成员等
  5. 作业内容:oop基础:请举例实例演绎以下难点 1. 类(对象抽象化的结
  6. php面向对象之对象成员,静态成员,继承
  7. php面向对象的入门学习(类与对象)
  8. 类与对象的概念,类与对象的特点及构造函数
  9. php灭绝师太私密亲传面向对象(OOP)编程

随机推荐

  1. 看动画轻松理解「链表」实现「LRU缓存淘
  2. 我用python掐指一算,2020高考分数和录取情
  3. 一道腾讯面试题:厉害了我的杯
  4. 嘿,你知道新冠疫情现在什么样了吗?
  5. C#基础入门第十四天(MD5加密,WinForm)
  6. 啥是佩奇排名算法
  7. Python与Tableau相结合,万字长文搞定传统
  8. 图解LeetCode第 279 号问题: 完全平方数
  9. Android(安卓)- 引用计数(sp、wp、Refbase
  10. 时间序列&日期学习笔记大全(上)