1. {} + '4'的结果
一个对象和字符串相加,会调用对象的toString方法,
({}).toString()的结果是"[object Object]"
所以打印出的结果是[object Object]4
事实上,任何一个对象和字符串相加,结果都是[object Object] 和字符串拼接的结果
2. ({})*2 对象和数字相乘
对象和数字相乘会调用对象的valueOf()方法
可以看到,如果直接让 空对象 和 数字相乘,valueOf的返回值不是数字,所以返回NaN
但如果对象的valueOf()函数返回一个数字,那么就可以做乘法运算
3. typeof 2+3 的结果
typeof 运算符的优先级很高,所以结果是 'number3'
注意typeof的返回值是的类型是string
4.函数作用域链
let a= 1
function fn1(){
function fn2(){
console.log(a)
}
function fn3(){
let a= 3
fn2()
}
let a = 2
return fn3
}
let fn = fn1()
fn()
打印出的结果是 2
因为 fn 其实就是fn3
执行fn 就是 执行fn3
fn3里需要执行 fn2()
那么我们就去找fn2()里的a是什么
可以看到fn2()内部没有a, 那么就找离它最近的词法作用域链 上的a是多少
即 (看离fn2函数声明最近的a),
最近的就是第8行的 let a =2
所以打印出2
let a = 1
function fn1(){
function fn3(){
let a=3
fn2()
}
let a =2
return fn3
}
function fn2(){
console.log(a)
}
let fn = fn1()
fn()
这里的结果是打印出 1
因为离 fn2 声明时 ,最近的词法作用域上的 a 是第一行的let a =1
所以打印出 1
5.当函数的形参是基础类型
function inc(n) {
n++
}
let n = 10
inc(10)
console.log(n)
6.当函数的形参是引用类型
function inc(arr){
arr.forEach((v,i)=> arr[i]++)
}
let arr = [1,2,3]
inc(arr)
console.log(arr)
7.document.querySelector()
document.querySelector 返回的是DOM元素
document.querySelector('body') 和 document.body 是一个东西
8.document.querySelectorAll()
document.querySelectorAll 返回的是NodeList 类数组对象,是一个伪数组
可以通过[...NodeListElement] 把类数组对象转换成数组,再使用数组的方法,比如 indexOf
也可以用 Array.from(NodeListElement) 转换成数组
NodeList自带 forEach方法,遍历类数组对象时可以不用转换成数组
9. addEventListener的第三个参数
addEventListener还有第三个参数,如果不设置,默认是false,表示在事件冒泡阶段监听。如果设置为true,表示在捕获阶段监听。
10.原型是什么?
一个对象的原型指的是这个对象与其他同类对象的公有属性的集合,比如 obj1 和 ob2 同时拥有 toString / valueOf,那么 toString / valueOf 等属性组成的对象,就是 obj1 和 obj2 的原型