变量声明(var const let)
var
-
声明范围是 函数作用域,变量声明会 “提升”,范围内重复变量的声明会在代码执行的一开始被合并成一个声明
var a = 1; var a; console.log(a); // 1
全局声明时会成为window对象的属性
for循环定义的迭代变量会渗透到循环外,引用始终为初始声明的变量
let、const
- 声明范围是 代码块,范围内无法重复声明
- 暂时性死区:无声明“提升”,声明前引用会报错(严格来讲也会提升,但由于暂时性死区,实际不能在声明之前使用,因此从写代码角度来说,两种提升不一样)
- for循环时,每次循环js引擎会在后台为每个迭代声明一个新的迭代变量
- const声明时必须初始化变量,且变量引用不可修改
数据类型
- 六种基础数据类型:String、Number、Boolean、Null、Undefined、Symbol
- 一种复杂数据类型:Object
typeof 操作符
- 用于判断变量的数据类型
- 返回值有:string、number、boolean、undefined、symbol、object、function
- null 被认为是空对象的引用,因此
typeof null === 'object'
- 函数严格来讲也是 Object,但函数也有自己特殊的属性,因此需要用typeof区分函数与一般Object
Undefined
- 任何声明未赋值的变量值都是undefined
- undefined值主要用于比较及明确区分于null
Null
- 建议用null来初始化对象变量,方便使用时判断是否已经重新赋值
- undefined由null派生而来,因此
null == undefined
Boolean
- falsy值:false,空字符串,0,NaN,undefin,null
Number
- 转换正整数优先使用
parseInt()
,parseInt()
更关注字符串是否含数值,Number()
函数转换字符串规则相对复杂且有点反常规
String
- 转换字符串优先使用
String()
,String()
会先尝试调用入参的toString()
方法,由于null和undefined
没有toString()
方法,String()
方法会返回他们本身
Symbol
Symbol
(符号) 实例是唯一且不可变更得的,用于是作为对象属性的唯一标识符,不会出现属性冲突-
通过直接调用
Symbol()
函数创建Symbol实例(为了避免创建符号包装对象,不支持new创建),可以传入一个字符串作为符号描述,但这个字符串与符号的定义或标识完全无关const symbolA1 = Symbol('a') const symbolA2 = Symbol('a') console.log(symbolA1 === symbolA2) // false
-
需要复用符号时,可通过
Symbol.for()
在全局符号注册表中创建或复用符号Symbol.for('foo') // 该方法调用时,若全局符号注册表已存在该符号,则引用,否则新建 const symbolA1 = Symbol.for('a') const symbolA2 = Symbol.for('a') console.log(symbolA1 === symbolA2) // true // 注意,Symbol()直接定义的符号并不在全局符号注册表中 const symbolA3 = Symbol('a') console.log(symbolA1 === symbolA3) // false
-
ES6中有一批内置符号,它们以Symbol工厂函数字符串属性的形式存在,例如
for of
会在相关对象上使用Symbol.iterator
属性,我们可以重新定义该属性以改变默认行为;在ECMAScript规范中,这类符号的名称前缀为
@@
,Symbol.iterator
等同于@@iterator
Object
- ECMAScript中其他类的基类,每个Object实例都有以下方法
- constructor 构造函数 用于创建对象实例
-
hasOwnProperty(propertyName)
用于判断属性是否在实例上 -
isPrototypeOf(obj)
判断一个对象是否是另一个对象原型 - toString 返回对象字符串表示
- toLocaleString 返回对象本地化字符串表示
- valueOf 返回对象字符串/数值/布尔值表示
-
propertyIsEnumerate(propertyName)
判断给定的属性是否可用(for - in) 枚举
操作符
-
++ -- + -
一元操作符都可以用于类型转换,先转换,后计数 - 位操作符
~ 非
;& 与
;| 或
;<< 有符号左移
;>> 有符号右移
;<<< 无符号左移
;>>> 无符号右移
- 布尔操作符
! 非
&& 与
|| 或
注意短路运算 -
* 乘
;/ 除
有余数;% 取模
只取余数; -
** 指数运算
3 ** 2 === 9
语句
-
for in
遍历对象的非Symbol键属性 -
for of
遍历可迭代对象的元素 (值) -
break
退出循环 执行循环后的语句 -
continue
退出本轮循环 从顶部开始执行下一轮循环