资讯专栏INFORMATION COLUMN

JS 中的类型判断

ChanceWong / 2448人阅读

摘要:和这三种基本的数据类型,都有对应的引用包装类型和。应用于引用类型的判断,所以对于这三类基本类型没有什么意义。

JS 中的类型判断 js中的数据类型

基本数据类型

undefined、number、string、boolean

引用数据类型

null、Object、Number、String、Boolean、Function、Array、Date、RegExp、Error、Arguments

typeof

typeof操作符可能返回下面几种字符串

"undefined" 如果这个值未定义

"boolean" 如果这个值是布尔值

"string" 如果这个值是字符串

"number" 如果这个值是数值,注意其中NaN 返回的也是"number"

"function" 如果这个值是函数

"object" 如果这个值是对象或者是null

undefined boolean string number 都是基本的数据类型
function 和 object是引用类型,变量指向的是对象的地址,
对于引用类型的变量,typeof只可以区分出function,其他类型的统一识别成object。

boolean string 和number这三种基本的数据类型,都有对应的引用包装类型
Boolean String 和Number。

对于这些包装类型的变量,typeof统一识别成object

var a = new String("hello");
typeof a // object
var b = "hello";
a === b // false
a ==b //true
a 实际变成了一个String类型的引用变量
所以a === b 是false,但是用== 比较的时候 b隐式调用了toString的方法 所以是true


多说一句,其实我们在调用基本类型的方法的时候,都是隐式的转为包装对象以后才能调用。

instanceof

instanceof 应用于引用类型的判断,所以对于string number boolean 这三类基本类型没有什么意义。
instanceof 支持继承 因为所有的引用类型都继承自Object,所以所有引用变量都是Object的实例

var a = new String("hello");
a instanceof String  //true
a instanceof Object  //true
var b = "hello";
b instanceof String  // false

我开始以为instanceof是通过判断a的__proto__ 上的constructor 属性来判断构造函数的类型,但是改变a.__proto__.constructor = Number 之后
a instanceof String 仍然为true

var a = new String("hello");
a.__proto__.constructor = Number;
a instanceof String  //true
a instanceof Number  //false
Object.prototype.toString.call()

这个是通过调用Object原型上的toString方法来判断变量的类型
这个方法不会区分是基本类型还是包装的引用类型,其实大多数情况下我们真不不需要区分。

var a = new String("hello")
var b = "hello";
Object.prototype.toString.call(a)  //"[object String]"
Object.prototype.toString.call(b)  //"[object String]"

该方法还能够区分null和undefined

Object.prototype.toString.call(null)  //"[object Null]"
Object.prototype.toString.call(undefined)  //"[object Undefined]"

所以判断数据类型最靠谱的方法就是这个了。

underscore 中的实现
//代码中的toString 方法 就是Object.prototype.toString
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
  _.each(["Arguments","Function", "String", "Number", "Date", "RegExp", "Error"], function(name) {
    _["is" + name] = function(obj) {
      return toString.call(obj) === "[object " + name + "]";
    };
  });
  
  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === "[object Boolean]";
  };
  
虽然这个方法很好但是没有办法区分基本类型和引用类型,采用typeof可以判断:
    // 判断是否是引用类型
    _.isObject = function(obj) {
    var type = typeof obj;
    return type === "function" || type === "object" && !!obj;
    };

    //通过instanceof Object  应该也可以判断 是不是引用类型 并且不是null和undefined
  
  
    // 判断是否为数组
    _.isArray = nativeIsArray || function(obj) {
      return toString.call(obj) === "[object Array]";
    };
    //nativeIsArray 是ES5原生的Array.isArray
    
    //判断是否是NaN,利用NaN是唯一一个不等于自己的Number类型
    _.isNaN = function(obj) {
      return _.isNumber(obj) && obj !== +obj;
    };
    
    _.isUndefined = function(obj) {
        return obj === void 0;
    };
  
    _.isNull = function(obj) {
        return obj === null;
    };
    
     _.isFinite = function(obj) {
    return isFinite(obj) && !isNaN(parseFloat(obj));
    };
    
    //在 IE < 9 下对 arguments 调用 Object.prototype.toString.call,结果是 [object Object],所以利用他的callee属性来判断
    if (!_.isArguments(arguments)) {
        _.isArguments = function(obj) {
          return _.has(obj, "callee");
        };
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80891.html

相关文章

  • js笔记内容

    摘要:定义运算符用来判断一个构造函数的属性所指向的对象是否存在另外一个要检测对象的原型链上,用于引用类型。但其实,实例的来自于构造函数的。 一、关于css 样式优先级: 行内样式>id选择器样式>类选择器样式>标签选择器样式>通配符选择器的样式>继承样式>默认样式 二、关于js 关于问题:**JavaScript中的所有事物都是对象??** 从typeof和instanceo...

    n7then 评论0 收藏0
  • JS中的typeof和类型判断

    摘要:摘要这篇文章讲述运算符判断基本类型和引用类型的区别,以及怎么判断数组类型和空对象有种原始类型,即和。类型判断类型判断,一般就是判断是否是数组,是否是空对象。方法四使用语法,返回一个数组,只需要判断数组长度是否大于即可。 摘要 这篇文章讲述typeof运算符判断基本类型和引用类型的区别,以及怎么判断数组类型和空对象 typeof ECMAScript 有 5 种原始类型(primitiv...

    cppowboy 评论0 收藏0
  • js

    摘要:所以我们又可以得出一个结论原型的属性指向构造函数,构造函数又通过属性指回原型,但是并不是所有函数都具有这个属性,就没有这个属性。 1.原始类型 boolean number string null undefined symbol原始类型储存的都是值,是没有函数可以调用的,undefined.toString() 显示报错,但是1.toString() // 1 ; 是因为1被强制转...

    pubdreamcc 评论0 收藏0
  • 杂谈数据类型获取

    摘要:如果项目中需要频繁的进行数据类型的判断与获取可以考虑进行封装,简单的处理与已足够。 前言 在js中数据我们经常需要判断或者获取数据类型,大部分时候我们都是通过type加instanceof来组合判断数据类型来实现,大部分代码中对于数据类型的获取处理都比较丑陋,前段时间看了一下Q的源代码中对数据类型的判断与获取处理,看起来相当简洁也比较好用,这篇文章来进行一下发散。 typeof 在js...

    newsning 评论0 收藏0
  • 分析 JavaScript 的数据类型与变量

    摘要:基本数据类型在中,基本数据类型有种,即数值字符串布尔值。两个布尔值转为数值进行比较。对于对象和布尔值,调用它们的方法得到对应的字符串值,然后进行字符串相加。减法对于字符串布尔值或者,自动调用,转换结果若为,那么最终结果为。 这篇文章,来聊聊 JS 中的数据类型与变量。这是在学习 JS 时最基础的一类问题,但却很重要。希望我的分享有帮助到你。 文章开头,我先提几个面试中遇到的问题: 比如...

    Mike617 评论0 收藏0

发表评论

0条评论

ChanceWong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<