数据类型
js里的数据类型分为两种:对象类型和原始类型
对象(object)类型: 引用类型:数组,函数等等
- Date
- Array
- function
- .......
原始类型:非对象并且无方法的数据:null表示"没有对象",即该处不应该有值,undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。
- number
- string
- boolean
- null
- undefined
对象的概念
对象的概念:
以{}表示, 是属性和方法的集合(变量和function的集合),一个对象类型的实例,通过函数创建。对象都有一个__proto__属性,指向这个对象的构造函数的原型对象(prototype属性)。
对象的属性具有相应的权限:
对象的属性有权限,例如能不能被delete,查看等等,例如申明一个变量,变量就是基本类型的实例: var a =1 ;b=1 其中, a不能被delete 隐性申明的b可以被delete 。可以在添加对象的属性时给它赋予权限属性,对象也拥有标签,可以通过Object来定义对象的权限:不能添加属性,不能删除修改等等
原型对象的概念:
该对象的父类,构造函数都有一个prototype属性,指向原型对象(原型对象在定义函数时同时被创建),__proto__和prototype属性的值都指向原型对象,一个是对象的属性,一个是函数的属性
对象的创建过程
执行如下代码
function co(){
this.a = "i am a",
this.alerta = function(){
alert(this.a);
}
}
//通过构造函数new对象
var test = new co();
那么,通过构造函数new对象的过程中,发生了什么?其实很简单,就四件事:
1. var obj = {};
2. obj._proto_ = co.prototype;
3. co.call(obj);
4. return obj;
- 创建一个空对象 obj
- 将这个空对象onj的成员属性_proto_指向了构造函数对象co的prototype成员属性(对象)
- 构造函数的作用域赋给新对象,因此co函数中的this赋值给新对象,因此co函数中的this指向obj,然后再调用co函数,于是obj就被赋值了成员对象a和alerta
- 返回新对象,当构造函数里包含返回语句时比较特殊
对象之间类型的比较
===:
- 类型不同 返回false 类型相同
- 类型相同,值也相同,大部分返回 true,也有特例。
-
特例: null === null //true; unefined === undefined //true; NaN === NaN //false; NaN是一种特殊的number类型,和任何类型 === 都返回false; new Object === new Object // false; 对象比较引用,除非两边是同一对象引用才会返回 true
==:
- 类型相同 和 === 一样
- 类型不同,先尝试转型,再进行比较,具体问题遇到再查询
对象类型的检测
typeof :
一个一元运算,运算数可以是任意类型。它返回值是一个字符串,该字符串说明运算数的类型。
- 不够精细,只能返回类型,如果要获取 Array 而非 Object 则实现不了,不能判断具体引用类型,但是为什么能拿到function对象
- 遇到null失效
instanceof :
操作符, a instanceof Obiect ,左边必须是对象,否则返回false。
- 比typedef 更细,判断左边对象a的原型链(继承)的原型(父类)是否有右边这个构造函数的prototype对象属性
- 不可以跨ifram,window对象使用
- 简单来说就是判断该对象是哪种引用类型
Object.prototype.tostring.apply():
- 既能判断基本类型,也能判断引用类型(对象类型)
- 遇到Null,undefined会在IE678失效
对象的包装机制
var a = “string”;
alert(a.length); //6
a.t = 3;
alert(a.t); //unefined
基本类型有自己对应的包赚对象,但是null和indefine是没有包装对象的
基础类型a能够访问对象才有的a.length属性,是因为 js 给你做了一步操作:
var aa = new String(a),然后通过 aa这个临时的对象去访问属性,但是这个对象在执行完a.length会立刻销毁,所以访问a.t是unefined.也就是说基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装对象消失。
对象的序列化
将js对象转化成字符串:
- 通过JSON.stringify(obj) 实现
- jequery ajax请求 自动将对象序列化了
- JSON.parse('{"x":1}') 将字符串转化为json格式对象
js对象自定义序列化:
- 对象内添加toJSON函数