1.20面试题复习
考察隐式类型转换,下面if为真的有哪些
if([])
if({})
if([]==false)
if({}==false)
- 第一个为真,
[]
会被转换成true- 第二个为真,
[]
会被转换成true
在if中单独会被转换成false的情况
- 数字0
- NaN
- 空字符串
- null或undefined
- 第三个为真 []先使用valueof转换成[] 再使用toString转换成空数组
- 第四个为假 {}先使用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 只有内联样式