语言基础
语法
标识符
注释
//
/*
*/
严格模式
// 也可以单独指定在一个函数中进行
'use strict'
语句
- 语句末尾分号不是必须的,但是最好加上
- 加上分号方便开发者删除空行压缩代码
- 有助于提高性能,因为浏览器会尝试在合适的位置补上分号以纠正语法错误
- if之类的,即使是单条语句,也建议加上大括号
保留字和关键字
变量
ECMAScript变量是松散类型的,变量可以用于保存任何类型数据,每个变量只不过是一个用于保存任意值的命名占位符
声明变量:
- var
- let
- const
var声明提升
使用var声明的变量,声明语句会提升到作用域顶端
let声明
- let与var最大的区别在于let声明的是块作用域,var声明的是函数作用域,块作用域是函数作用域的子集
- let没有变量提升
- 对声明冗余报错不会因混用 let 和 var 而受影响。这两个关键字声明的并不是不同类型的变量, 它们只是指出变量在相关作用域如何存在
- 在let声明之前的执行瞬间被称为暂时性死区
- 使用 let 在全局作用域中声明的变量不会成为 window 对象的属性(var 声 明的变量则会)
- 对于 let 这个新的 ES6 声明关键字,不能依赖条件声明模式
- 用let来声明for循环的变量,每次循环迭代都会创建一个新变量
const语句
- const语句声明时必须初始化
- const声明的限制只适用于它指向的变量的引用
声明风格
- 不使用var
- const优先,let次之
数据类型
六种简单数据类型:
- Undefined
- Null
- Boolean
- Number
- String
- Symbol
typeof操作符
使用typeof操作符会返回以下字符串之一
- undefined
- boolean
- string
- number
- object
- function
- symbol
undefined类型
Undefined类型只有一个值,就是undefined
声明了变量但是没有初始化就相当给变量赋值了undefined
Null类型
null类型同样只有一个值,即特殊值null
从逻辑上讲,null表示一个空对象指针
在定义用来保存对象的变量时,建议使用null来初始化
Boolean 类型
有两个字面值,不同类型装Boolean的表格
- True
- False
Number 类型
- 使用IEEE 754表示整数和浮点数
- 八进制第一个数字必须是0,如果后面的数字超过了7就会忽略前缀0,八进制在严格模式下是无效的
- 由于保存浮点数所需空间是整数的两倍,所以ECMAScript总是想方设法的将值转换为整数
- 0.1 + 0.2 != 0.3 由于IEEE 754标准的精度问题(二进制无法精确的表示0.1与0.2
- 值的范围
- Number.MIN_VALUE
- Number.MAX_VALUE
- 如果计算的结果超过js可以表示的范围就会被转换为一个特殊的Infinity
- isFinite()函数可以用于判断值是否合法
- NaN(Not a Number) 用于表示本来将要返回数值的操作失败了(而不是抛出错误
- 例如 0/1
- 设计NaN的操作都会返回NaN
- isNaN()会尝试将一个值转换为数值,任何不能转换为数值的值都会返回true
String 类型
字符串表示:
- '' ''
- ' '
- ``
字符串的特点
- 字符串一旦创建就不能改变了,要修改某个字符串的值,就需要先销毁原先字符串,然后再生成新的字符串
- toString() , 如果是数值调用时,可以添加一个底数参数
- 模板字符串
- 字符串插值
- 原始字符串 String.raw
- 标签函数
function tagFunction(strings, aValExpr, bValExpr, sumValExpr) {
console.log(strings);
console.log(aValExpr);
console.log(bValExpr);
console.log(sumValExpr);
return sumValExpr;
}
let a = 1,
b = 2;
let taggedResult = tagFunction `${a} + ${b} = ${a + b}`;
console.log(taggedResult);
/**
* [ '', ' + ', ' = ', '' ]
* 1
* 2
* 3
* 3
*/
Symbol 类型
ES6新增
Object 类型
- constructor
- hasOwnProperty(propertyName)
- toLocaleString()
- toString()
- valueOf()
操作符
一元操作符
- 递增递减操作符
- 一元加和减
位操作符
- 位操作考虑32位即可 ,虽然ECMAScript中的所有值都以IEEE754 64位格式存储,但位操作并不直接应用64位,而是将值先转为32位
- 负数以二进制补码存储
- 按位非:~(对数值取反并减1)
- 按位与:&(将两个数的每一位对齐,然后每一位进行与操作)
- 按位或:|
- 按位异或:^
- 左移:<<
- 有符号右移:>>
- 无符号右移:>>>
布尔操作符
- 逻辑非:!
- 逻辑与:&&(短路特性)
- 逻辑或:||
乘性操作符
- 乘法操作符
- 除法操作符
指数操作符
- **, 也可以使用Math.pow()
- **=
add operator
- add: +
- sub: -
relationship operator
- >
- <
- >=
- <=
equal operator
- ==(only judge whether the value is equal)
- !=
- === (judge value as well as data type)
assignment operator
- =
- combine with other operator
comma operator
doing multiple operation in one sentence
let num = 1, num2 = 2, num3 = 3;
sentence
if
while
loop
do-while
a while sentence that test it after doing a loop
do {
// statement
} while (expression)
for
the 'for' sentence have initial code.
for-in
a strict iteration sentence, enumerated properties in an object
if the object that will be enumerated is null or undefinde, the loop sentence will not be executed.
for (property in expression) {
// statement
}
for-of
a strict iteration sentence, enumerated elements in an object
for (property of expression) {
// statement
}
label sentence
The label sentence is using to add label to sentence.
// syntax
label: statement;
// example
let count = 5;
start: for (let i = 0; i < count; i += 1) {
console.log(i);
if (i === 2) continue start;
}
break & continue
with
The useness of 'with' is setting the code scope to a certain object
let obj = {
age: 12,
name: 'azoux',
};
with(obj) {
console.log(name); // azoux
console.log(age); // 12
}
the strict mode would not allowed the use of 'with'.
switch
switch(expression) {
case value1:
statement
break;
case value2:
statement
break;
// case n
default:
break;
}
the reason why we add 'break' sentence to all cases is to avoid unnecessory judgement.
function
The best practice is that a function either returns a value or does not return a value. Functions that return values only under certain conditions will bring
Trouble, especially when debugging.