JavaScript的赋值深坑

以前学C++的时候(大学时代),对传参时印象深刻的是,传的值是值还是值的地址.

之后学JavaScript的时候,发现不用理会那么多,虽然不严谨,但是用起来很便捷,比如说类型转换呀,啥的简单多了.....

可是最近几天就遇到了坑...

先上代码:

[]===[]  // false
[]==[]   // false

上面的代码是用来判断是否为空数组用的.不巧的是,结果如大家看到的,起初我以为是JavaScript的bug,也就不以为然.因为JavaScript的坑还是挺多了,而且之前也有大概的例子,如下:

表达式
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

所以,也就没有多放在心上.....大胆的继续前行去了~~

可是最近又遇到了一个问题,是创建二维数组的时候:

    !function matrixAddition() {
        var temAry = [],
                newAry = [],
                i,
                j;
        for (i = 3; i--;) {
            for (j = 2; j--;) {
                temAry[j] = i + j;
            }
            newAry.push(temAry);
//            temAry =[];
            console.log("tem : "+temAry);
            console.log("new : "+newAry.join(","));

        }
        return newAry;
    }();
    
    结果是
    tem : 2,3 
    new : 2,3 
    tem : 1,2 
    new : 1,2,1,2 
    tem : 0,1 
    new : 0,1,0,1,0,1 
    
    
    
    如果把注释去掉后,结果就正常了
    正确的结果
    tem :  
    new : 2,3 
    tem :  
    new : 2,3,1,2 
    tem : 
    new : 2,3,1,2,0,1

为啥把temAry赋值空就没事了...而且这里也不存在闭包作用域的影响..

答案是:

其实赋值的时候,并不是赋值,而是赋了地址,原因是array是一个对象.

首先JavaScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的.

但用简单类型赋值的时候的确给的是值,而在用其他类型赋值的时候,则是给地址.

这也就顺利成章的说明了 为什么[]==[].

题外话:果然我基础还是不扎实,决定从新看一遍<<JavaScript高级编程>>去,最近弄node太多了,JavaScript都落下了~

时间: 2024-12-19 20:26:06

JavaScript的赋值深坑的相关文章

javascript数组赋值操作的坑

描述:数组对象赋值,即arr1=[{},{},{}]这种数据结构的对象赋值,将arr1赋值给arr2:然后删除arr2里的元素 一.最常用的= arr2 = arr1; detect(val) { let temp = []; let self=this; temp = self.tableBaseStorage; //这个tableBaseStorage是data(){return{}}全局变量 console.log("tableBaseStorage"); console.log

在Web API中使用Swagger-UI开源组件(一个深坑的解决)

介绍: Swagger-Ui是一个非常棒的Web API说明帮助页,具体详情可自行Google和百度. 官网:http://swagger.io/    GitHub地址:https://github.com/swagger-api/swagger-ui 使用: Swagger-Ui是一个用纯前端语言开发的项目,所有强大的功能全靠JS实现.为了能在.Net的Web API项目中使用,我们借用domaindrivendev开发的Swashbuckle进行配置.配置方法如下: 1.在Nuget中安装

javascript数组赋值操作

最近在司徒正美的<javascript框架设计>,在里面发现了一个段代码 1 ...... 2 3 var _len = arr1.length; 4 while (_len) { 5 arr2[--_len] = arr1[_len]; 6 } 7 8 ...... 这是一个数组间赋值的操作,咋一看,之前还没碰到这样的写法.平时我个人都是这样写的. 1 function assignment2(arr1, arr2) { 2 for (var i = 0,_len = arr1.length

拒绝深坑!记录找了多半天时间的C++编译失败的错误

采用新的源码,和原来的服务改动也不是很大,但是拒绝深坑啊,找了半天以为是源码的问题,结果倒好原来是环境的问题,还是要感谢一个神一样的人物的帮助 编译的时候一直出现undefined reference to 的bug,看网上的帖子一边倒的是引用的函数没加载进来,一直找是源码说的继承的问题,funk 结论是!!!: 环境里生成的动态链接库有三个,Makefile里面引用的有旧的!!! so, 果断删除!解决战斗!编译通过,完毕!

OSChina 周四乱弹 —— 人生处处是深坑

当年说要一起建设大深圳的小伙伴们陆陆续续地回老家了,而且他们的理由都是一样的: @梦朝思夕:问题是钱没有赚足 也没过到想要的生活 你们身边有没有这样的朋友呢?生活还是要积极地去面对,不要以为自己碰到点挫折就能看清生活啊 生活处处都是坑,比如说老公坑老婆的 @小编辑:我:老公,你嫌我丑不? 本以为老公会说:宝贝一点都不丑. 结果瞅了瞅我扔下俩字:不嫌... 老婆坑老公的 和我老公吵架,回娘家,现在俺学聪明了,什么带存折,衣服的都弱爆了. 我把空调遥控,电视机遥控,电脑设上开机密码,wifi密码改掉

android MultiDex multidex原理原理下遇见的N个深坑(二)

android MultiDex 原理下遇见的N个深坑(二) 这是在一个论坛看到的问题,其实你不知道MultiDex到底有多坑. 不了解的可以先看上篇文章:android MultiDex multidex原理(一) 解决和遇到的其它问题,请见下一篇文章:android MultiDex 原理下超出方法数的限制问题(三) 遭遇multidex 愉快地写着Android代码的总悟君往工程里引入了一个默默无闻的jar然后Run了一下~~~~ 经过漫长的等待AndroidStudio构建失败了. 于是

【Unity笔记】Terrain地形制作坍塌/深坑

Unity的Terrain组件在[set the terrain height]分页下,height高度为0时,可理解为该地形的海平面高度,此时就不能地形下榻.把height调到100,点击[flatten],然后就能做地形下榻,深坑的深度最多即可达到100. 学习资料: http://www.maiziedu.com/course/540-7397/

JavaScript的兼容小坑和调试小技巧

JavaScript作为一种弱类型编程语言,入门简单,只要稍微注意一下IE方面的兼容性,就可以很好的使用它. 本文主要是对IE兼容的小坑和调试的小技巧进行举例分析,并给出解决方法. 1.var str: 与 var str = "":的区别 1 <script> 2 var Str1; 3 for (var i = 0; i < 3; i++) 4 { Str1 += "xxx" } 5 alert(Str1); 6 var Str2 = &quo

javascript中所谓的“坑”收录

坑一: // 反例myname = "global"; // 全局变量function func() { alert(myname); // "undefined" var myname = "local"; alert(myname); // "local"}func(); 理解:JavaScript中,你可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置