truthy和falsy
falsy:false 0 "" null NaN undefined
truthy:除了上述
var let const
var:语句块是没有作用域的,只有函数有。
let、const: 拥有块作用域。
parseInt、parseFloat、+对于字符串转数字的处理
parseInt
和parseFloat
方法会遍历字符串,直到有无法转化成字符串的字符出现就停止遍历,将该字符之前的转化为数字输出。
+
如果字符串中有无法转化为数字的字符,那么整个字符串就会转化为NaN
数组的长度
数组的长度是最大下标+1
let a = [1,2,3]
a[100] = 101
// a.length == 101
// a[10] == undefined
如上所示,数组长度为101,未被赋值的都是undefined。
函数调用
函数中的this
指向了调用函数的对象,若通过.
、[]
来访问,this就是指向调用者,没有用就指向全局。
call和apply
apply(param1,param2)
第一个参数修改this,将函数中的this指向参数,第二个参数就是修改函数的内置参数列表。params是什么,参数列表就是什么(arguments)
call(params,param2)
第一个参数也是修改this,同apply。第二个参数是扩展的参数列表。
内部函数、闭包
内部函数是指函数内部的函数,它可以访问父亲函数的变量。
闭包
闭包是JavaScript中最强大的抽象概念之一。
function makeAdder(a) {
return function(b) {
return a + b;
}
}
var add5 = makeAdder(5);
var add20 = makeAdder(20);
add5(6); // ?
add20(7); // ?
看如上代码,当调用makerAdder时,创建了一个作用域对象,里面有一个属性为a,并返回了新的函数,我们称之为innerAdder。原本,js的垃圾回收机制会将这个作用域对象回收,但是他发现,在innnerAdder拥有一个指向了作用域对象的引用,所以作用域对象不会被回收,直到没有任何引用指向新函数 innerAdder。