JavaScript里值比较的方法
JavaScript里值比较的方法
参考资料
Object.is
和 == 与 === 不同
- == 运算符会对它两边的操作数做隐式的类型转换
- === 也不会对操作数进行类型转换,但是它会把
-0
和+0
这两个数值视为相同的,还会把两个 NAN 看成是不相等的。
+0 === -0 // true
-0 === 0 // true
+0 === 0 // true
Object.is(-0, +0) // false
Object.is(+0, 0) // true
Object.is(-0, 0) // false
NaN === NaN // false
Object.is(NaN, NaN) // true
这里,number 类型的数据有几种特殊的数值:
- Number.NEGATIVE_INFINITY === -Infinity // true
- Number.POSITIVE_INFINITY === Infinity // true
- 21/0 === Infinity // true
- -21/0 == -Infinity // true
- 0/0 // NaN
Object.is 比 === 更严格。
隐式的类型转换
原始类型(Undefined、Null、Boolean、Number和String) + 对象类型(Object)
null 和 undefined
有一个传闻:
假如你打算把一个变量赋予对象类型的值,但是现在还没有赋值,那么你可以用null表示此时的状态(证据之一就是typeof null 的结果是'object');相反,假如你打算把一个变量赋予原始类型的值,但是现在还没有赋值,那么你可以用undefined表示此时的状态。
typeof null // object
typeof undefined // undefined
这里有一个图大概能表述清楚,几种类型相互的转换关系
几个概念
- ToPrimitive:将操作数转为原始类型的值。
- ToNumber:将操作数转
- 类型的值都有一种向数字类型转化的趋势,底层就是依靠数值的比较
ToPrimitive
JavaScript引擎内部的抽象操作ToPrimitive()
有着这样的签名:
ToPrimitive(input, PreferredType?)
可选参数PreferredType可以是Number
或者String,
它只代表了一个转换的偏好,转换结果不一定必须是这个参数所指的类型,但转换结果一定是一个原始值.如果PreferredType被标志为Number,则会进行下面的操作来转换输入的值 (§9.1):
- 如果输入的值已经是个原始值,则直接返回它.
- 否则,如果输入的值是一个对象.则调用该对象的
valueOf()方法
.如果valueOf()方法
的返回值是一个原始值,则返回这个原始值. - 否则,调用这个对象的
toString()方法
.如果toString()
方法的返回值是一个原始值,则返回这个原始值. - 否则,抛出
TypeError异常
.
如果PreferredType被标志为``String
,则转换操作的第二步和第三步的顺序会调换.如果没有PreferredType这个参数,则PreferredType的值会按照这样的规则来自动设置:``Date类型的对象会被设置为String,其它类型的值会被设置为``Number
.
ToNumber
下面的表格解释了ToNumber()是如何将原始值转换成数字的
(§9.3).
参数 | 结果 |
---|---|
undefined |
NaN |
null |
+0 |
布尔值 | true被转换为``1 ,false转换为``+0 |
数字 | 无需转换 |
字符串 | 由字符串解析为数字.例如,"324"被转换为``324 |
如果输入的值是一个对象,则会首先会调用ToPrimitive(obj, Number)将该对象转换为原始值,然后在调用T
oNumber()将这个原始值转换为数字.
下面的表格解释了ToNumber()是如何将原始值转换成数字的
参数 | 结果 |
---|---|
undefined |
NaN |
null |
+0 |
布尔值 | true被转换为``1 ,false转换为``+0 |
数字 | 无需转换 |
字符串 | 由字符串解析为数字.例如,"324"被转换为``324 |
如果输入的值是一个对象,则会首先会调用ToPrimitive(obj, Number)将该对象转换为原始值,然后在调用T
oNumber()将这个原始值转换为数字.
toString
通过toString()将值转换为字符串
下面的表格解释了ToString()是如何将原始值转换成字符串的
(§9.8).
参数 | 结果 |
---|---|
undefined |
"undefined" |
null |
"null" |
布尔值 | "true" 或者 "false" |
数字 | 数字作为字符串,比如. "1.765" |
字符串 | 无需转换 |
如果输入的值是一个对象,则会首先会调用ToPrimitive(obj, String)将该对象转换为原始值,然后再调用ToString(),将这个原始值转换为字符串.
valueOf
每个JavaScript固有对象的 valueOf 方法定义不同。
对象 | 返回值 |
---|---|
Array | 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。 |
Boolean | Boolean 值。 |
Date | 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。 |
Function | 函数本身。 |
Number | 数字值。 |
Object | 对象本身。这是默认情况。 |
String | 字符串值。 |
Math 和 Error 对象没有 valueOf 方法。
例子
{} == null?
ToPrimitive({}) => {}.valueOf() => {}.toString() => [object Object] => Number( [object Object] ) => NaN
null => Number(null) => 0
{} == null // false
{} + {} ?
ToPrimitive({}) => {}.valueOf() => {}.toString() => [object Object]
{} + {} // [object Object][object Object]
[''] == '' ?
ToPrimitive(['']) => [''].valueOf() => [''].toString() => '' => Number( '' ) => 0
'' => Number('') => 0
[''] == '' // true
JavaScript里值比较的方法的更多相关文章
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
- Javascript中双等号(==)隐性转换机制 JS里charCodeAt()和fromCharCode()方法拓展应用:加密与解密
Javascript中双等号(==)隐性转换机制 在Javascript中判断相等关系有双等号(==)和三等号(===)两种.其中双等号(==)是值相等,而三等号(===)是严格相等(值及类型是否 ...
- JavaScript里的循环方法总结
JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...
- 创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S
题目补充: 创建一个接口Shape,其中有抽象方法area,类Circle .Rectangle实现area方法计算其面积并返回. 又有Star实现Shape的area方法,其返回值是0,Star类另 ...
- JavaScript里的循环方法之forEach,for-in,for-of
JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...
- javascript里的sleep()方法
很多编程语言里都有sleep(),delay()等方法,它能让我们的程序不那么着急的去执行下一步操作,而是延迟.等待一段时间.软件开发中经常会遇到需要这样的函数,比如等待几分钟去检查某一事件是否发生. ...
- JavaScript里的循环方法:forEach,for-in,for-of
JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...
- JS子父窗口互相操作取值赋值的方法介绍
$("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...
- JavaScript之call()和apply()方法详解
简介:apply()和call()都是属于Function.prototype的一个方法属性,它是JavaScript引擎内在实现的方法,因为属于Function.prototype,所以每个Func ...
随机推荐
- HDU1323_Perfection【水题】
Perfection Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- link标签的rel属性
<link>标签定义了当前文档与 Web 集合中其他文档的关系.link 元素是一个空元素,它仅包含属性.此元素只能存在于 head 部分,不过它可出现任何次数.在 HTML 中,< ...
- hdu 2602 - Bone Collector(01背包)解题报告
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Objective-C 执行AppleScript脚本
在Objective-C里事实上也能够执行AppleScript 第一种方式是Source 将脚本写到变量字符串里 NSAppleEventDescriptor *eventDescriptor = ...
- android 怎样加速./mk snod打包
mm命令高速编译一个模块之后,一般用adb push到手机看效果,假设环境不同意用adb push或模块不常常改.希望直接放到image里,则能够用./mk snod,这个命令只将system文件夹打 ...
- Fragment小结
Fragment是Android3.0之后增加的新特性,通常人们叫它碎片.可是,我认为把它理解成一个View模块比較好,尽管它不是继承自View.假设阅读过源代码就知道它是内置View对象从而实现Vi ...
- 度度熊有一张网格纸,但是纸上有一些点过的点,每个点都在网格点上,若把网格看成一个坐标轴平行于网格线的坐标系的话,每个点可以用一对整数x,y来表示。度度熊必须沿着网格线画一个正方形,使所有点在正方形的内部或者边界。然后把这个正方形剪下来。问剪掉正方形的最小面积是多少。
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- 黑名单机制来临,你的应用还好么?Android P DP2最新兼容性报告出炉
5月9日,谷歌面向全球开发者发布了 Android P Beta,即 Android P DP2. 华为终端开放实验室第一时间对TOP1000主流应用兼容性进行测试,那么在版本兼容性方面各主流应用有何 ...
- JS加水印遮罩
<%@ page language="java" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC & ...
- 13 nginx gzip压缩提升网站速度
一:nginx gzip压缩提升网站速度 我们观察news.163.com的头信息 请求: Accept-Encoding:gzip,deflate,sdch 响应: Content-Encoding ...