3.1 语法
1.大小写敏感
2.标识符 第一个字符必须是字母,下划线(_)或者刀了($)
3.注释 采用c的风格 //
4.严格模式 一些不规范的写法不会被执行
在开头加上"use strict";
5.语句一般以分号结尾 也可以没有(不推荐)
6.有保留字 如break,class,default等
3.3 变量
3.3.1 var
可以定义一个变量并且给其赋值
var message = "123"
1.声明作用域
function test(){
var message = '123'; //局部变量
mess = '456'; // 全局变量
}
test();
console.log(mess);
console.log(message);
2. 声明提升
执行如下代码不会报错
console.log(age);
var age = 10;
因为使用var关键字的变量会自动提升到函数作用域的顶部,等价于如下代码
var age;
console.log(age);
age = 10;
结果为undefined
3.let声明
1.let不会被提升
2.let不能重复声明 类似const
3.全局声明 不会成为window的属性(即window.变量被访问为undefined)
4.条件声明 let的作用域是块,所以不会检查前面是否使用过let,同时也就无法在没有声明的情况下使用它
5.for循环渗透问题
使用 var会造成变量渗透问题
<script>
for(var i=0;i<5;i++){
setTimeout(()=>console.log(i),0)
}
</script>
在退出时,所有的变量都是退出时的值
使用let则不会出现
<script>
for(let i=0;i<5;i++){
setTimeout(()=>console.log(i),0)
}
</script>
4.const声明
1.const的作用域是块
2.const在定义时必须赋值,而且不能修改(类似元组)
3.不能用const声明迭代变量 但是,只用const声明一个不会被改变的for循环变量,是可以的,像下面:
<script>
for(const value of [1,2,3,4,5]){
console.log(value);
}
</script>
5.声明风格以及最佳实践
1.不用var
2.优先const,其次let
3.4 数据类型
3.4.1. typeof
typeof 变量
类似python中的type 用于返回值的类型
3.4.2 undefined
在用var和let声明了值却没有赋值时,相当于给变量赋了undefined
不需要显示的给变量赋值undefined,因为默认值就是undefined
3.4.3 Null
只有一个值null,代表空对象指针
所以typeof null 会返回object
undefined是由null派生来的
所以 undefined==null 结果为true
3.4.4 Boolean
不同类型值之间的Boolean转化规则
数据类型 | 转化为true | 转化为false |
Boolean | true | false |
String | 非空字符串 | ""(空字符串) |
Number | 非0数字 | 0/NaN |
Object | 任意对象 | null |
Undefined | N/A | undefined |
3.4.5Number
1.进制
十进制 直接写出来
八进制 在数字前加0 a = 070
十六进制 在数字前加0x b = 0x0001
2.科学计数法
let floatNum = 3.1e10 相当于乘了10的10次方
3.值的范围
使用正无穷(Infinity)和负无穷(-Infinity)来表示超出最大范围的数字
4.NaN
Not a Number
在除以0后得到,防止报错直接退出
NaN == NaN 会得到false
5.数值转化
使用下面三个函数可以把非数字类型转化为数字类型
Number()
parseInt()
parseFloat()
3.4.6 String类型
1.字符串的定义可以使用 '' "" 和 ``
2.在涉及特殊含义的字符时 要在前面加 \ 转义符号
3.使用`` 可以跨行定义字符串
<script>
let a = `a
b
c`
</script>
4.字符串插值
可以在字符串中使用${}插入数值(要用``包裹)
let a,b,c;
let s = `${a} + ${b} = ${c}`
5.模板字面量与标签函数
<script>
let a = 6;
let b = 9;
function simple(strings,a,b,sum){
console.log(strings);
console.log(a);
console.log(b);
console.log(sum);
return null
}
let untaggedResult = `${ a } + ${ b } = ${ a+b }`
let taggedResult = simple`${ a } + ${ b } = ${ a+b }`
console.log(untaggedResult);
console.log(taggedResult);
</script>
对于有n个插值的字符串而言,传入的参数是n个,而第一个参数所包含的字符串个数始终是n+1
3.4.7 Symbol
用来表示一个独一无二的值
3.5 操作符
3.5.1 一元运算符
自增/自减 ++/--
一元加/减 +/- 相当于Number()的类型转化
3.5.2 位操作符
按位非: ~ 返回一补数(十进制)
按位与: &
按位或:|
按位异或:^
左移: <<x
有符号右移: >>x
无符号右移: >>>x
3.5.3 Boolean操作符
逻辑非:!
逻辑与:&&
逻辑或:||
3.5.4 3.5.5 3.5.6 乘性/指数/加性操作符
*
乘/除: */ /
指数运算: **
二元加/减: +/-
3.5.7 3.5.8 关系操作符
< > >= <=
相等:==(转换后相等) "55" == 55 true
不相等:!=
全等:===(不转换也相等) "55"===55 false
3.5.9 条件操作符
和C的三元表达式一样
a ? b : c
3.6 语句
if
do-while
do{
语句
}while(条件)
while
for
for-in
用于枚举对象中的非符号键属性
for(const propName in window){
document.write(propName);
}
for-of
严格的迭代语句,遍历可迭代对象的元素
for(const el of [2,3,4,6]){
console.log(el);
}
标签语句:state
state:statement 给语句添加标签
可以被break/continue语句引用
let num=0
outermost:
for(let i=0;i<10;i++)
for(let j=0;j<10;j++){
if(i==5 && j==5) continue outermost
num++
}
console.log(num); // 95
break/continue
switch case
3.7 函数
function 函数名(参数){
statement
return 返回值
}