《JS基础复习笔记》

95 阅读2分钟

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 的原型