资讯专栏INFORMATION COLUMN

浅谈Object.prototype.toString.call()方法

weakish / 1459人阅读

摘要:在里使用判断数据类型,只能区分基本类型,即。对于来说,使用都会统一返回字符串。要想区分对象数组函数单纯使用是不行的。在中,可以通过方法,判断某个对象之属于哪种内置类型。实例为对象添加一个去除重复项的方法这里要注意,为,为。

在JavaScript里使用typeof判断数据类型,只能区分基本类型,即:number、string、undefined、boolean、object。
对于null、array、function、object来说,使用typeof都会统一返回object字符串。
要想区分对象、数组、函数、单纯使用typeof是不行的。在JS中,可以通过Object.prototype.toString方法,判断某个对象之属于哪种内置类型。
分为null、string、boolean、number、undefined、array、function、object、date、math。

判断基本类型

Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(“abc”);// "[object String]"
Object.prototype.toString.call(123);// "[object Number]"
Object.prototype.toString.call(true);// "[object Boolean]"

判断原生引用类型

函数类型
Function fn(){
console.log(“test”);
}
Object.prototype.toString.call(fn); // "[object Function]"
日期类型
var date = new Date();
Object.prototype.toString.call(date); // "[object Date]"
数组类型
var arr = [1,2,3];
Object.prototype.toString.call(arr); // "[object Array]"
正则表达式
var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg); // "[object RegExp]"
自定义类型
function Person(name, age) {

this.name = name;
this.age = age;

}
var person = new Person("Rose", 18);
Object.prototype.toString.call(arr); // "[object Object]"
很明显这种方法不能准确判断person是Person类的实例,而只能用instanceof 操作符来进行判断,如下所示:

console.log(person instanceof Person); // true

判断原生JSON对象

var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON);
console.log(isNativeJSON);// 输出结果为”[object JSON]”说明JSON是原生的,否则不是;
注意:Object.prototype.toString()本身是允许被修改的,而我们目前所讨论的关于Object.prototype.toString()这个方法的应用都是假设toString()方法未被修改为前提的。

实例:为Array对象添加一个去除重复项的方法

input
[false, true, undefined, null, NaN, 0, 1, {}, {}, "a", "a", NaN].uniq()
output
[false, true, undefined, null, NaN, 0, 1, {}, {}, "a"]
这里要注意,NaN === NaN 为false,{} === {}为false。

Array.prototype.uniq = function () {

if (!this.length || this.length == 0) return this;
var res = [], key, hasNaN = false, temp = {};
for (var i = 0 ; i < this.length; i++) {
    if (typeof this[i] === "object") {
        res.push(this[i]);
    } else if (this[i] != this[i]) { // 如果当前遍历元素是NaN
        if (!hasNaN) {
            res.push(this[i]);
            hasNaN = true;
        }
    } else {
        key = typeof(this[i]) + this[i];
        if (!temp[key]) {
            res.push(this[i]);
            temp[key] = true;
        }
    }
}
return res;

}
另一种解法:

Array.prototype.uniq = function () {

var res = [];
var flag = true;
this.forEach(function(x) {
    if (res.indexOf(x) == -1) {
        if (x != x) {
            if (flag) {
                res.push(x);
                flag = false;
            }
        } else {
            res.push(x);
        }
    }
})
return res;

}
小礼物走一走,

作者:公子七
链接:https://www.jianshu.com/p/585...
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

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

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

相关文章

  • 浅谈ES6中基本数据类型的操作方法

    摘要:值得注意的是,中整数和浮点数采用的是同样的储存方法位双精度浮点数,所以和被视为同一个值。 在Javascript中,数据类型分为基本数据类型和引用数据类型两大类,其中,Array和Function在本质上仍然是一种特殊的对象: 基本类型: String / Number / Boolean / Null / Undefined引用类型: Object / Array / Functio...

    longmon 评论0 收藏0
  • js基础深入浅出

    摘要:当多个事件触发的时候,会把异步事件依次的放入里等同步事件执行完之后,再去队列里一个个执行拾遗常用方法总结面试的信心来源于过硬的基础参考高级程序设计你所不知道的深入浅出知识点思维导图经典实例总结那些剪不断理还乱的关系 持续不断更新。。。 基本类型和引用类型 vue props | Primitive vs Reference Types 基本类型和字面值之间的区别 基本类型和字面值相等,...

    phodal 评论0 收藏0
  • 浅谈JS的浅拷贝和深拷贝(递归和树遍历)

    摘要:对象的特殊性因为对象的是通过指针仔细内存地址的,所以对象的拷贝不能像变量一般简单的赋值,对象的赋值只是将指针的地址赋值过去而已,修改属性值会对所有指向这个内存地址的对象的属性值都会被改变,见下面的例子变量赋值修改不会对造成影响对象赋值修改会 1.对象的特殊性 因为对象的是通过指针仔细内存地址的,所以对象的拷贝不能像变量一般简单的赋值,对象的赋值只是将指针的地址赋值过去而已,修改属性值会...

    cjie 评论0 收藏0
  • Object.prototype.toString.call(obj) 与 obj.toStrin

    摘要:判断一个变量的类型通常使用这样的方式也可以去判断一个变量的类型,但问题在于不严谨。另外,不直接使用方法的原因,还有一个就是对象的方法有可能会被改写。 判断一个变量的类型 typeof 通常使用 typeof a; 这样的方式也可以去判断一个变量的类型,但问题在于不严谨。比如: typeof null; // object typeof []; // object 但有时候,...

    bang590 评论0 收藏0
  • 利用Object.prototype.toString.call()来进行类型检验

    摘要:会将数组中的每个元素一个个传入给。参考链接与的区别二进行类型检验首先来看一个问题,用来检验类型有什么缺点呢答案是无法准确地检验对象类型。比较好的方式就是用来进行检验。判断是否是对象类型注意使用是不能得到类型的。 一、apply与call的区别 相同点:可以让一个对象调用另一个对象的方法不同点: apply最多只能传入两个参数,第一个为对象,第二个为数组 call能传入多个参数,第一个...

    JackJiang 评论0 收藏0

发表评论

0条评论

weakish

|高级讲师

TA的文章

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