写JavaScript有一段时间了,每当接触到什么新东西的时候,都会觉得自己提升得特别快。
例如,刚开始使用jQuery的时候,你觉得自己无所不能。
第一次接触AngularJS的时候,你觉得,卧槽,还可以这样!
学会用Grunt、Gulp构建项目的时候,于是乎所有可以自动构建的步骤,都换成自动构建。
接触React之后,就好像发现了更大的世界,webpack,函数式编程、ES6接踵而来。
我的意思是,每到一个阶段,都会觉得自己什么都会,特别厉害。然而,再过一段时间,你就会觉得自己其实什么都不会,然后继续埋头学习点实在的东西。
学习过程中总会遇到平台期,也就是一段没啥进步的时期。
很多时候我们就会在这段时期积累一些比较沉闷的东西,比如说像原生JavaScript这种知识。
这种东西需要长期积累,而且每次学的时候发现并没有像以上接触新框架/工具时候那么兴奋。
但是,这又是必须的。只有当积累到一定的程度,才能够度过这段平台期。
You Don‘t Know JS是一本专门写JS的书,没有DOM,没有Node,仅仅专注于JavaScript语言本身。市面上有很多写JS的书,为什么是这本?
对于我来说,我觉得这本书能够令我在这个平台期学习过程中并没有感觉到十分沉闷,反而成为了一件比较愉快的事。
甚至促使了我去做了一些笔记,以下就是关于这本书的笔记。
建议想要提升自己JavaScript理解的人都看看这本书
这本书托管在Github上面, 地址是 https://github.com/getify/You-Dont-Know-JS
不废话了,以下是自己看You Don’t know JS系列做下的笔记,过过目就好。
JavaScript有7种数据类型,分别为:
null
undefined
boolean
number
string
object
symbol — (ES6增加)
所有以上除了object都属于“基本类型”
typeof 操作符可以检测到数据的类型,并返回相应类型的字符串:
typeof undefined === 'underfined' typeof true === 'boolean' typeof 42 === 'number' typeof '42' === 'string' typeof { life: 42 } === 'object' typeof Symbol() === 'symbol'
但是,有一个例外:
typeof null === 'object'
这是一个Bug,但是由于这个Bug在JavaScript最初已经存在了,所以很多项目都有意无意地使用了这个Bug,所以在新版本的JavaScript并没有修复它。
如果想要检测一个变量是否严格等于null,可以这样:
var a = null; (!a && typeof a === 'object')
因为null是object类型里面唯一一个假值。
除此之外,Function和Array属于Object的之类。
Function也是对象,与一般对象不一样的是,函数有一个内置的[[Call]]属性,表示这个对象是可以调用的。
Array与一般对象不一样的地方在于,它的属性默认由递增的数字键组成。
另外,一个变量等于undefined,并不等同于这个变量没有声明。看例子:
var a; a; // undefined b; // ReferenceError: b is not defined
a变量声明过了,但是没有给它赋值,所以返回undefined; 因为b完全没有声明,所以抛出引用错误。可见undefined和没有声明是不一样的。
但是,typeof操作符有它特殊的地方,它并不区分undefined和没有声明。
var a typeof a // “undefined" typeof b // “undefined"
虽然看起来是一个bug,但是我们可以利用这个特性!
假设有项目有个debug模式,有DEBUG变量控制。
// 如果DEBUG变量不存在,会报错! if (DEBUG) { console.log('debug 模式') } // 安全检测DEBUG变量 if (typeof DEBUG !== 'undefined') { console.log('debug 模式') }
JavaScript有7种自带类型:null,undefined,boolean,number,string,object,string,object,symbol;它们可以被typeof操作符检测到。
变量没有类型,但是它们的值有;这些值的类型决定了变量的行为。
很多开发者会觉得“没有定义”和“没有声明”是一样的。但是在JavaScript中它们之间有很大不同。一个声明过的变量可以被undefined赋值,而一个没有什么被声明过的变量,它根本不存在。
有时候JavaScript自身也会混淆两个概念,这个两种情况下,typeof操作符都互会返回“undefined“。
但是,我们可以利用这个特性,安全地(没有报错)检测一个变量是否存在。