JavaScript 、TypeScript 中的 Boolean
boolean 是 JavaScript 中一种有趣的原始数据类型。在TypeScript中,非严格模式下("strictNullChecks": false),它总共允许4个值 true 、false、undefined、null 。
JavaScript 中的 Boolean
boolean 可以取值 true 或 false 。 其他类型的值可以是真值或假值,例如 undefined 或 null 。
let b = true
if(b) console.log('logged')
b = false
if(b) console.log('not logged')
b = undefined
if(b) console.log('not logged')
b = null
if(b) console.log('not logged')
要获取任何值对应的布尔值,可以使用Boolean函数
Boolean(false) // false
Boolean(true) // true
Boolean("false") // true ️
Boolean("Hey folks") // true
Boolean({}) // true
Boolean([]) // true
Boolean(123.4) // true
Boolean(Symbol()) // true
Boolean(function() {}) // true
Boolean(undefined) // false
Boolean(null) // false
Boolean(NaN) // false
Boolean(0) // false
Boolean("") // false
!! 运算也可以达到类似 Boolean() 的效果
const value = 'hello world';
Boolean(value); // true
!!value; // true
Airbnb 的编码风格 偏向使用 !! 进行 boolean 值转换
const age = 0;
// bad
const hasAge = new Boolean(age);
// good
const hasAge = Boolean(age);
// best
const hasAge = !!age;
很多时候 !! 和 Boolean() 可以相互替换。 !! 好处在于编码时快捷,但 Boolean() 是函数, 可以作为方法入参传递,很适合用来过滤集合中的空值。
const collection = [
{ name: 'A'},
undefined,
"false",
false,
23,
null
]
collection.filter(Boolean) //[{ name: 'A'}, "false", 23]
与 Number 转换函数一起使用,将所有值转换为对应的数字或NaN,这是一种快速获取实际值的非常酷的方法:
const x = ["1.23", 2137123, "wut", false, "lol", undefined, null]
.map(Number)
.filter(Boolean) // [1.23, 2137123]
Boolean 有两种使用方式:
Boolean(value); //作为转换函数,上面讲解的使用方式
new Boolean(value); //作为构造函数
Boolean 作为构造函数使用,具有与作为转换函数相同的转换规则。 但是使用 new Boolean(...),将创建一个包装对象,使值比较相等,而引用比较却不相等:
const value = Boolean("test") // true
const reference = new Boolean("test") // [Boolean: true]
value == reference // true
value === reference // false
可以通过 .valueOf() 获得实际 boolean 值:
value === reference.valueOf() // true
TypeScript 中的 Boolean
TypeScript 中的 boolean 是原始类型。 确保使用小写版本,并且不要引用 Boolean 的对象实例
const boolLiteral: boolean = false //
const boolObject: Boolean = false //
//生成的js代码
const boolLiteral = false;
const boolObject = false;
虽然 ts 可以正常编译,且生成的 js 也一样,但这是一种不好的做法,会给使用者一种误导,他们会去用包装类型进行赋值,而我们实际上很少需要引用包装类型。就像使用 new String(...) 不是一个很好的实践一样。
你可以在TypeScript中为 boolean 类型变量分配 true,false,undefined 和null (因为 undefined、null 是所有类型的子类型),而无需严格的null检查。
const boolTrue: boolean = true //
const boolFalse: boolean = false //
const boolUndefined: boolean = undefined //
const boolNull: boolean = null //
因此,布尔值是唯一可以通过联合类型完全表示的值
type MyBoolean = true | false | null | undefined // 等同 boolean
const mybool: MyBoolean = true
const yourbool: boolean = false
当我们启用 strictNullChecks 编译器标志时,值的集合将减少为true和false。
const boolTrue: boolean = true //
const boolFalse: boolean = false //
const boolUndefined: boolean = undefined //
const boolNull: boolean = null //
因此我们的集合总共减少为两个值。
type MyStrictBoolean = true | false
这时我们可以使用NonNullable helper类型摆脱null值:
type NonNullable<T> = T extends null | undefined
? never
: T;
type MyStrictBoolean = NonNullable<MyBoolean> // true | false
boolean 类型结合 ts 的条件类型,可以构建一些有趣的类型。比如你更新、创建 用户共用一个类型,创建时不需要userId, 但更新时userId必传。
type PersonDto<Person, IsUpdateOrCreate> =
IsUpdateOrCreate extends true
? Person & { userId: string }
: Person & { userId?: string }
依赖于 IsUpdateOrCreate 的值,userId 被设置必填或选填。
在使用时,它可能声明一个这样的函数
declare function userUpdateOrCreate<P, A extends boolean = false>
(personDto: PersonDto<P, A>, isUpdateOrCreate?: A): void
注意,我甚至为a设置了一个默认值,以确保为 PersonDto 提供A的类型信息,这取决于是否设置 isUpdateOrCreate。
实际使用:
userUpdateOrCreate({})
userUpdateOrCreate({ name: '默认值' })
userUpdateOrCreate({ name: '张三' }, false)
userUpdateOrCreate({ name: '李四' }, true) // userId 缺失
userUpdateOrCreate({ name: '王二麻子', userId: 'asdf' }, true)
JavaScript 、TypeScript 中的 Boolean的更多相关文章
- JavaScript 和 TypeScript 中的 class
对于一个前端开发者来说,很少用到 class ,因为在 JavaScript 中更多的是 函数式 编程,抬手就是一个 function,几乎不见 class 或 new 的踪影.所以 设计模式 也是大 ...
- 【已解决】在 Visual Studio 中设置 JavaScript/TypeScript 的断点 脚本出现自动中断错误
运行ASP.NET Core 程序出现错误如下: 已启用 Visual Studio 中的 Chrome 脚本调试 在 Visual Studio 中设置 JavaScript/TypeScript ...
- 在TypeScript中扩展JavaScript基础对象的功能
最近工作中用到,记录一下:假设我们需要一个功能,把一个数字比如10000输出为下面的字符串格式“10,000”,一般是写一个方法,那么我希望更方便一点,直接向Number类型添加一个格式化方法,比如叫 ...
- TypeScript中的private、protected
首先我们要清楚 private . protected 现阶段只是javascript中的保留字(Reserved words),而非关键字(Keywords ).因此TypeScript中的纯类型声 ...
- 5种在TypeScript中使用的类型保护
摘要:在本文中,回顾了TypeScript中几个最有用的类型保护,并通过几个例子来了解它们的实际应用. 本文分享自华为云社区<如何在TypeScript中使用类型保护>,作者:Ocean2 ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- 第一百节,JavaScript表达式中的运算符
JavaScript表达式中的运算符 学习要点: 1.什么是表达式 2.一元运算符 3.算术运算符 4.关系运算符 5.逻辑运算符 6.*位运算符 7.赋值运算符 8.其他运算符 9.运算符优先级 E ...
- Javascript Jquery 中的数组定义与操作_子木玲_新浪博客
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- TypeScript 中的方法重载
方法重载(overload)在传统的静态类型语言中是很常见的.JavaScript 作为动态语言, 是没有重载这一说的.一是它的参数没有类型的区分,二是对参数个数也没有检查.虽然语言层面无法自动进行重 ...
随机推荐
- Logstash学习之路(三)Logstash处理时区、类型转换、删除字段的案例配置
#输入 input { file { path => ["文件路径"] #自定义类型 type => "自定义" start_position =& ...
- Modbus仿真器 Modbus Poll 和Modbus Slave详细图文教程
Modbus Poll 是Witte Software公司开发的的Modbus主机仿真器,用于测试和调试Modbus从设备.软件支持ModbusRTU.ASCII.TCP/IP协议.支持多设备监控,可 ...
- Study_way
一.Study 学习通Java基础视频.语法 开源中国 (Git)版本控制 读懂程序.源代码 相关资源 百度网盘 程序:方法(数学) 二.参数传递 基本数据的传参:虚参改变影响实参 引用数据的传参:数 ...
- 天梯赛练习 L3-008 喊山 (30分) bfs搜索
题目分析: 本题是一题比较简单的bfs搜索题,首先由于数据给的比较多不能直接开二维数组存放,而是用了vector的动态的二维数组的形式存放,对于每个出发点,我们bfs向四周搜索,标记搜索过的点,遇到搜 ...
- python模块详解 | pyquery
简介 pyquery是一个强大的 HTML 解析库,利用它,我们可以直接解析 DOM 节点的结构,并通过 DOM 节点的一些属性快速进行内容提取. 官方文档:http://pyquery.readth ...
- Linux学习笔记 | 将默认镜像源修改为国内镜像源
前言: 在使用Linux操作系统的时候,难免会下载各种安装包,而Linux使用的下载源服务器属于国外,下载速度相对国内会慢很多,像日常使用的阿里云和腾讯云等国内服务器厂商,镜像源都默认为自己相关的镜像 ...
- IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerp
[root@k8s-master ~]# scp /etc/sysctl.d/k8s.conf root@192.168.30.23:/etc/sysctl.d/k8s.conf@@@@@@@@@@@ ...
- SAP 中session和外部断点设置的区别
1 Session Breakpoints:只在当前user session的所有main session中有效 2 External Breakpoints 在abap editor或事务SICF中 ...
- VMware下安装Ubantu 18.04
一.VIM安装及配置 1.安装VIM sudo apt-get install vim 二.拼音输入法以及搜狗拼音输入法安装 1.安装Fcitx输入框架 sudo apt-get install fc ...
- uni-app开发经验分享五: 解决三端页面兼容问题的方法
在做uni-app开发的过程中,我们最头疼可能不是开发的过程中的逻辑,而是最后要做的三端兼容测试和修改,在我开发的项目中,这一步都是最头疼和令人头秃的过程,这里总结一些个人开发遇到的问题,希望对大家有 ...