1、怎么实现不用i取到abcd的值
let arr = [{a: 1, i: {b: 2, c: 3, d: 4}}];
答案:
使用ES6的解构赋值
let [{a, i:{b, c, d}}] = arr;
console.log(a, b, c, d) // 1 2 3 4
2、使用typeof bar ===“object”来确定bar是否是一个对象时有什么潜在的缺陷?这个陷阱如何避免?
答1:typeof运算符对基本数据类型可以输出其类型本身的字符串值,但是typeof对null的判断是有bug的,会返回object,以及数组也是会返回object。要避免这个缺陷,可以添加一下判断:
if(typeof bar === "object" && typeof bar !== null && !Array.isArray(bar))
完整的示例:
let bar = {};
if(typeof bar === "object" && typeof bar !== null && !Array.isArray(bar))
{
alert("bar是一个对象")
}
3、下面的代码将输出到控制台的是什么,为什么?
(function(){
var a = b = 3;
})();
console.log("a defined? " + (typeof a !== 'undefined'));
console.log("b defined? " + (typeof b !== 'undefined'));
答:
先输出false,然后输出true,在立即执行函数里边,函数运行完之后,函数作用域里的变量就会被销毁。
但是这里的立即执行函数包含了一个连续赋值的表达式,首先声明了一个a变量,它是在函数作用域的;
然后再声明一个b变量,它没有使用var以及其它关键字声明,所以它是属于全局变量。
当函数执行完之后,a就被销毁了,而b还存在全局作用域中,所以当执行typeof a 的时候,返回undefined(因为typeof的安全机制,即使a不存在也不会报错);typeof b返回字符串的number。
4、下面的代码将输出到控制台的是什么?,为什么?
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
(function() {
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}())
}
}
myObject.func();
答:
依次输出:bar, bar , undefined, bar;
因为在myObject.func()里,它的this是指向调用它的对象myObject所以执行this.foo的时候,输出的是myObject的foo:bar。
因为self = this,所以self也是指向myObject,那么self.foo肯定也是输出bar。
后面的立即执行函数,它的this是指向全局window,this.foo,等于: window.foo,然而window中没有这个方法,所以返回undefined。
在立即执行函数里边执行self.foo时,这里的self就是函数func作用域里的self,它是指向myObject的,所以会输出bar。
5、考虑下面的两个函数。他们都会返回同样的值吗?为什么或者为什么不?
function foo1()
{ return {
bar: "hello"
};
}
// 注意这里的return的后面是换行的
function foo2()
{ return
{
bar: "hello"
};
}
答:foo1返回的是一个对象,foo2返回的是undefined,在JavaScript中,一个函数如果没有显式定义return的内容,那么引擎会自动为函数添加一个return语句,并且值为undefined;如果只写了return ,没有指定任何值,那么返回的也是undefined。在这道题中,foo2的return语句后面没有跟着任何内容,所以会返回undefined。