js中关于假值和空数组的总结
先上x==y运算符的算法细节:
- 如果
x不是正常值(比如抛出一个错误),中断执行。- 如果
y不是正常值,中断执行。- 如果
Type(x)与Type(y)相同,执行严格相等运算x === y。- 如果
x是null,y是undefined,返回true。- 如果
x是undefined,y是null,返回true。- 如果
Type(x)是数值,Type(y)是字符串,返回x == ToNumber(y)的结果。- 如果
Type(x)是字符串,Type(y)是数值,返回ToNumber(x) == y的结果。- 如果
Type(x)是布尔值,返回ToNumber(x) == y的结果。- 如果
Type(y)是布尔值,返回x == ToNumber(y)的结果。- 如果
Type(x)是字符串或数值或Symbol值,Type(y)是对象,返回x == ToPrimitive(y)的结果。- 如果
Type(x)是对象,Type(y)是字符串或数值或Symbol值,返回ToPrimitive(x) == y的结果。- 返回
false。
1、“假值”总共只有6个:
false,undefined,null,0,""(空字符串),NaN
除此之外的所有值,都是“真值”,即在逻辑判断中可以当true来使用
用代码表示:
if(false&&undefined&&null&&0&&""&&NaN){
console.log('其中有真值');
}else{
console.log('全部都是假值');
}
//全部都是假值
2、对于空数组和空对象的疑惑
疑惑来源:用空数组和空对象进行if语句判断为true,但是空数组和true进行==运算时,返回的是false
用代码表示:
if([]){
console.log('空数组转化为布尔值为true');//空数组转化为布尔值为true
}
if({}){
console.log('空对象转化为布尔值为true');//空对象转化为布尔值为true
}
if([]==true){
console.log('空数组等于true');
}else{
console.log('空数组等于false');//空数组等于false
}
为什么空数组转化为布尔值是true,而下面和true做对比时又不等于true呢?
原因分析:if ([ ]) {} 里发生自动类型转换,[ ] => Boolean,从object到布尔型,结果是true。事实上,所有的object转型到Boolean,都是true,[ ]和{ }都是对象。
[ ] == true 里不发生自动类型转换,这条语句只比较左右的“值”是否相等,所以要先化为number类型,true转化为数字1就不用说了,主要分析一下[ ]怎么转化为0的,这里涉及到ToPrimitive方法的操作,不懂的可以先看我的另一篇博客,https://i.cnblogs.com/EditPosts.aspx?postid=10859000,再返回看。[ ]会先调用valueOf方法,返回数组本身不是原始值,所以继续调用toString方法,返回' ',从而Number(' ')=0,而0!=1,所以返回false。
总结:Boolean([ ]) => true;//直接作条件
Boolean(Number([ ])) => false;//当与布尔值做比较时
Number({ })//NaN,不等于任何数包括自己
最后送大家一张经典的图:

js中关于假值和空数组的总结的更多相关文章
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- js中如何访问对象和数组
js中如何访问对象和数组 一.总结 一句话总结:js访问对象点和中括号,访问数组的话就是中括号 对象 . [] 数组 [] 1.js访问对象的两种方式? . [] 可以使用下面两种方式访问对象的属性和 ...
- Js中常用的字符串,数组,函数扩展
由于最近辞职在家,自己的时间相对多一点.所以就根据prototytpeJS的API,结合自己正在看的司徒大神的<javascript框架设计>,整理了下Js中常用一些字符串,数组,函数扩展 ...
- php中向前台js中传送一个二维数组
在php中向前台js中传送一个二维数组,并在前台js接收获取其中值的全过程方法: (1),方法说明:现在后台将数组发送到前台 echo json_encode($result); 然后再在js页面中的 ...
- JS中的唯一容器:数组
JS中的唯一容器:数组 一.什么类型的数据都可以存储 二. 定义的方式有两种 1 . var arra=[];var arra=[“a”,“b”,"c"]; 2.v ...
- JS中split使用方法和数组中元素的删除
JS中split使用方法和数组中元素的删除 JS中split使用方法 <script language="javascript"> function spli(){ d ...
- Js中的假值_ES5中定义的ToBoolean方法强制类型转换后值为false
你不知道的Javascript(中)--ToBoolean javascript中的值可以分为以下两类: 1.可以被强制类型转换为false的值 2.其他(被强制类型转换为true的值) 假值---以 ...
- js中split()方法得到的数组长度
js 中split(",")方法通过 ”,“ 分割字符串, 如果字符串中没有 “,” , 返回的是字符串本身 var str = “abc”://分隔符个数为0 var newSt ...
- js中的节点遍历+类数组对象
firstChild 第一个子元素 lastChild 最后一个子元素 childNodes[n] = childNodes.item(n) 第n+1个子元素 parentNode ...
随机推荐
- 使用vue-cli脚手架安装和webpack-simple模板项目生成
Vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目. GitHub地址是:https://github.com/vuejs/vue-cli 一. ...
- SQL Server Reporting Service(SSRS) 第五篇 自定义数据处理扩展DPE(Data Processing Extension)
最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络 ...
- python_案例综合:教材记录管理
class Book(): def __init__(self,ISBN,Ftile,Author,Publisher): self.ISBN = ISBN self.Ftile = Ftile se ...
- 2019.03.22 读书笔记 var object dynamic
var:语法糖,在编译时推断出类型,根据反编译可以看出.实际用处是增加代码的健壮性,比如 linq ,匿名对象等. object:很多人容易和var混淆,其实概念上完全不同,没什么可比性. dynam ...
- 2019.03.21 读书笔记 基元类型的Parse与TryParse 性能与建议
Parse转换失败时会抛出异常,耗损性能,如果转换成功,则与TryParse无差异.查看源码,tryparse的代码更多一些,在失败时,反而性能更优,主要是抛出异常耗损了性能.所以在不确定是用Tryp ...
- Java基础01-JVM内存分析
JVM java虚拟机 java编译后的class文件就是在java虚拟机上运行的 1.栈区(stacksegment)存放函数的参数值,局部变量的值等,在超过这个变量的作用域时就会被系统自动释放掉存 ...
- eclipse启动的时候报错An internal error occurred during: "Initializing Java Tooling"
eclipse ->windows ->Perspactive -> Reset perspactive 重置视图可以解决
- 搭建mysql集群,使用Percona XtraDB Cluster搭建
Percona XtraDB Cluster提供的特性有:1.同步复制,事务要么在所有节点提交或不提交.2.多主复制,可以在任意节点进行写操作.3.在从服务器上并行应用事件,真正意义上的并行复制.4. ...
- Spring Boot实战(3) Spring高级话题
1. Spring Aware Spring的依赖注入的最大亮点就是你所有的Bean对Spring容器的存在是没有意识的.即你可以将你的容器替换成别的容器. 实际项目中,不可避免地会用到Spring容 ...
- [转]Linq语法二
本文将讲述LINQ的基础查询(此文所有例子都使用LINQ to Object) 在此之前,我们先创建一个用于示例的数据源: Student类:表示学生,包括学号.姓名及班级 Courses类:表示学生 ...