专栏首页bamboo前端学习记录数据类型转换、==和===的判断

数据类型转换、==和===的判断

不同数据类型做比较的时候,都需要进行数据类型的转换!本文介绍常见数据类型转换的方法,相等和严格相等的判断规律

一、其他类型转换成布尔类型

1、使用场景:

对于括号里的表达式,会被强制转换为布尔类型

if ("") {
    console.log('empty')
}

2、转换规则

类型

结果

Undefined

false

Null

false

Number

+0, −0, 或者 NaN 为 false, 其他为 true

String

空字符串为 false,其他都为 true

Object

true

3、举个栗子

if ("hello") {
    console.log("hello")
} //hello

// 题目2:如下代码输出什么?
if ("") {
    console.log('empty')
} //undefined

// 题目3:如下代码输出什么?
if (" ") {
    console.log('blank')
} //blank
// 题目4:如下代码输出什么?
if (+0.00) {
    console.log('blank')
} //undefined

4、小建议

写代码以后不要写成下面这样,不要再if内放变量。变量转换成布尔类型,会有很多状态。可以写成判断类型的语句如(a==="")。 if(a){ console.log('blank') }

二、其他元素的转换成数字(toNumber)

1、使用场景:

判断是否相等==

2、转换规则

类型

结果

Undefined

NaN

Null

0

Boolean

ture -> 1, false -> 0

String

“abc” -> NaN, “123” -> 123 , ""->0 , " "->0 空字符串和含有空白字符串的字符都为0

Object

先调用 .valueOf 方法获取结果。如果没定义,再尝试调用 .toString方法获取结果(数据运算符那篇文章有详细介绍)

三、== 的判断

经验就是把双方转换成数字

1、转换规则

类型

结果

结果

Undefined

Null

true 特例记住 undefined == null

Number

any

x == toNumber(y)数字和任何数据相比,把其他数据转换成数字在比较

Boolean

(any)

toNumber(x) == y 只要布尔类型先转换成数字,再比较

Object

String or Number

toPrimitive(x) == y 对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。

otherwise

otherwise

false

2、举个例子

"" == 0  // true           false
" " == 0  //true 
"" == true  //false
" " == true  //false
!" " == true  // false  ,(!" "就是布尔类型的false)
"hello" == true  //false   "hello"转换成数字为nan,true转换成数字1
"0" == false  //true
"00" == false  //true
"0.00" == false  //true
undefined == null  //true
true== {}  //false  {}调用tostring为[object Object]
[] == true  //false  对象的toString方法默认返回[object Object]

var obj = { 
  a: 0, 
  valueOf: function(){return 1} 
} 
obj == "[object Object]"  // false 自定义valueof之后,对象转换数字返回的是1

四、严格相等

1、不同类型的值

如果两个值的类型不同,直接返回false

2、复合类型值

两个复合类型(对象、数组、函数)数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。如果两个变量引用同一个对象,则它们相等。

var v1 = {};
var v2 = v1;
v1 === v2 // true

反例

{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
//比较两个空对象、两个空数组、两个空函数,结果都是不相等。
//原因是对于复合类型的值,严格相等运算比较的是,它们是否引用同一个内存地址,
//而运算符两边的空对象、空数组、空函数的值,都存放在不同的内存地址,结果当然是false

3、特例

  • 例子1:NaN与任何值都不相等(包括自身)
NaN == NaN  // false
NaN === NaN  // false
  • 例子2:正0等于负0
+0 === -0 // true
  • 例子3:undefined和null与自身严格相等
undefined === undefined // true
null === null // true
var v1;
var v2;
v1 === v2 // true
//由于变量声明后默认值是undefined,因此两个只声明未赋值的变量是相等的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 跨域

    浏览器出于安全方面的考虑,只允许与本域下的接口交互(当前页面得url必须和接口得url是同源的)。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。

    bamboo
  • jQuery选择器 和用jQuery 实现 Tab 切换效果(1)

    通过类数组下标的获取方式或者get方法获取指定index的DOM对象,也就是我们说的jQuery对象转DOM对象

    bamboo
  • jquery的事件&动画

    在1.7之前的版本中jQuery处理事件有多个方法, (google 搜索: jquery live bind degelate)作用各不相同,后来统一的使用o...

    bamboo
  • K8S namespace calico network policy

    This guide will deploy pods in a Kubernetes namespace. Let’s create the Namespac...

    heidsoft
  • js实现千位分隔符 原

    \b      :用来匹配单词的边界,大小写字母、数字、下划线可以组成单词的字符,这些字符和其它字符相邻则为单词边界 如abcd@ , d与@之间就可以用\b...

    tianyawhl
  • 漏洞复现 | WordPress _4.5 SSRF

    TeamsSix
  • 设计模式之装饰者模式(Decorator Pattern)问题提出引出装饰者模式定义装饰者模式实现装饰者模式总结与分析

    装饰者模式可以做到在不修改任何底层代码的情况下,给对象增加的新的方法。 首先,我们通过对一个现实问题的模拟分析,了解什么是装饰者模式以及装饰者模式的作用。

    desperate633
  • C++协程库与嵌入V8的兼容性问题

    C++ 中使用了部门自研的有一定历史的 RPC 框架,所绑定的协程库是 GNU pth。

    h46incon
  • LeetCode 1023. 驼峰式匹配(暴力匹配)

    如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字...

    Michael阿明
  • 装饰者模式.

    TOPIC:我们要定义一些饮品,并能够向饮品中添加一些调料,比如摩卡、糖之类的,然后能够根据添加的调料种类动态的修改饮品的价格。

    JMCui

扫码关注云+社区

领取腾讯云代金券