Loading

1.20面试题复习

考察隐式类型转换,下面if为真的有哪些

if([])
if({})
if([]==false)
if({}==false)
  1. 第一个为真,[]会被转换成true
  2. 第二个为真,[]会被转换成true

在if中单独会被转换成false的情况

  • 数字0
  • NaN
  • 空字符串
  • null或undefined
  1. 第三个为真 []先使用valueof转换成[] 再使用toString转换成空数组
  2. 第四个为假 {}先使用valueof转换成{}再使用toString转换成[Object object]

使用==的转换规则如下
当执行x == y 时:

如果x与y是同一类型:

this指向考察

function a(){
    this.b = 3
}
a() 
console.log(b) // ? 3  this这里代表全局对象 。node环境下会是undefined
var b = 5
console.log(b) // ? 5 
var c = new a()
console.log(b) // ? 5 
a.prototype.b = 4 
a.prototype.c = 5
console.log(c.b) // ? 3 先查找实例上的属性
console.log(c.c) // ? 5 原型链上的属性
console.log(b) // ? 5

什么是动态作用域?什么是静态作用域?

  • 静态作用域就是函数的作用域在函数定义的时候就决定了

  • 动态作用域就是函数的作用域是在函数调用的时候才决定的

js是动态还是静态作用域

JavaScript 采用的是静态作用域

例如

var value = 1;

function foo() {
    console.log(value);
}

function bar() {
    var value = 2;
    foo();
}

bar(); // 1 采取的是函数定义的时候的全局作用域

作用域考察

例1

var scope = "global scope";
 function checkscope() {
     var scope = "local scope";
     function f() {
         return scope;
     }
     return f();
 }
 console.log(checkscope()); 
// local scope 首先f()是在checkscope()函数内部被调用的时候返回值的,所以在f()执行时checkscope()依旧在栈中,
// f()执行时会先赋值scope属性,然后创建自己的上下文,压如栈中(栈中有全局上下文以及checkscope函数的上下文),然后创建自己的上下文(this,ao,scope)
// 然后f()执行,发现没有scope,就在checkscope的上下文中找到了 返回 local scope
例2
 var scope = "global scope";
 function checkscope(){
     var scope = "local scope";
     function f(){
         return scope;
     }
     return f;
 }
 checkscope()(); // ?
// local scope 首先f()是在checkscope()函数内部被调用的时候返回值的,所以在f()执行时checkscope()依旧在栈中,
// f()执行时会先赋值scope属性,然后创建自己的上下文,压如栈中(栈中有全局上下文以及checkscope函数的上下文),然后创建自己的上下文(this,ao,scope)
// 然后f()执行,发现没有scope,就在作用域链中寻找,然后在checkscope的上下文中找到了 返回 local scope

函数的scope属性在函数定义的时候就会被赋值,AO/VO中的Scope只是对这个值的赋值,所以以上两段代码的出入栈不一样,但是结果是一样的

例3
for(var i = 0;i<2;i++){
    setTimeout(()=>{
        for(var j = 0;j<3;j++){
            setTimeout(()=>{
                console.log(i*j)
            },0)
        }        
    },0)
}
// 输出结果是多少?为什么 都是6,在console.log(i*j) 与这个循环之间,没有其他的函数的上下文,console执行时scope中就只有一个全局,所以这里会是6
// 如果想要输出不同的值,那么可以利用一个立即执行函数,传入参数,利用实参在VO中的赋值的特点,来把变量保存住,console可以通过作用域链寻找
// var 变为 let 结果又是多少?为什么
/// 0 0 0 0 1 2 ,let声明的变量只在它所在的代码块有效。for循环使用let相当于加了一层作用域,console可以在这个作用域中找到值

dom元素操作

  • 如何获取一个dom对象
    获取一个使用document.getElementById('id名') id值是独一无二的 或者使用querySelector(‘css选择器’) 还可以使用dom对象的一些方法

获取一个集合的话有以下方法:document.getElementByTagName('标签名') document.getElementByClassName('类名') querySelectorAll(‘css选择器’)

获取和某个对象有关系的dom对象

父节点:parentNode
第一级所有子节点:children```` 第一个子节点:firstElementChild 最后一个子节点:lastElementChild 前一个兄弟节点:previousElementSibling 后一个兄弟节点:nextElementSibling```

  • 如何获取指定dom的指定属性

element.getAttribute("target")

  • 如何获取指定dom的指定样式

window.getComputedStyle(element,null)["target"]
ie8以下obj.currentStyle[name]

  • 如何获取指定dom的生效样式

window.getComputedStyle(element,null); 包括了内联样式、嵌入样式和外部样式。
ie8以下obj.currentStyle

element.style 只有内联样式

posted @ 2021-01-24 19:24  不吃苦瓜^  阅读(72)  评论(0编辑  收藏  举报