instanceof, typeof, & Object.prototype.toString
/**
*
* @authors Your Name (you@example.org)
* @date 2016-11-18 09:31:23
* @version $Id$
*/
instanceof:
1、左操作数是一个对象,右操作数是标识对象的类,如果左侧的对象是右侧类的实例,则表达式返回true,否则返回false
2、如果左边的操作数不是对象,返回false
3、如果右边的操作数不是函数,抛出类型错误异常
4、在计算obj instanceof f 时, 会先计算f.prototype, 然后在原型链中查找obj,如果找到则obj是f或者是f父类的实例,则返回true
//注意原始值与对象的区别
//instanceof
var data = [1, 2, 3, 4, 5];
data instanceof Array; //true
data instanceof Object; //true
data instanceof Number; //false
1 instanceof Number; //false
1 instanceof Object; //false
var num = 1;
num instanceof Number; //false
num instanceof Object; //false
var num = Number(1);
num instanceof Number; //false
num instanceof Object; //false
Number(1) instanceof Number; //false
Number(1) instanceof Object; //false
var num1 = new Number(1);
num1 instanceof Number; //true
num1 instanceof object; //true
null instanceof Object; //false;
undefined instanceof Object; //false;
var data = [1, 2, 3, 4, 5];
var bb = {};
var cc = function(){};
data instanceof bb; //TypeError: Expecting a function in instanceof check, but got #<Object>
data instanceof cc; //false
typeof
typeof a : typeof 后的操作数可以是任意类型,返回值为操作数类型的字符串
//typeof
typeof undefined; // "undefined"
typeof null; // "object"
typeof ture; // "boolean"
typeof false; // "boolean"
typeof NaN; // "number"
typeof Infinity // "number"
typeof 1 //"number"
typeof "abc"; //"string"
typeof function(){}; // "function"
typeof RegExp; //"function"
typeof Math; //"object"
Object.prototype.toString
默认的toString方法:Object.prototype.toString()返回[object class], 我们可以通过它获取对象的类型信息
var data = [1, 2, 3, 4, 5];
Object.prototype.toString.call(data); //"[object Array]"
我们可以定义如下的函数返回对象的类型信息
function classof(obj){
if(obj === null){
return "Null";
}
if(obj === undefined){
return "Undefined";
}
return Object.prototype.toString.call(obj).slice(8, -1);
}
测试:
classof(null); // "Null"
classof(undefined) // "Undefined"
classof("abc"); // "String"
classof([]); // "Array"
classof({}); //"Object"
classof(//); // SyntaxError: Unexpected token }
classof(/,/); //"RegExp"
classof(new Date()); //"Date"
classof(window); // "global"
classof(function(){}); // "Function"
function f(){}; classof(new f()); //"Object"
需要注意的:
1、javascript中除了原始值(数字、字符串、布尔值、null、undefined)之外的都是对象
2、javascript不区分整数值和浮点数值
3、任何Javascript值都可以转换为布尔值,下面的都会被转换为false
undefined
null
0 / -0
NaN
""
因而如需检测对象是不是null应该采用如下方式而不是直接if(obj):
if(obj !== null)
4、null是关键字可以理解为一个特殊的对象值,但是对 typeof null 返回"object"
5、undefined用于表示未定义,不是关键字,typeof undefined 返回 "undefined"
查询时如果不存在返回undefined,函数没有返回值返回undefined;
undefined是预定义的全局变量;在ECMAScript3中是可读写变量,ECMAScript5中是只读变量
null == undefined; //true
null === undefined; //false;
另外null和undefined不包含任何属性和方法,因而使用用null和undefined做. 或者 [] 操作会报类型错误
6、null和undefined在任何期望是一个对象的地方都会造成类型错误异常,区别于字符串、数字、布尔值,详细见下一条
7、字符串,数字和布尔值虽然不是对象,但是在读取它们的属性或者方法时,表现的和对象一样,使用它们的方法和属性时会通过其对应的构造函数创建一个临时对象,例如:
var string = "wish you happy";
var words = string.split(" ");
我们在引用string的属性时javascript会调用new String(string);
但是,如果我们给他们的属性赋值则会忽略相关操作,例如:
var string = "wish you happy";
string.length = 17;
string.len = 14;
console.log(string.length); //14
console.log(string.len); //undefined
8、需要注意的类型转换:
//转化为字符串
undefined: "undefined"
null: "null"
true: "true"
false: "false"
0: "0"
-0: "0"
NaN: "NaN"
Infinity: "Infinity"
-Infinity: "-Infinity"
[]: ""
[1, 2, 3]: "1,2,3"
//转化为数字
undefined: NaN
null: 0
"": 0
"1.2": 1.2
"wish": NaN
instanceof, typeof, & Object.prototype.toString的更多相关文章
- JS基础-数据类型判断typeof、instanceof、Object.prototype.toString
typeof用在基本数据类型和函数时,返回其对应类型的描述,对于引用类型都返回为object. instanceof无法判断基本数据类型,对于引用类型数据,返回其其对应类型. Object.proto ...
- instanceof constructor Object.prototype.tostring.call ( [] )区别 数组和 对象的3中方法
- Object.prototype.toString & typeof
Object.prototype.toString & typeof Object.prototype.toString 获取某个对象属于哪种内置类型 typeof 得到某个对象的类型 差别 ...
- 类型判断----小白讲解typeof,instanceof,Object.prototype.toString.call()
1.typeof只能判断基本类型数据, 例子: typeof 1 // "number" typeof '1' // "string" typeof true ...
- JS四种判断数据类型的方法:typeof、instanceof、constructor、Object.prototype.toString.call()
1.typeof 1 console.log(typeof ""); //string 2 console.log(typeof 1); //number 3 console.lo ...
- typeof 、Object.prototype.toString和 instanceof
数据类型 js 基本类型包括:Undefined symbol null string boolean number js 引用类型包括:object array Date RegExp typeo ...
- JavaScript instanceof深度剖析以及Object.prototype.toString.call()使用
本文由segementfalt上的一道instanceof题引出: var str = new String("hello world"); console.log(str ins ...
- 利用Object.prototype.toString方法,实现比typeof更准确的type校验
Object.prototype.toString方法返回对象的类型字符串,因此可以用来判断一个值的类型. 调用方法: Object.prototype.toString.call(value) 不同 ...
- Object.prototype.toString.call() 、 instanceof 以及 Array.isArray()判断数组的方法的优缺点
1. Object.prototype.toString.call() 每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object ...
随机推荐
- CentOS 访问Windows7共享文件夹
在终端中输入命令mount -t cifs -o username="xxx",password="****" //192.168.1.1/share_fold ...
- 为什么一个类的全局变量默认以m开头?
某天闲着无聊,突然想起来为什么大家都习惯将全局变量使用m开头,于是追根求源,查了一些资料,虽然并不是我想要的,但是也总结一下. 在stackoverflow上就有人问: Why do most var ...
- Log4j的ConversionPattern无缝适配到Logback
为了能将log4j的ConversionPattern无缝应用到logback上来,需要对两个Conversion做适配,具体可以参考:Log4j 与 Logback的ConversionPatter ...
- iOS-三方框架AFNetworking基本使用
AFNetworking 是基于NSURLConnection, NSOperation开发的一款三方框架,主要用于处理一些关于网络请求上的业务,下文会简单介绍框架中经常使用的功能,如文件的上传,下载 ...
- PHP的高效IOC框架——CanoeDI
一个非常简单且实用的IoC框架,相对于其他的Ioc框架有如下特点: 高效: 框架使用了非常实用且高效的算法,使得框架本身对应用的影响微乎其微,且框架提供了C扩展,最大限度的将性能提升到最高. 配置简单 ...
- Windows & Office完美结合,助力办公
虚拟桌面——休闲工作分开来 Windows 10最令我欣愉的是加入了虚拟桌面的功能. 作为一名拖延症晚期患者,早已病入膏肓.每次工作时总会不知不觉地将实现转移到已经打开的浏览器及聊天工具上,时间就这样 ...
- Manhattan distance(for lab)
Input four integer x1, y1, x2, y2, which is mean that the coordinates of two points A(x1, y1), B(x2, ...
- Win7系统修改hosts文件不能保存的解决方法
地址:http://jingyan.baidu.com/album/e5c39bf56564a539d7603312.html
- Atom.io设置ctrl+delete
一般常见的text editor,在文本前面的空白处按下ctrl+delete,只是删除空白符到单词前面停下,但是Atom.io的默认设置,把空白符后遇到的第一个单词也删掉了.改配置方法是在keyma ...
- 使用 CXF 做 webservice 简单例子
Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量 ...