一、符号表达式
- 逗号表达式只有最后一项是有效的,而for的第二项对应的布尔值决定了循环是否继续
var k = 0; for(var i=0,j=0;i<10,j<6;i++,j++){ k += i + j; } console.log(k); => 30
- +是左连接,结果为字符串, -是右连接,结果为number
"2" + 3 + 4 = "234" "2" - 3 - 4 = -5
二、正则表达式
RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的。 exec()接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null
var str1=new RegExp("e");
str1.exec("hello")
三、let、const变量声明
https://es6.ruanyifeng.com/#docs/le
四、数据类型转换
Number()可以用于任何数据类型的转换。转换规则如下:
1.如果是Boolean值,true和false将分别被转换为1或0.
2.如果是null值,返回0;
3.如果是undefined,返回NaN;
4.如果是字符串则遵循以下规则:
a.字符串只把含数字(包含前面带正号或负号的情况),则将其转换为十进制数值,前导零会被忽略。(例如“011”会变成11);
b.如果字符串中包含有效的浮点格式,则将其转换为相应的浮点数值,前导零会被忽略;
c.如果字符串中包含十六进制格式,则将其转换为相同大小的十进制整数;//number("01f")=31
d.如果字符串是空的,则将其转换为0;//number(" ")=0;
e.如果字符串中包含除以上格式之外的字符,则将其转换为NaN.//number("helloworld")=NaN
5.如果是数值,不用说当然是传啥返啥;
6.如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次按照前面的规则转换返回的字符串值。
Number()
Number(0)
Number('')
Number('0')
Number(false)
Number(null)
Number([])
Number([0])
=> 0
Number(undefined)
parseInt("")
parseInt(null)
parseInt(undefined))
=> NaN
五、模块化
模块化有利于管理模块间的依赖,更依赖模块的维护
1、浏览器端的js模块化规范:
AMD:由require.js实现,推崇依赖前置
CMD:由sea.js实现,推崇依赖就近
2、服务器端的js模块化规范:
CommonJS:由NodeJS实现。
六、继承
实现继承共6种方式:
原型链继承、借用构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承。
构造函数继承:每次继承都会把父类的所有属性方法全部拷贝一份,而对于公用的方法重复拷贝会浪费内存;只能继承父类的实例属性和方法,不能继承原型属性/方法。
原型链继承:所有对象都公用一份原型属性和方法,对一个类的修改回影响的其他类
组合继承:结合两种继承方式,用构造函数方式继承属性,原型链方式继承方法
七、匿名函数
匿名函数具有全局作用域
八、this指向
方法/函数是由谁(对象) 调用 的,方法/函数内部的 this 就指向谁(该对象)
九、变量、函数提升
函数提升优先级高于变量提升
var a = 10;
function a(){}
console.log(typeof a)
=> "number"
var a;
function a(){}
console.log(typeof a)
=> "function"