运算符
数学运算:+ - * / %
/。 10/4=2.5 因为JavaScript中只有数字类型,不区分整形和浮点型
-
- / %全部会触发隐式转换,字符串都会进⾏触发
字符串能转则转,不能转则成NaN
+。 1、数学运算的加法
除去字符串的类型,其他类型相加都是数学运算
可能会去触发隐式转换
2、字符串的拼接
任何类型只要跟字符串相加都是字符串的拼接
true➕ 10=11
NaN (not a number)属于⼀个特殊的数字,因为是数字类型
- / %全部会触发隐式转换,字符串都会进⾏触发
转换:
隐式转换
true -> 1。 false -> 0。 undefined -> NaN。 null -> 0
强制转换。 能转就转,不能转就NaN
parseInt()
字符串类型的⼩数会舍弃⼩数部分并转换成数字类型
如果以数字开头,⾥⾯含有字符,会截取前⾯的数字部分并转换成数字类型
parseFloat()
Number()
只能进⾏纯数字的字符串转换
+
逻辑运算:
&&。 ||。 !
//。>。>=。<。<=。。!=。 (=,!==是JavaScript中独有的)
赋值运算符
+=。-=。/=。*=
作⽤域。作⽤域链。闭包。原型。原型链
JavaScript中⾮常重要的两条链:
作⽤域链:从上往下查找
原型链:从下往上查找
作⽤域:
全局作⽤域
函数作⽤域
块级作⽤域(ES6中新增的内容)
函数作⽤域
特点:逐⾏执⾏。 沿着作⽤域⾥⾯的内容逐⾏执⾏
1、基本的语法检测 例如单词拼写错误 ,中⽂没有注释。。。低级错误
2、形成作⽤域(对象)的过程,预解析(预编译)
2.1 函数在执⾏前的⼀瞬间会⽣成⼀个AO(active object 活动对象)对象*
2.2 分析参数,形参作为AO对象的属性名,实参作为AO对象的属性值*
2.3 分析var声明,变量名作为AO对象的属性名,值为undefined,如果遇到同名,不会对AO对
象做任何改变*
2.4 分析函数声明,函数名作为AO对象的属性名,值为函数体,如果遇到同名,会直接以函数
声明为主,直接覆盖*
3、逐⾏执⾏,就是根据预解析产⽣出来的对象进⾏逐⾏执⾏
全局作⽤域,对应的对象是GO(global object),进⼊script标签以后,在所有的代码之前会产⽣
产⽣的⽅式可以说跟AO完全相同,只是少了参数这⼀个步骤
1、在进⼊script标签,代码执⾏前的⼀瞬间,会产⽣⼀个GO对象
2、分析var声明,变量名作为GO对象的属性名,值为undefined,如果遇到同名,不做任何改变
3、分析函数声明,函数名作为GO对象的属性名,值为函数体,如果遇到同名,直接覆盖
闭包:通过⼀些⽅式可以访问到函数内部的变量
正常来说,函数执⾏完成以后,会销毁,
优点:可以保证变量的安全
缺点:但是闭包会带着⽗级的作⽤域保存到外⾯,导致函数执⾏完成以后内存不会被释放
因为JavaScript中只有全局作⽤域和函数作⽤域
在进⾏预解析的时候,只需要去管函数 if判断中的声明(变量声明及函数声明都得正常分析)if条件
决定的是后⾯的执⾏过程
注意⚠ :var声明是没有影响的,但是函数声明存在兼容性问题(各个版本的浏览器产⽣的结果会不
⼀样)
函数的声明及函数表达式
区别:
使⽤:没有任何区别
对预解析有影响的
本质:函数声明式函数,函数表达式是声明的变量
区分:函数声明是以function开头,其他的全是函数表达式
1、⼀旦函数声明变成了函数表达式,就会放弃函数名,函数表达式⼀般都没有函数名的
2、()执⾏符号
不能去直接执⾏函数声明
可以去执⾏函数表达式
函数是引⽤类型,函数也是⼀个对象,函数也是⼀个对象,函数对象,对象就有⾃⼰的属性和⽅法
console.log(fun.name) //函数的名字
console.log(fun.length) //形参的个数
⽴即执⾏函数
⾯试题:控制台显示什么内容?
function fun(a,b,c,d){
console.log(a + b + c + d)
}(1,2,3,4)
结果:什么也没有
arguments
arguments和形参有映射关系
1、当形参和实惨没有对应的时候,没有对应的形参和arguments没有办法形成映射关系
2、开启了严格模式,形参和arguments就不会有映射关系
开启严格模式。‘use strict’