思考

作为一个编程人员,你可能从来没仔细思考过,为什么这么多高级语言会有类型这东西。

实际上,类型有点类似生活中的类别,我们日常生活,早已经把这个概念理解到了,切肉和切水果会用不同的刀。

语言级别的类型给我们带来了什么

类似分类,我们会用合适的类别去做它擅长的事,编程语言的类型给我们带来的就是它们自身的特性,比如我们在条件判断一个开关状态的时候,通常用布尔值更方便,另外一方面,编程语言提供了超越生活的操作,类型转换,学习类型,有利于我们从容应对显式转换,更加要提及的是,对于隐式转换,我们能更加快速定位问题。

我们js的隐式转换,一边带着恐惧,一边还在使用着它,因为一昧地强制转换,带来的代码冗余是很可怕的

看一个例子

//一个常见的例子
a + "" //隐式转换为字符串
String(a) + " " //显式转换字符串 //另外一个常见例子
var a = 42;
var b = null;
var c = "foo";
a && b
if (a && (b || c)) { //在js里 && || 算不上是逻辑运算符,而是返回一个值,然后隐式转换为布尔值
console.log( "yep" );
} // 可以看这个例子
let a = 1
let b = null
console.log(a && b)
console.log(a || b) //看看我们第二个例子的显式转换版本,好吧,确实是“显式”,但是可读性和简洁性大大下降
if (!!a && (!!b || !!c)) {
console.log( "yep" );
}
“捷径”

现在的人都是想着学习"有用的",但是谁来告诉你有用,答案是没有人能准确告诉你,就像一个人的成功,是很难复制的,粮食构筑了我们强壮的身体,而知识,带来的是我们思维高度的变化,就算忘记了,思维的转变都已经发生,因为学习了C++,它的指针思想,让我对值传递和引用传递的理解更加深刻,学习了java,在我学习TypeScript时,意识到静态语言的好处,从而理解声明式类型系统和线型类型系统的区别,我很快掌握了TypeScript想要干什么,按照这个思路我很快就上手了

ECMAScript 语言类型

Undefined Null Boolean String Number Object

js内置类型

null undefined boolean number string object symbol

我们依次来理解这些值的场合

undefined(未定义)

什么叫未定义?

let a //这是未定义? 还是说一个未存在的变量b是未定义

引入一个C++的概念,声明和定义

let a = 1 //定义:可以为变量分配存储空间,并且可以给变量一个初始值

let b //声明:告诉编译器这个变量的名字和类型(extern int a;(在没有赋值的情况下,变量前加上关键字extern一定为声明))
js无法区分未定义变量和未声明变量
let a = 1
b //没有声明的变量
typeof a //undefined
typeof b //undefined

不过我们这样做, typeof不会区分undefined和undeclared,但是给了我们应对的方法

//DEBUG 是一个开发环境下定义的全局变量,生产环境下没有这个变量
// 这样会抛出错误,ReferenceError: DEBUG is not defined
if (DEBUG) {
console.log( "Debugging is starting" );
}
// 这样是安全的
if (typeof DEBUG !== "undefined") {
console.log( "Debugging is starting" );
}

也许你不知道,undefined并不是一个关键字,这意味着我们可以定义它或者给它赋值,但是永远不要这样子做

// 非严格
undefined = 2 //可以 // 可以定义一个变量叫undefined,但是永远不要这样做 function foo() {
"use strict";
var undefined = 2;
console.log( undefined ); // 2
}
foo();
undefined小结

undefined在规范下,只出现在变量未定义或者未声明情况下,我们使用下面100%安全的检测方法

  typeof v === "undefined" //检测一个变量未定义或未声明

深入js系列-类型(开篇)的更多相关文章

  1. 深入js系列-类型(隐式强制转换)

    隐式强制转换 在其可控的情况下,减少冗余,让代码更简洁,很多地方都进行了隐式转换,比如常见的三目表达式.if().for().while.逻辑运算符 || &&,适当通过语言机制,抽象 ...

  2. 深入js系列-类型(对象)

    开篇 值的传递方式 1.值传递 表示传递过程中复制了值 2.引用传递 表示传递过程中传递的是值的引用 js的传递方式 值传递 看下面的例子 // 这里值传递很容易理解 var a = 1 var b ...

  3. 深入js系列-类型(数字)

    开头 js数字没有明确区分浮点数和整数类型,统一用number类型表示. number 基于IEEE 754标准实现 js采用的是双精度(64位二进制) 我们看一个基于IEEE 754标准实现都有会有 ...

  4. 深入js系列-类型(显式强制转换)

    什么是显式 这里的显式和隐式是以普遍的标准来进行讨论的,你能看出来是怎么回事,那么它对你是"显式",相反你不知道的话,对你就是"隐式" 抽象操作 字符串.数字. ...

  5. 深入js系列-类型(null)

    首先null是表示什么状态呢 这个是需要和上篇的undefined做一个区分 undefined 从未赋值 非关键词(也就是可以定义为变量名或者赋值给它) null 曾经赋值.目前没值 关键词 typ ...

  6. 【D3.V3.js系列教程】--(十二)坐标尺度

    [D3.V3.js系列教程]--(十二)坐标尺度 1.多种类型的缩放尺度 Quantitative Scales Linear Scales Identity Scales Power Scales ...

  7. 微信JS分享功能--微信JS系列文章(二)

    概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...

  8. js系列教程2-对象、构造函数、对象属性全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  9. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

随机推荐

  1. openresty nginx systemtap netdata

    https://openresty.org/cn/getting-started.html https://github.com/openresty https://github.com/openre ...

  2. 《 .NET并发编程实战》实战习题集 - 1 - 隔离副作用

    先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.

  3. Python学习笔记之使用 python -m SimpleHTTPServer 快速搭建http服务

    0x00 概述 搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享.但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方便的地方.比如你想快速共享Linux系统的某 ...

  4. WPF 页面导航

    <Button x:Name="btnReset" Click="btnReset_Click" Content="重 置" Grid ...

  5. System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false

    多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,这时如果想要访问窗口的控件,发现无法对其控制. 这时可将窗口构造函数中的CheckForIllegalCrossThreadCalls设置为f ...

  6. .NET获取实例化对象的部分属性名称

    前言 项目中实例化的对象,对象中里面很有很多属性,有些是我们不需要的,有些是我们需要的,例如在下面的示例中:ID,CreateBy等属性在CB_Projects对象中是不需要的,在获取实例化对象属性名 ...

  7. leetcode求峰值,js实现

    原题: 最开始是照着提示的思路进行,中规中矩,用时64ms  /** * @param {number[]} nums * @return {number} */var findPeakElement ...

  8. 初识Markdown

    目录 一.基础语法 二.语法规则 1.标题 2.列表 3.文字格式 4.链接 5.图片 6.引用 7.水平分隔线 8.代码块 9.表格 10.文档目录 11.转义定义 写在前面 Markdown(简称 ...

  9. 一次U9身份验证http数据对接

    一般情况下传输和回传HTTP协议就搞定了,但这次不同,有身份验证,网上的资料相对较少,怎么办呢?.NET没有不代表JAVA没有,网上搜JAVA身份验证HTTP协议, 果然是有的,跟着代码改成相应的.N ...

  10. git操作:删除仓库中的文件或目录

    假定当前分支下,abc/123.txt需要从git仓库中删除: git .txt //删除abc目录下的123.txt文件,如果要删除abc目录,使用命令:git rm -r --cached abc ...