JavaScript(四)

本文深入探讨JavaScript编程中常见的技巧与潜在陷阱,包括ES6解构赋值、对象类型判断、作用域与变量生命周期、this上下文及函数返回值等关键概念。通过具体示例,帮助读者理解并避免编程误区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值