js赋值运算的理解

时间:2023-03-08 17:08:51

简介

  1. js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用

    ps:直接量:直接值数字字符串等
  2. 为什么使用len = doms.length; 里的len效率要比doms.length高

js赋值运算的理解

我们先来看一个例子

var parent = {
x : 1,
y : 2
};
var child = parent;
child.x = 3;
console.log( parent.x ); //=>3

从上面这个例子可以看出,当把parent赋值给child的时候并不是把parent克隆一份然后再赋值给child,实则child只是parent的一个引用

而直接量可以这么解释

看例子:

var parent = 5;
var child = parent; //也可以说是把parent的引用赋值给child
child = 3; // 但是这里的 直接量3的引用把parent的引用给覆盖了 而其实parent也是引用这个直接量
console.log( parent ); //=>5

那有人可能会举这样的例子

var parent = 5;
var child = parent;
child.x = 2;
console.log( parent.x ); //=>undefined

说这里总是没有把paient的引用给覆盖了,而只是给child加了一个属性,那么为什么parent.x 为 undefined 呢?这里你可能要去看一下我之前的一篇博客了关于js的包装对象

为什么使用len = doms.length; 里的len效率要比doms.length高

因为使用 getElementsByTagName函数获取到的doms是一个动态的伪数组,length属性是一个动态计算的。所以当每次使用doms.lenth的时候都进行了一次计算,而把doms.length赋值给len以后 len存的是计算的结果,是一个直接量,故效率肯定高。

其它还有一些使用赋值运算会使效率提高,因为变量里放的是计算过后的结果,如:

  • var div = document.geElementById('div'); //此类的获取元素 div获得了直接的引用,下回就不用再由getElementById来计算引用

那么如果我们要copy一份第一个例子中的对象该怎么办?

遍历对象所有属性和方法,一一把属性方法复制过去

var parent = {
x : 1,
y : 2
};
var child = {};
for( var i in parent ){
child[i] = parent[i];
}

而child.x 引用的直接量是parent.x而parent.x引用的直接量是1,所以它们引用同一个直接量,是不是有点绕,哈哈