JavaScript中的比较

作者: 转角遇见一直熊 | 来源:发表于2016-03-02 12:52 被阅读48次

JS中的比较

==与===

'1' == 1;
true == 1;
false == 0;
"\n \n \t" == 0;

==会进行类型转换,所以结果为true

'1' === 1;
true === 1;
false === 0;
"\n \n \t" === 0;

===会判断内容和类型是否匹配,所以结果为false。建议都使用===,因为==的转换并不好记忆,===可以帮助我们确保结果是我们所期望的。

instanceof

有的时候我们需要判断\n

  1. 一个object是否由某个构造函数创建的(是否是某类型)
  2. 一个object是否有某个原型(继承了某些方法)
    这个需求可以用instanceof来完成

语法

object instanceof constructor

参数

要检测的对象.

object

某个构造函数

constructor

描述

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

举个例子

看一下这段代码,定义了一个People基类,然后

  1. 定义Man类的原型是People.prototype。
  2. 定义Woman类继承People。
    这然对象man和woman都可以访问eat方法,woman还可以访问name属性
function People(name){
    this.name = name;
}
People.prototype={
    eat:function(){
        console.log(this.name+"要吃饭");
    }
};
function Man(tall, rich, handsome){
    this.tall = tall;
    this.rich = rich;
    this.handsome = handsome;
}
function Woman(white, rich, pretty){
    this.white=white;
    this.rich=rich;
    this.pretty=pretty;
}
//Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。
Man.prototype=Object.create(People.prototype); //只是可以访问eat方法
Woman.prototype= new People("Alice");   //继承
var man = new Man("不高","不富","不帅");
var woman = new Woman("不白","不富","不美");
man.eat();//-->undefined要吃饭
woman.eat();//-->Alice要吃饭

如果我们要检查一下对象是否有eat方法,那么就可以使用instanceof方法了,看一下下面代码

//-->true;因为Object.getPrototypeOf(man) === Man.prototype符合定义
console.log(man instanceof Man);
//-->true;People.prototype.isPrototypeOf(man)
console.log(man instanceof People);
//-->true;Object.prototype.isPrototypeOf(man)
console.log(man instanceof Object);

//-->true;因为Object.getPrototypeOf(woman) === Woman.prototype符合定义
console.log(woman instanceof Woman);
//-->true;People.prototype.isPrototypeOf(woman)
console.log(woman instanceof People);
//-->true;Object.prototype.isPrototypeOf(woman)
console.log(woman instanceof Object);

function PlaseEat(p){
    if(p instanceof People){
        p.eat();
    }else{
        console.log("没有继承People,所以不能屌用eat方法");
    }
}

可以注意到:

  1. man instanceof Man返回true,这是因为man的原型是Man.prototype,就是原型链的开始,符合instanceof的功能定义。
  2. man instanceof People返回true,是因为Man.prototypePeople的原型是同一个对象。Object.create() 方法创建一个拥有指定原型和若干个指定属性的对象。
  3. man instanceof Object返回true,是因为Object.prototype.isPrototypeOf(man)
  4. PlaseEat函数利用instanceof判断出对象是否有People中定义的接口,如果有,就可以调用eat方法了。

有一个地方比较奇怪,大家看看这个

var simpleStr = "This is a simple string"; 
simpleStr instanceof String;

居然返回false。JS的行为有时候还真奇怪。var newStr = new String("String created with constructor");这样定义就可以返回true。感觉JS的语言细节方面不是特别的讲究啊。

相关文章

  • JavaScript中的比较

    JS中的比较 ==与=== ==会进行类型转换,所以结果为true ===会判断内容和类型是否匹配,所以结果为fa...

  • JavaScript中双等号(==)的比较机制

    ECMAScript中提供两组操作符:相等和不相等——先转换再比较,全等和不全等——仅比较而不转换。 相等和不相等...

  • ES6 之 Promise

    Promise是JavaScript异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步...

  • 理解Promise in JavaScript

    Promise是JavaScript中的一个核心概念,初学JavaScript,对Promise的概念和用法都比较...

  • 【原创】this 指向问题总结

    JavaScript 中关于 this 指向的问题是一个令人比较头疼的问题,至于为什么要在 JavaScript ...

  • js中自执行( function(){…} )()和( func

    javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当...

  • 深入理解javascript中的立即执行函数(function(

    javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当...

  • Javascript比较的艺术

    我们该如何比较? 1.两个对象的比较 Javascript的比较中参杂了一些比较奇怪的特性,我们来看一些比较简单的...

  • 变量提升

    JavaScript变量提升 前言 JavaScript中的作用域是js中比较重要的一部分,也是大多数面试中必考的...

  • 简单认识 JS 原型与原型链

    原型是JavaScript中一个比较难理解的概念, 为深入理解JavaScript 中的原型、原型链,整理下思路。...

网友评论

    本文标题:JavaScript中的比较

    本文链接:https://www.haomeiwen.com/subject/ersnkttx.html