一个完整的JavaScript实现应该有以下三个不同的部分组成:
- 核心(ECMAScript)
- 文档对象模型(DOM)
- 浏览器对象模型(BOM)
数据类型
ECMAScript中有5种简单的数据类型: Undefined、Null、Boolean、Number和String。
还有一种复杂的数据类型: Object。
关于Object
在javaScript中,所有的对象都是基于Object的,Object是所有实例的基础。
所有的对象都继承了Object中prototype的属性和方法,但是他们可以被覆盖,比如Array就重写了Object.prototype.toString()方法。
对象类型检测
要检测一个变量是哪种基本数据类型,typeof 操作符是最佳的工具。
typeof操作符能够确定一个变量是否是字符串、数值、布尔值、还是undefined。
如果变量是一个对象,则typeof操作符会返回object。
1 2 3 4 5 6
| typeof "xuwenjiang" typeof 25 typeof true typeof undefined typeof null typeof new Object()
|
虽然在检测基本数据类型时,typeof是非常得力的助手,但在检测引用数据类型时,这个操作符用处不大。
通常我们不想直到某个值是不是对象,而是想知道它是什么类型的对象。这时候,instanceof就派上用场了。
1 2 3 4 5 6 7 8
| [1,2,3] instanceof Array function(){} instanceof Function new Object instanceof Object /\w/ instanceof RegExp [1,2,3] instanceof Object [1,2,3] instanceof Function null instanceof Object
|
如果使用instanceof操作符检验基本类型,则该操作符始终会返回false,因为基本类型不是对象。
该方法返回一个代表该对象的字符串,比如object Object
。
1 2 3 4 5 6 7
| 'use strict' var toString = Object.prototype.toString(); toString.call([1,2,3]); toString.call(undefined); toString.call(null); toString.call(new Date()); toString.call(25);
|
该属性返回创建了该对象原型的函数引用,对于原始值(比如1,true或者’test’),该属性为只读。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| function Person(name, age){ this.name = name; this.age = age; } var xwj = new Person('xuwenjiang', 21); console.log(xwj.constructor); console.log([1,2,3].constructor); console.log(/\w/.constructor); console.log(function(){}.constructor); console.log(new Date().constructor); console.log({}.constructor); console.log((2).constructor); console.log(('xwj').constructor); console.log((true).constructor); xwj.constructor = Array; console.log(xwj.constructor)
|