1、使用 || 来填充默认值,避免对象属性为空报错
2、从undefined获取属性会导致TypeError异常,用&&运算符避免错误,如person && person.firstName ES6支持?.语法,优先使用?. 如 person?.firstName
3、使用hasOwnProperty检查对象独有的属性,这个函数不会检查原型链,如 filght.hasOwnProperty(‘number’)
4、for in对对象遍历,会列出所有属性,包括原型链上的属性,尽量避免for in遍历对象,使用属性名创建一个数组用for遍历
5、通过函数字面量创建的函数对象包含一个连接到外部上下文的连接,称为闭包。
6、闭包作用1:隐藏变量,避免全局污染 作用2:可以读取函数内部的变量 缺点1:导致变量不会被垃圾回收机制回收,造成内存消耗
缺点2:不恰当的使用闭包可能会造成内存泄漏的问题
7、函数调用时除了定义的形式参数,还有两个附加的参数,this和arguments
8、函数的调用方式分为,方法调用、函数调用、构造器调用、apply调用
9、方法调用模式:对象的属性是一个函数,通过函数名()调用,可以通过this访问对象的属性
10、函数调用模式:一个函数并非对象的属性时,是作为函数来调用的,内部函数调用时,this会绑定到全局而不是对象本身,解决方法是在对象定义一个属性that,指向对象本身this,内部函数使用that访问对象
function add(value1, value2) {
console.log(value1, value2);
return value1 + value2
}
var Person = {
value: 12
}
Person.person = function () {
var that = this
var person = function () {
that.value = add(that.value, that.value) // that指向Person对象
// this.value = add(this.value, this.value) // this指向全局的Window对象
};
person()
}
Person.person()
console.log(Person.value);
// console.log(Window.value);
11、构造器调用模式:一个函数结合new前缀使用称为构造器函数,按照约定,函数的名称为首字母开头,一般不推荐使用这种的形式的构造器函数
12、apply调用模式:使用apply调用函数,apply的第一个参数是this,第二个参数是函数参数数组
var array = [3, 4]
console.log(add.apply(null, array));
13、函数的附加参数:arguments arguments是一个类似数组的对象,没有数组的方法,arguments对象为传入函数的所有参数
function add() {
var sum = 0
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i]
}
return sum
}
console.log(add(1, 2, 3, 4, 5));
console.log(add(23, 45));
14、函数总会返回值,默认undefined,如果是构造器调用方式,返回的是该新对象
15、异常:通过throw抛出异常(exceptions对象),try包含可能有问题的代码块,catch捕获异常
function add(value1, value2) {
if (typeof value1 !== 'number' || typeof value2 !== 'number') {
throw {
name: 'TypeError',
message: 'add need number'
}
}
var sum = 0
for (let i = 0; i < arguments.length; i++) {
sum += arguments[i]
}
return sum
}
try {
add('seven')
} catch (e) {
console.log(e.message);
}