同样在JavaScript中

ES6有三个内置决定一些设施x和一些y是“相同的”。 它们是:平等或“双等于”(==),严格平等或平等“三重”(===),Object.is。 (注意,Object.is在ES6补充道。 等于两倍和三倍等于存在ES6之前,和他们的行为没有改变。)

概述

演示,下面是三个同样使用的比较:

x = = y
x = = = y
Object。是(x, y)

短暂、双等于将执行类型转换当比较两件事;三等于将做同样的比较没有类型转换(通过简单总是返回false如果不同类型);Object.is行为一样等于三倍,但与特殊处理NaN-0+0据说,最后两个不相同的,Object.is(NaN, NaN)true。 (比较NaNNaNordinarily-i.e。 ,使用等于两倍或三倍equals-evaluatesfalse,因为IEEE 754这么说)。

注意区分这些都有与原语的处理;他们比较参数是否在概念上类似的结构。 对于任何销售对象xy具有相同的结构,但不同的对象本身,所有上述形式将评估false

例如:

让 x = { value: 17 };
让 y = { value: 17 };
console。日志(Object。是(x, y));/ /错误;console。日志(x = = = y);        / /错误console。日志(x = = y);         / /错误

抽象的平等,严格的平等,和相同的值

由ES5的比较==描述的是算法部分11.9.3、抽象的平等。 的===比较是11.9.6、严格平等算法。 (去看看这些。 他们短暂的和可读的。 提示:先读严格平等算法)。 ES5还描述了,9.12节,SameValue算法JS引擎内部使用。 它很大程度上是一样的严格平等算法,除了11.9.6.4和9.12.4不同处理Number年代。ES6仅仅提出公开该算法通过Object.is

与平等的两倍和三倍,我们可以看到,除了在11.9.6.1前期做类型检查,严格平等算法抽象平等的一个子集算法,因为11.9.6.2-7对应11.9.3.1.a-f。

模型为理解平等比较?

ES6之前,你可能会说等于两倍和三倍等于,一个是“增强”的其他版本。 比如,有人可能会说,双等于是三重的扩展版本等于,因为前者后者所做的每一件事情,但在其操作数类型转换。 例如,6 == "6"。 (或者,有人可能会说,双等于基线,和三倍等于一个增强版本,因为它需要两个操作数是相同的类型,因此它添加了一个额外的约束。 哪一个是更好的模型来理解取决于你如何看待事情。)

然而,这种思维方式对内置的相同运营商不是一个模型,可以延伸到允许ES6的地方Object.is在这个“谱”。Object.is不是简单的“宽松”要比双等于或比三等于“严格”,也不适合介于两者之间(即。 ,既严格等于两倍多,但比三等于宽松)。 我们可以看到下面从千篇一律的比较表,这是由于Object.is处理NaN。 注意,如果Object.is(NaN, NaN)评估,false,我们可能说它适合宽松/严格光谱作为一个甚至更严格的三重平等形式,区分-0+0。 的NaN然而,处理意味着这是不真实的。 不幸的是,Object.is仅仅是想到的特定的特征,而不是其松动或严格相等运算符。

千篇一律的比较
x y == === Object.is
undefined undefined true true true
null null true true true
true true true true true
false false true true true
"foo" "foo" true true true
{ foo: "bar" } x true true true
0 0 true true true
+0 -0 true true false
0 false true false false
"" false true false false
"" 0 true false false
"0" 0 true false false
"17" 17 true false false
[1,2] "1,2" true false false
new String("foo") "foo" true false false
null undefined true false false
null false false false false
undefined false false false false
{ foo: "bar" } { foo: "bar" } false false false
new String("foo") new String("foo") false false false
0 null false false false
0 NaN false false false
"foo" NaN false false false
NaN NaN false false true

什么时候使用Object.is与三等于

除了对待的方式NaN一般来说,只有时间Object.is对零的特殊行为可能是感兴趣的在追求某些元编程方案,特别是关于属性描述符当你的工作是最理想的镜子的一些特点Object.defineProperty。 如果你的用例不需要这个,建议避免Object.is和使用===来代替。 即使你的需求涉及到比较两个NaN值评估true代价,通常更容易处理NaN检查(使用isNaN方法可以从以前版本的ECMAScript)比如何计算可能会影响周围的标志任何零你遇到的比较。

这里有一个不彻底的内置方法列表和运营商,可能导致之间的区别-0+0体现在你的代码:

- (unary negation)

很明显,否定0生产-0。 但表达的抽象可以引起-0当你没有意识到它的蠕变。 例如,考虑:

让 stoppingForce = obj。mass * - - - - - -obj。velocity

如果obj.velocity0(或计算0),一个-0介绍了在那个地方,传播到吗stoppingForce

Math.atan2
Math.ceil
Math.pow
Math.round
它是可能的-0是引入一个表达式的返回值这些方法在某些情况下,即使没有-0存在的参数。 如。 ,使用Math.pow提高-无限任何负面的力量,奇怪的指数评估-0。 指个人的文档的方法。
Math.floor
Math.max
Math.min
Math.sin
Math.sqrt
Math.tan
可以得到一个-0返回值的这些方法在某些情况下-0存在的参数。 例如,Math.min(-0, +0)评定,-0。 指个人的文档的方法。
~
< <
> >
这些运营商内部使用ToInt32算法。 由于只有一个为0表示内部32位整数类型,-0不会生存往返后逆操作。 如。 ,两个Object.is(~~(-0), -0)Object.is(-0 << 2 >> 2, -0)评估,false

依靠Object.is当零的signedness不考虑危险。 当然,当目的是区分-0+0,它到底是什么。

时间: 2024-12-31 05:39:23

同样在JavaScript中的相关文章

实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制

实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. 1 /** 对象克隆 2 * 支持基本数据类型及对象 3 * 递归方法 */ 4 function clone(obj) { 5 var o; 6 switch (typeof obj) { 7 case "undefined": 8 break; 9 case "string": o = obj + &q

javascript中的原始值和复杂值

前面的话 javascript的数据类型可以分为两种:原始类型(基本类型或者简单类型)和引用类型. 原始类型:Undefined,Null,Boolean,Number,String五种: 引用类型:Object,Array,Function: 与此相对应的,它们的值分别被称为原始值和复杂值. 特性 原始值 原始值是表示javascript中可用的数据或信息的最底层的形式或者最简单的形式.原始类型的值被称为原始值,因为它们的值是不可被细化的.也就是说,数字是数字,字符串是字符串,布尔值是true

【JS】JavaScript中的执行环境与作用域

JavaScript中的执行环境定义了变量或函数有权访问的数据(每个函数都有自己的执行环境),全局执行环境是最外围的执行环境,在浏览器中,全局执行环境就是window对象,所以所有的全局变量和函数都是作为window对象的属性和方法创建的.当某一个执行环境中所有代码执行完成后,该环境就被销毁,保存在其中的变量和函数也将被销毁,全局执行环境在关闭网页或浏览器时才被销毁. 当代码在一个环境中执行时,会创建变量对象的一个作用域链(保证对执行环境有权访问的变量和函数的有序访问),如果环境是函数,将其活动

JavaScript中的构造函数

function Accom(){};    //创建一个构造函数 //创建两个对象 var house=new Accom(); var apartment=new Accom(); 通过构造函数创建的对象有一个属性constructor,这个属性指向创建该对象时所用的Javascript构造函数. house.constructor===Accom;  或者   house instanceof Accom;     //true JavaScript中的每个构造函数都有一个prototyp

【转】十个JavaScript中易犯的小错误,你中了几枪?

在今天,JavaScript已经成为了网页编辑的核心.尤其是过去的几年,互联网见证了在SPA开发.图形处理.交互等方面大量JS库的出现. 如果初次打交道,很多人会觉得js很简单.确实,对于很多有经验的工程师,或者甚至是初学者而言,实现基本的js功能几乎毫无障碍.但是JS的真实功能却比很多人想象的要更加多样.复杂.JavaScript的许多细节规定会让你的网页出现很多意想不到的bug,搞懂这些bug,对于成为一位有经验的JS开发者很重要. 常见错误一:对于this关键词的不正确引用 我曾经听一位喜

JavaScript中Function的拓展

Function 是什么东西,就是JavaScript中的顶级类,系统级别的类.我们平时写的函数方法例如下. function Animal() { } Animal就是Function的实例,但是在我们的逻辑中 Animal是类,是自定义类. Function是类,Animal是类也是实例,Animal是Function的实例,Animal是自定义类.这点大家一定要搞清楚. 我们在顶级类上定义一个method的方法,用于进行键值对的方式进行方法链式的设定, Function.prototype

浅谈JavaScript中继承的实现

  谈到js中的面向对象编程,都有一个共同点,选择原型属性还是构造函数,两者各有利弊,而就片面的从js的对象创建以及继承的实现两个方面来说,官方所推荐的是两个相结合,各尽其责,各取其长,在前面的例子中,我已就在JavaScript中对象创建的方法做了一些总结,下面就其继承来道说一二:   1:原型链继承: 每一个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象内部的指针(默认的原型,所有默认类型都继承了Object,而这个继承也是用过原型链实现) fu

理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承

本文参考了http://www.blogjava.net/heavensay/archive/2013/10/20/405440.html这篇文章,对其内容作了个简单总结,形成了几条简单的结论,让读者更容易记住prototype.__proto__.Object.Function之间的关系. 结论1:Object.prototype只是一个普通对象,它是js原型链的最顶端. (typeof Object.prototype) === object;//true Object.prototype.

javascript中的立即执行函数(function(){…})()

javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包住业务代码,使用jquery时比较常见. ( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法,最初我以为是一个括号包裹匿名函数,再在后面加个括号调用函数,最后达到函数定义后立即执行的目的,后来发现加括号的原因并非如此.要

javascript中的栈、队列。

                       javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置数组尾,并返回修改后的数组长度. pop()  移除数组尾的最后一项,并返回移除项的值. 事例: var colors = new Array();var count = colors.push("red","green"); count = colors.push(&