美文网首页
JS中的一些坑

JS中的一些坑

作者: Leondt | 来源:发表于2018-06-25 15:34 被阅读0次
  1. 牛客网上的一个题:
var arr=[{a:1},{}];
arr.forEach(function(item,idx){
    item.b=idx;
});

执行完上面代码后,arr 的值是?

觉得 forEach 方法中的 item 参数是按值传递,所以不会改变原来的 arr,答案为:[{a:1},{}] 。正确答案是:[{a:1, b:0},{b:1}] 。这里忽略了一个重要的点,即函数参数虽然是按值传递,不是按引用传递,但是基本类型和引用类型本身的差别被忽略了。

基本类型占用的内存空间不大,所以把变量 a 赋给 b,是把 a 的值拷贝一份给b,a、b 所在的内存空间是独立的,所以修改 a 不会影响 b:

var a = 1;
var b = a;
a = 2;
a; // 2
b; // 1

但是引用类型就不一样了,因为引用类型存储的内容可能很多,比如将对象 a 赋值给对象 b,如果是简单拷贝一遍内容,可能会带来很大的内存开销,所以这种情况,对象a 和 b 实际上指向同一个内存空间,赋值操作实际上是将 a 的内存地址复制一份给 b,所以 a 对象的属性改变也会影响到 b 对象:

var obja = {
  a: 1,
  b: 2
}
var objb = obja
obja.a = 2;
obja; // {a:2, b:2}
objb; // {a:2, b:2}

那么就很好理解啦,forEach 中的参数 item 如果是一个引用类型,就要警惕啦,虽然是按值传递,但是传递的值是内存地址。

相关文章

  • JS中的一些坑

    牛客网上的一个题: 执行完上面代码后,arr 的值是? 觉得 forEach 方法中的 item 参数是按值传递,...

  • js类型转换

    记录一些常见的坑 js中的6个假值 https://www.jb51.net/article/122992.htm...

  • iOS中UIWebView与WKWebView、JavaScri

    前言 在前面的文章中,我们介绍了UIWebView、WKWebView一些使用,与JS的交互和一些坑,相信看过的小...

  • js面试中的坑

    21、如何判断一个对象是否属于某个类? 使用instanceof if(a instanceof Person){...

  • this梳理

    JS中的this真的很坑,这篇文章仅用来梳理一些常见的知识点和疑问。首先,先列出this的一些关键的理解点: th...

  • gradle跳坑指南

    下载了一个Auto.js的项目, 在build的过程中遇到各种问题, 特此记录遇到的一些坑 Could not f...

  • 第二章 this call apply

    this this是js中很坑的地方,如下面的程序: 另外一个例子: this丢失现象:在一些框架里,经常会出现下...

  • JavaScript中的this的指向问题

    JavaScript中的this总是让人迷惑,应该是js众所周知的坑之一。 个人也觉得js中的this不是一个好的...

  • Node.js异步机制造成的坑

    Node.js所有程序都是异步执行的,导致程序执行的过程中可能会有一些坑的存在。 比如如下一段代码: 此段代码中i...

  • 微信公众号支付开发-JSSDK

    最近微信网页开发要用到公众平台支付的功能,过程中坑不少。 引入js 在需要调用JS接口的页面引入如下JS文件(支持...

网友评论

      本文标题:JS中的一些坑

      本文链接:https://www.haomeiwen.com/subject/hisyyftx.html