ECMAScript中的一切都区分大小写。
1.标识符
标识符就是变量、函数、属性、函数参数的名称。
不能作为标识符的有:
-
关键字与保留字:常见的几个:break、case、catch、do...
-
true、false、null
2.严格模式
在脚本开头加上"use strict";
3.变量
-
var
-
使用var定义的变量会成为包含它的函数的局部变量。比如在函数内部使用var声明,在退出函数时,该变量会被销毁。如果去掉var,则该变量被声明为全局变量。不过在严格模式下这么做,会抛出ReferenceError。
-
使用var声明时,即使该声明语句在其他语句之下,var声明语句会被提升(hoist)到函数作用域的顶部。
-
var支持冗余声明。
-
使用var在全局作用域声明的变量会成为window对象的属性。
-
-
let
-
与var区别在于let的作用域为块作用域,var作用域为函数作用域。块作用域为函数作用域的子集。
-
let不支持冗余声明。会返回SyntaxError。
-
嵌套使用相同标识符不会出错。因为在同一个块中没有重复声明。
-
let不会被hoist。在let声明之前的执行瞬间被称为暂时性死区。在此阶段引用任何后面才声明的变量会抛出ReferenceError。
-
使用let在全局作用域声明的变量不会成为window对象的属性,但是let声明仍然在全局作用域发生,相应变量会在页面的生命周期内存续。
-
let变量在使用前必须声明。使用try/catch或者typeof也不能解决。
-
使用let不会造成循环定义的迭代变量渗透到循环体外部。
-
-
const
-
使用const时必须同时初始化变量。初始化后不允许需修改,否则会抛出TypeError。也不能重复声明变量,抛出SyntaxError。
-
如果const变量引用的是对象,修改对象的属性是被允许的。
-
不能使用const来声明迭代变量。
-
4.数据类型
6种简单的数据类型(原始类型):Undefined、Null、Boolean、Number、String、Symbol
1种复杂的数据类型(复杂类型):Object(无序名值对的集合)
typeof操作符
-
对一个值使用typeof返回的是该值的类型。注意特殊的几个:
object--对象或Null(对一个空对象的引用)
function--函数
undefined
-
使用var/let但是没有赋值,和没有声明是不一样的。
-
strict模式下对未声明变量使用各种函数会报错。不过typeof则都可以使用。即使这样没有什么意义。
-
undefined是一个假值。
Null
-
null表示一个空对象指针。
-
在定义保存对象的变量时最好使用null。
-
undefined==null
-
null是一个假值。
Boolean
-
true和false才是有效的字面值。
-
数据类型 转换为true的值 转换为false的值 Boolean true false string 非空string “” number 非0(infinity) 0、NaN object 任意 Null undefined N/A undefined
Number
-
十进制、八进制(strict模式SyntaxError)、十六进制(0-9&0xA-F)
-
float num 必须包含小数点,小数点后至少有一个数字。如果小数点后是0/没有数字,则自动转换为int。可以使用科学计数法表示。0.00002=2e-5
-
有值的范围。
-
NaN(Not a Number)表示返回数值的操作失败,而不是Error。任何设计NaN的操作始终返回NaN。NaN不包括NaN在内的任何值。isNaN()传入的参数如果能转换成数值,返回false,反之返回true。
-
Number(),null、空字符串返回0;undefined返回NaN;字符串包含数值字符,包括前面带+-,返回十进制数,忽略前面的0;不包含数值的返回NaN。有效十六进制也返回十进制。对于一个对象,调用valueof(),如果转换结果为NaN再用toString(),再按照字符串的相应规则。
-
parseInt(),从第一个非空格字符开始转换,如果不是数值,立即返回NaN(包括空字符串)。小数会被直接取整,因为.不是整数字符。parseInt()的第二个参数意为:按X进制解析。
-
parseFloat(),同上,但是解析到一个无效浮点数值字符为止。第一次出现的.有效,第二次则无效。始终忽略开头的0。只解析十进制,十六进制数始终返回0。如果字符串表示整数,则返回整数。
String
-
“”/``/''都可行。
-
字符串一旦创建,不可变。
-
toString()方法适用于number、Boolean、obj、string。null和undefined不能使用。对于number,toString()中传入的参数表示被解析为X进制。
-
String()对于null返回“null”,undefined返回“undefined”。用于确认值是否被声明。
-
模板字面量会引起`后的1个空格。``可以定义字符串和模板,可以保留\n,或者跨行定义。模板字面量是一种特殊的javaScript句法表达式,在定义时立刻求值并转换为字符串实例。
-
`${}`
-
标签函数前缀到模板字面量来应用自定义行为。
-
原始字符串String.raw()。或者使用标签函数的第一个参数string.raw来获取。
-
-
常用字面量 含义 \n 换行 \t 制表 \b 退格 \\ 反斜杠 " 双引号 -
Symbol
-
symbol是原始值。且符号实例是唯一、不可变的。符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。并且Symbol()实例不会覆盖已有的对象属性。
-
使用Symbol()函数初始化。符号没有字面量语法。
-
Symbol()不能和new一起作为构造函数使用,为了避免创建符号包装对象。如果非要使用,用Object(Symbol())。
-
*Symbol.for()。运行时的不同部分需要共享和重用符号实例,就可以用字符串作为键,在全局符号注册表中创建并重用符号。
-
使用全局符号注册表,必须使用Symbol.for()。
-
Symbol()和Symbol.for()定义的符号不等同。
-
传入Symbol.for()中的任何值都会被转换为字符串。
-
Symbol.keyFor()查询注册表。该方法接收符号,返回该全局符号对应字符串键。如果查询的不是全局符号,返回undefined。传入的不是符号,返回TypeError。
-
-
*使用符号作为属性。包括对象字面量属性和Object.getOwnPropertyProperty()里面的数据描述和存取器描述。
-
*常用内置符号,用于暴露语言内部行为,从而使得开发者可以直接访问、重写、模拟这些行为。(不可写,不可枚举,不可枚举)
-
*Symbol.asyncIterator()作为一个属性表示一个返回对象默认的AsyncIterator。
说白了,就是表示异步迭代器API的函数。for-await-of循环会利用这个函数执行异步迭代操作。
-
*Symbol.hasInstance()作为一个属性表示一个决定某构造器对象是否认可一个对象是它的实例。instanceOf操作符来使用。instanceOf可以确定一个函数的实例的原型链上是否有原型。
-
该属性定义在function的原型上,默认在所有函数和类上都能调用。
-
可以在继承的类上通过静态方法重新定义这个函数。
-
-
Symbol.isConcatSpreadable()作为一个属性表示一个布尔值如果是true,则对象应该用Array.prototype.concat()来打平其数组元素。false或者假值会导致整个对象被追加到数组末尾。类数组对象则默认被追加到数组末尾。不是类数组/数组对象的,即使是true,也会被concat()忽略。
-
*Symbol.iterator()作为一个属性表示一个返回对象默认迭代器的方法,由for-of语句使用。说穿了这个函数就是表示实现迭代器API的函数。
-
*Symbol.match()作为一个属性表示用一个正则表达式方法去匹配字符串。由String.prototype.match()使用。
-
给该方法传入非正则表达式会导致该值被转换为RegExp对象。
-
-
Symbol.replace()作为一个属性表示一个正则表达式方法替换一个字符串中匹配的子串。String.prototype.replace()使用。给该方法传入非正则表达式会导致该值被转换为RegExp对象。
-
Symbol.search()作为一个属性表示一个正则表达式方法返回字符串中匹配正则表达式的索引。String.prototype.search()使用。给该方法传入非正则表达式会导致该值被转换为RegExp对象。
-
Symbol.species()作为一个属性表示一个函数值,该函数作为创建派生对象的构造函数。在内置类型中最常用。用于对内置类型实例方法的返回值暴露实例化派生对象的方法。给该方法传入非正则表达式会导致该值被转换为RegExp对象。
-
Symbol.split()作为一个属性表示一个正则表达式方法在匹配正则表达式的索引位置拆分字符串。由String.prototype.split()使用。给该方法传入非正则表达式会导致该值被转换为RegExp对象。
-
Symbol.toPrimitive()作为一个属性表示一个方法将对象转换为相应原始值。由ToPrimitive抽象操作使用。
-
Symbol.toStringTag()作为一个属性表示一个字符串用于创建对象的默认字符串描述。由内置Object.prototype.toString()使用。
-
Symbol.unscopables()作为一个属性表示一个对象所有的和继承的属性都会从关联对象的with环境绑定中排除。(不推荐使用)
-
-
Object
-
每个object实例都有如下属性和方法
-
constructor用于创建当前对象的函数。
-
hasOwnPrototype(prototypeName):用于判断当前对象实例是否存在给定的属性。要检查的属性必须是字符串或符号。
-
isPrototypeOf(object):用于判断当前对象是否为另一个对象的原型。
-
PropertyIsEnumerable(PrototypeName):用于判断给定的属性是否可以使用for-in枚举。属性名必须是字符串。
-
toLocalString()返回对象的字符串表示。反映该对象所在的本地化执行环境。
-
toString()返回对象的字符串表示。
-
valueOf()返回对象对应的字符串、数值或Boolean表示,通常与toString是返回值相同。
-
-
5.操作符
-
一元操作符(只操作一个值)
-
递增/递减
-
++/--前缀,变量的值会在该语句被求值之前就改变了。在计算机科学中被称为副作用。
-
后缀++/--,变量的值在该语句被求值之后才改变。
-
对于布尔值,true=1,false=0
-
对于字符串,如果是有效数值型式,会先被转换为数值;非数值形式,转换为NaN。
-
对于浮点值,+1/-1
-
对于对象,valueOf取值;如果NaN,同上面的字符串规则。
-
一元的+/-被放置在前面时,可以有转换数据类型的功能,也可以作为数学运算。
-
-
-
位操作符
-
非~
-
返回数值的一个补数。最终效果是对数值取反-1
-
-
与&
-
1+1=1,0+0=0,1+0=0,0+1=0
-
-
或|
-
1+1=1,1+0=1,0+1=1,0+0=0
-
-
异或^
-
1+1=0,1+0=1,0+1=1,0+0=0
-
结果比或小1
-
-
左移<<
-
左移后以0填充空位
-
保留原始符号
-
-
有符号右移>>
-
实际上是左移的逆运算。空位补0。
-
-
无符号右移>>>
-
对于正数,有符号右移和无符号右移结果相同。负数则差异很大
-
-
-
布尔操作符
-
逻辑非!
-
先将操作数转换为Boolean值。(此时的返回的Boolean值与原操作数真实的相反)
-
对象 空字符串 非空字符串 0 非0 null NaN undefined false true false true false true true true -
!!表示Boolean()。第一个!返回boolean值,第二个!再取反,从而给出变量的真实Boolean值。
-
-
逻辑与&&
-
第一个操作数 第二个操作数 结果 true true true true false false false true false false false true -
如果第一个操作数为对象,返回第二个操作数;如果第二个为对象,则第一个为true才会返回该对象;如果都是对象,返回第二个操作数。
-
如果有一个为null,返回null;如果有一个为NaN,返回NaN;如果有一个为undefined,返回undefined。
-
短路操作符。第一个如果是false,绝对不可能返回true。
-
-
逻辑或||
-
第一个操作数 第二个操作数 结果 true true true true false true false true true false false false -
与&&相同的返回特性。
-
同样具有短路特性。如果第一个为true,则不会继续求值。
-
-
-
乘性操作符
-
乘法*
-
不能求的返回infinity。
-
任一为NaN,返回NaN
-
infinity*0=NaN
-
infinity*非0=+/-infinity
-
infinity*infinity=infinity
-
-
除法/
-
infinity/infinity=NaN
-
0/0=NaN
-
非0/0=+/-infinity
-
-
取模%
-
infinity%非0/infinity=NaN
-
非0%0=NaN
-
-
-
指数操作符** **=
-
加性操作符
-
加法+
-
NaN+...=NaN
-
infinity+infinity=infinity
-
-infinity-infinity=-infinity
-
-0+0=+0
-
-0+ -0=-0
-
操作数有一个字符串,另一个也要转为字符串。
-
-
减法-
-
-0--0=+0
-
-0-+0=-0
-
infinity-infinity=NaN
-
-infinity--infinity=NaN
-
infinity--infinity=infinity
-
-infinity-infinity=infinity
-
-
-
关系操作符> < >= <=
-
都是字符串,比较字符串中对应字符的编码。
-
是对象,用valueOf/toString
-
-
相等操作符== != ===
-
相等和不相等
-
null==undefined,且二者都不能被转换为其他类型
-
任一为NaN,==返回false,!=返回true。NaN不等于NaN!!!
-
-
全等/不全等
-
和相等/不相等差不多,但是全等和不全等不会转换数据类型。
-
-
-
条件操作符
-
?----:-----
-
-
赋值操作符
-
没啥用
-
-
逗号操作符
-
赋值时,选最后一个。不过一般傻逼才用。
-
6.语句(流控制语句)
-
if
-
if (condition) statements1 else statements2
-
-
do-while
-
后测试循环语句。循环体中的代码执行后才会退出条件进行求值。循环体内代码至少执行一次。
-
do{ statements}while{expression}
-
-
while
-
先测试循环语句。先检测退出条件,再执行循环体内代码。
-
while(expression)statements
-
-
for
-
先测试语句。
-
for(initialization;expression;post-loop-expression) statements
-
-
for-in
-
枚举对象中的非符号键属性。
-
for(property in expression) statements
-
不能保证返回对象属性的顺序。
-
如果是null/undefined,不执行循环。
-
-
for-of
-
遍历可迭代对象的元素。
-
for(property of expression) statements
-
最好用const
-
会按顺序。
-
-
标签
-
用于给语句添加标签。
-
label:statement
-
-
break/continue
-
break语句立即退出循环,并且不再执行。
-
continue虽然跳过了这次循环但是还会继续执行。相当于少循环一次。
-
-
with
-
将代码作用于设置为特定对象。
-
with(expression) statement;
-
一般不用
-
-
switch
-
switch(expression){
case value1:
statement
break;
case value2:
statement
break;
default
.......
}
-
7.函数
-
function functionName(arg0,arg1,....){
statement
}
-
浙公网安备 33010602011771号