原始类型:number; string; boolean,undefined, null
引用类型:狭义的对象(object),array,function 布尔值判断:
- 以下自动转换成false:undefined null false 0 NaN "" '';
- 以下自动转换成true:[],{}
数据类型难以理解的点整体如下(每一条都需要理解)
-
对象分为两种:普通对象和函数对象
-
函数对象:通过new Function()出来的就是函数对象;Function和Object都是函数对象
-
普通对象:其余都是,包括字面量定义的:
-
Object有两种类型的方法: 本身的方法和实例方法;原因是Object既是是一个对象,也是一个构造函数
-
任何对象都有自己的原型对象,不是只有用构造方法new出来的对象才有
-
通过var obj = new Object()的写法生成新对象,与字面量的写法var obj = {}是等价的。
-
所有对象的原型最终都是 Object.prototype。
-
所有对象都有constructor属性,即使是字面量定义的也有
-
可以理解为构造函数是由Function这个对象new出来的
-
由于Object对象也是构造函数,因此它也是由Function这个对象new出来的
-
由于Function是构造函数,因此他有自己的prototype属性,且是一个对象
-
每个函数都有prototype属性,指向一个普通对象。普通函数也有,只是一般没有用
-
实例的构造函数属性(constructor)指向构造函数
-
每个对象都有__proto__属性,但只有函数对象才有prototype属性
-
绝大多数对象的原型链顶端都是Object.prototype。例外:var obj = Object.create(null)
看实际例子:
var a = {
name: "a"
}
function People(name) {
this.name = name;
}
a.__proto__ == Object.prototype
a.constructor == Object)
People.constructor == Function
People.prototype.constructor == People
People.prototype.__proto__ == Object.prototype
Date.prototype.__proto__ == Object.prototype
Date.constructor == Function
Date.__proto__ == Function.prototype
Object.prototype.__proto__ == null
Object.__proto__ == Function.prototype //特别1
Object.prototype == Function.prototype.__proto__//特别2
Function.__proto__== Function.prototype
//静态方法
Object.keys()
var obj = {
p1: 123,
p2: 456
};
Object.keys(obj) // ["p1", "p2"]
//2.实例方法
Object.prototype.hasOwnProperty()
var obj = {
p: 123
};
obj.hasOwnProperty('p') // true
obj.hasOwnProperty('toString') // false