js数据类型

30 阅读2分钟

原始类型:number; string; boolean,undefined, null

引用类型:狭义的对象(object),array,function 布尔值判断

  • 以下自动转换成false:undefined null false 0 NaN "" '';
  • 以下自动转换成true:[],{}

数据类型难以理解的点整体如下(每一条都需要理解)

  • 对象分为两种:普通对象和函数对象
    
  • 函数对象:通过new Function()出来的就是函数对象;FunctionObject都是函数对象
    
  • 普通对象:其余都是,包括字面量定义的:
    
  • 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