js的数据类型、判断对象类型 js对象
1.js中的数据类型有以下几种:
Number Boolean undefined Object Function String Null
基本类型:Number Boolean String undefined null
引用类型:Object Function
基本类型的数据是存放在栈内存中的,而引用类型的数据是存放在堆内存中的
2.判断数据类型
参考学习:http://www.cnblogs.com/ziyunfei/archive/2012/11/05/2754156.html
在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” ,“function”六种。
对于数组,对象,null来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。
要想区别对象、数组、函数单纯使用 typeof 是不行的,JavaScript中,通过Object.prototype.toString方法,判断某个对象值属于哪种内置类型。
例子:
var arr = [];
console.log(Object.prototype.toString.call(arr))
结果:
“[object Array]”
在ES3中,Object.prototype.toString方法的规范如下:
Object.prototype.toString()
在toString方法被调用时,会执行下面的操作步骤:
1. 如果this的值为undefined,则返回"[object Undefined]".
2.如果this的值为null,则返回"[object Null]".
3.让O成为调用ToObject(this)的结果.
4. 获取this对象的[[Class]]属性的值。
5. 计算出三个字符串"[object ", 第一步的操作结果Result(1), 以及 "]"连接后的新字符串。
6. 返回第二步的操作结果Result(2)。
[[Class]]是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中,[[Class]]是这么定义的:
内部属性 描述
[[Class]] 一个字符串值,表明了该对象的类型。
其过程简单说来就是:1、获取对象的类名(对象类型)。2、然后将[object、获取的类名、]组合并返回。
var arr=[1,2];
//直接对一个数组调用toString()
arr.toString();// "1,2"
判断是否为数组对象
//通过call指定arr数组为Object.prototype对象中的toString方法的上下文
Object.prototype.toString.call(arr); //"[object Array]"
判断对象类型是否为数组
function isArray(arg) {
if (typeof arg === 'object') {
return Object.prototype.toString.call(arg) === '[object Array]';
}
return false;
}
3.有关js对象(内置,原生,宿主,全局)
原生对象(内部对象,本地对象)(native object):独立于宿主环境的ECMAScript实现提供的对象。
内置对象:由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现,即在引擎初始化阶段就被创建好的对象。
宿主对象:由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。
全局对象:全局对象:一般全局对象会有两个,一个是ecma提供的Global对象,一个是宿主提供。如在浏览器中是window、在nodejs中是global。【所以啊,在浏览器中全局对象是Global+window】
通常情况下ecma提供的Global对象对是不存在的,没有具体的对象,
原生对象:object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError、Global
内置对象:Global(全局对象)、Math
宿主对象:有宿主提供的对象,在浏览器中window对象以及其下边所有的子对象(如bom、dom等等),在node中是globla及其子对象,也包含自定义的类对象。
全局对象:一般全局对象会有两个,一个是ecma提供的Global对象,一个是宿主提供。
内置对象之Global
Global即为全局对象,Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在!
在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。
类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。
而且Global对象的方法还不止这些。