你不知道的javascript读书笔记3
概述
这是我看《你不知道的JavaScript(中卷)》中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用。
typeof
我们知道js中有七种内置类型:undefined, null, string, boolean, object, number, symbol。
我们分别用typeof对它们一一进行检查:
typeof void(0) //输出'undefined'
typeof null //输出'object'
typeof 'haha' //输出'string'
typeof true //输出'boolean'
typeof {} //输出'object'
typeof 3 //输出'number'
typeof (Symbol(2)) //输出'symbol'
可以看到,除了null值会被检查为object之外,其它的都显示正常。
那么怎么检查null值呢,方法是利用所有的对象都是真值但是null是假值这一特性:
var a = null;
!a && typeof a === 'object'; //true
函数
虽然函数并不是内置类型,但是它的typeof值与上面的任何一个都不同:
typeof function() {} //输出'function'
所以,当我们判断是否为对象的时候,仅仅用typeof的值为object是不行的,还要加上typeof值为function的情况。
值得一提的是,函数也有“长度”,它的length值是它的参数个数:
function haha() {
return;
}
function jaja(a) {
return;
}
function yaya(...args) {
return args;
}
haha.length; //0
jaja.length; //1
yaya.length; //0
数组
数组也是一个特殊的对象,它和函数一样不是内置类型,但是和函数一样非常常用。那怎么判断一个值是否是数组呢?
最简单的方法是利用Array.isArray()方法:
Array.isArray([2, 3]); //true
Array.isArray({}); //false
但是isArray在有些浏览器里面不兼容,所以要写一个polyfill代码:
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
Object.prototype.toString.call
正如上面的例子所示,Object.prototype.toString.call是另一个判断类型的好办法。比如判断boolean:
function isBoolean(obj) {
return Object.prototype.toString.call(obj) === '[object Boolean]';
}
typeof的防范机制
我们经常会先判断一个变量存不存在,然后再来使用这个变量:
if(debug) {
console.log('Debugging is starting!');
}
但是如果debug这个变量没有声明的话,上面的语句就会报语法错误:Uncaught ReferenceError: debug is not defined。
怎么办呢?冒昧的去声明一个变量并不是一个很好的解决方法。这个时候就可以利用typeof的防范机制:如果一个变量a未声明,那么typeof a不会报语法错误,而是会返回undefined。
typeof hahahhhh; //'undefined'
所以一般把上面的代码改成下面的形式:
if(typeof debug !== 'undefined') {
console.log('Debugging is starting!');
}
你不知道的javascript读书笔记3的更多相关文章
- <你不知道的JavaScript>读书笔记
近几天看了一本不错的 JavaScript 的书,是 Kyle Simpson 写的 <You Don't know JS>.这本书是 Kyle Simpson 在 Github 上的开源 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- 数据结构与算法JavaScript 读书笔记
由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...
- 《你不知道的JavaScript》笔记(一)
用了一个星期把<你不知道的JavaScript>看完了,但是留下了很多疑惑,于是又带着这些疑惑回头看JavaScript的内容,略有所获. 第二遍阅读这本书,希望自己能够有更为深刻的理解. ...
- 【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现
console.log( a ); var a = 2; 执行输出undefined a = 2; var a; console.log( a ); 执行输出2 说明:javaScript 运行时在编 ...
- JavaScript读书笔记(1)
从今天开启每天看书记笔记模式,<JavaScript高级程序设计(第3版)> 1. Javascript最初是为了解决输入验证器的问题,现在已经发展成一门复杂的语言: 2. 语言标准为E ...
- JavaScript读书笔记(一)
自动类型转换 在JavaScript中,使用 == .=== 和 - 等运算符能够使得类型自动转换. 关于不同类型的值的比较 flase == 0; //true "" == fl ...
- 悟透javascript读书笔记
1.undefined,null,0,"" 这四个值转换为逻辑值时是false,其他无论简单类型值,对象或者函数转换过来都是true 2.如图 第一个是“声明了一个变量,给变量赋 ...
- 高性能的JavaScript -- 读书笔记
高性能的JavaScript 一. 加载和运行 将脚本放在底部 脚本下载解析执行时,页面已经加载完成并显示在用户面前 成组脚本 减少外部脚本文件数量,整合成一个文件 延迟脚本 动态脚本元素 ...
随机推荐
- TXLSReadWriteII5 单元格读写
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, ...
- [Ting's笔记Day3]解决Git常见错误non-fast-forward问题
写文章最难的部分,是找题材! 所以最近每次遇到bug或错误都挺兴奋开心(zflwx)的,因为又可以写笔记了 也可以记录新手学习之路上遇到的常见问题,提供其他新手参考. 最近学Udemy平台Ruby学习 ...
- 搭建EOS环境
[搭建EOS环境] 1.Ubuntu 18.04 下安装eosio wget https://github.com/eosio/eos/releases/download/v1.4.4/eosio_1 ...
- jqGrid的userData的用法!!!
在一次项目中想从后台自定义一些返回值传回jqGrid,所以就想到了jqGrid的这个userData属性,但是真的是坑了我好惨,这里记录一下! 1.首先看说明,这个jsonReader的默认配置,us ...
- DBHelper类
import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import ja ...
- c#: 界面多语言动态切换简单实现
终于有空整理下多语言实现思路.查阅已有方案,有用不同resx文件的,有每个控件动态设置的,有用反射去整的,颇为繁琐. 结合项目中实现方法,并做简化,实现通用的多语言切换方案,以做备忘. 它支持语言自定 ...
- [leetcode]15. 3Sum三数之和
Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? Find ...
- eclipse中集成python开发环境
转载:https://www.cnblogs.com/mywood/p/7272487.html Eclipse简介 Eclipse是java开发最常用的IDE,功能强大,可以在MAC和Windos上 ...
- MySQL开发——【介绍、安装】
什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 数据库的分类? 关系型数据库 ...
- HTML第一篇
Hyper Text Markup Language 超文本标记语言:是一种创建网页的标准标记语言. <!DOCTYPE html> <html> <head> ...