js数据类型的检测总结,附面试题--封装一个函数,输入任意,输出他的类型
一、javascript 中有几种类型的值
1.基本数据类型 : 包括 Undefined、Null、Boolean、Number、String、Symbol (ES6 新增,表示独一无二的值)
特点: a. 值不可变
b. 存放在栈中
c.双等和全等的区分
2.引用数据类型: 包括 Object、Array、Function
特点: a.值可变
b.同时保存再栈内存和堆内存
c.比较是引用的比较
二、javascript 数据类型的检测
1.typeof : 返回一个表示数据类型的字符串(number boolean string symbol object undefined function), 缺点: 不能判断 null array 时间对象 正则对象
- typeof Symbol(); // symbol 有效
- typeof ''; // string 有效
- typeof 1; // number 有效
- typeof true; //boolean 有效
- typeof undefined; //undefined 有效
- typeof new Function(); // function 有效
- typeof null; //object 无效
- typeof [] ; //object 无效
- typeof new Date(); //object 无效
- typeof new RegExp(); //object 无效
null 和 array 都会返回 object
2. indestanceof : 判断 A 是否是 B 的实例 (A instanceof B),返回布尔值,便是一个对象在其原型链中是否存在一个构造函数的prototype属性。
缺点: a.字面量创建和实例方式创建有区别,只有实例创建的结果才是标准的。
- console.log(1 instanceof Number)//false
- console.log(new Number(1) instanceof Number)//true
b.只要再当前的实例原型链上,检测结果都为true
- var arr = [1, 2, 3];
- console.log(arr instanceof Array) // true
- console.log(arr instanceof Object); // true
- function fn(){}
- console.log(fn instanceof Function)// true
- console.log(fn instanceof Object)// true
c.不能检测 null 和 undefined: 对于特殊的数据类型 null 和 undefined,他们的所属类是 Null 和 Undefined,但是浏览器把这两个类保护起来了,不允许我们在外面访问使用。
使用instanceof检测 数组、对象、时间对象、正则对象
- [] instanceof Array; //true
- {} instanceof Object;//true
- new Date() instanceof Date;//true
- new RegExp() instanceof RegExp//true
4.constructor: constructor 检测 Object 与 instanceof 不一样,还可以处理基本数据类型的检测。
- var aa=[1,2];
- console.log(aa.constructor===Array);//true
- console.log(aa.constructor===RegExp);//false
- console.log((1).constructor===Number);//true
- var reg=/^$/;
- console.log(reg.constructor===RegExp);//true
- console.log(reg.constructor===Object);//false
缺点: a. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的
b.函数可以把类的原型进行重写,所以检测不稳定
5.Object.prototype.toString.call() : Object.prototype.toString.call() 最准确最常用的方式。首先获取 Object 原型上的 toString 方法,让方法执行,让 toString 方法中的 this 指向第一个参数的值。
Object对象和它的原型链上各自有一个toString()方法,第一个返回的是一个函数,第二个返回的是值类型。
一般情况下,js中对象的toString(),返回字符串,内容与函数声明语法有关,例如[1,2,3].toString()//"1,2,3"
大多数都返回函数的完整源码,Array.toString()//"function Array() { [native code] }"
内置函数往往返回一个类似"[native code]"的函数体,需要配合call方法,比如Object.prototype.toString.call([1,2,3])//"[object Array]"
- Object.prototype.toString.call('') ; // [object String]
- Object.prototype.toString.call(1) ; // [object Number]
- Object.prototype.toString.call(true) ; // [object Boolean]
- Object.prototype.toString.call(undefined) ; // [object Undefined]
- Object.prototype.toString.call(null) ; // [object Null]
- Object.prototype.toString.call(new Function()) ; // [object Function]
- Object.prototype.toString.call(new Date()) ; // [object Date]
- Object.prototype.toString.call([]) ; // [object Array]
- Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
- Object.prototype.toString.call(new Error()) ; // [object Error]
- Object.prototype.toString.call(document) ; // [object HTMLDocument]
- Object.prototype.toString.call(window) ; //[object global] window是全局对象global的引用
三、面试题: 封装一个函数,输入任意,输出他的类型
- function type(target) {
- var ret = typeof(target);
- var template = {
- "[object Array]": "array",
- "[object Object]":"object",
- "[object Number]":"number - object",
- "[object Boolean]":"boolean - object",
- "[object String]":'string-object'
- }
- if(target === null) {
- return 'null';
- }else if(ret == "object"){
- var str = Object.prototype.toString.call(target);
- return template[str];
- }else{
- return ret;
- }
- }
参考资料:
【文章】[ JS 进阶 ] 基本类型 引用类型 简单赋值 对象引用(推荐)
JS 判断数据类型的三种方法
JS 中的数据类型及判断
Javascript 判断变量类型的陷阱 与 正确的处理方式
判断 JS 数据类型的四种方法
- JavaScript 的数据类型及其检测
js数据类型的检测总结,附面试题--封装一个函数,输入任意,输出他的类型的更多相关文章
- 面试题-->写一个函数,返回一个数组中所有元素被第一个元素除的结果
package com.rui.test; import java.util.Random; /** * @author poseidon * @version 1.0 * @date:2015年10 ...
- js 数据类型及检测
js中基本数据类型有6种number.string.undefined.null.boolean,Symbol (ES6 新增,表示独一无二的值),还有一种数据类型为引用数据类型统称为Object对象 ...
- js数据类型检测小结
在js中,有四种用于检测数据类型的方式,分别是: typeof 用来检测数据类型的运算符 instanceof 检测一个实例是否属于某个类 constructor 构造函数 Object.protot ...
- js 数据类型检测
提起数据类型检测 大多数人首先想起的应该是 typeof 'xxx' == '数据类型' 坦然这种方法对于基本数据类型的检测还是非常方便的,但是当遇到引用数据类型 Object时却爱莫能助,下面就 ...
- JS数据类型和堆栈+变量比较和值的复制+参数传递和类型检测
变量命名 变量名:字母 数字 下划线 美元符$ jquery: $ $.each() $ === jQuery underscore( js的一个函数库) : _ _.ea ...
- 总结的JS数据类型判定(非常全面)
用typeof 来检测数据类型 Javascript自带两套类型:基本数据类型(undefined,string,null,boolean,function,object)和对象类型. 但是如果尝试用 ...
- JS数据类型的理解(猜测)
Js 数据类型 对于这个主题,首先来看几个问题,如果你对这几个问题很清楚的话,那就请直接跳过吧,不用接着往下看了,如果不清楚,建议你还是看看. 1)如果判断函数?function 和object的联系 ...
- 判断JS数据类型的四种方法
在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示: 基本类型:String.Number.Boolean.Symbol.Undefined.N ...
- 1. js数据类型_对象_函数_内存
1. js数据类型有哪些? 基本(值)类型 Number ---- 任意数值 String ---- 任意字符串 Boolean ---- true/false undefined ---- unde ...
随机推荐
- jquery进阶(1)
今天我们接着来学习jQuery中的内容,包括css的操作.尺寸的操作.文档的操作.动画(有待补充),事件处理操作. 一.CSS 在css中可以设置css的基本属性 - .css("color ...
- JVM(二):垃圾回收
三个问题: 那些内存需要回收? -- 对象是否存活判断 什么时候回收? --垃圾回收触发条件 如何回收? --垃圾回收算法 垃圾回收应用 -- 理解GC日志.使用垃圾回收命令和工具 1. 判断 ...
- Vue通过状态为页面切换添加loading、为ajax加载添加loading
以下方法需要引入vuex,另使用了vux的UI框架,ajax添加loading还引入了axios. 一.为页面切换添加loading. loading.js: import Vue from 'vue ...
- Vue日历
Vue生成日历,根据返回值将日期标红 HTML: <h1>CSS 日历</h1> <div id="calendar"> <div cla ...
- 【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的 ...
- Eucalyptus常用查询命令
前言: Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) ...
- linux设置history历史记录
#说明export HISTSIZE=1000 #设置历史记录显示1000行export HISTTIMEFORMAT='%F %T ' #设置历史记录格式 999 2017-08-15 10:58: ...
- touch事件总结
$("body").on("touchstart", function(e) { e.preventDefault(); startX = e.original ...
- oracle数据类型及操作
1. Oracle字符串操作 1.1 字符串类型 Ø CHAR和VARCHAR2类型 l CHAR存放定长字符,如果数据存不满指定长度则用空格补齐,CHAR类型浪费空间换取查询时间的缩短. l VAR ...
- JavaScript: apply , call 方法
我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家 ...