js赋值运算的理解
简介
- js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用
ps:直接量:直接值数字字符串等 - 为什么使用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,所以它们引用同一个直接量,是不是有点绕,哈哈
js赋值运算的理解的更多相关文章
- 一道JS 连续赋值运算的问题
原文链接:https://www.cnblogs.com/joesbell/p/6229423.html <script> var a = {n:1}; var b = a; a.x = ...
- PHP赋值运算
1. 赋值运算:= ,意思是右边表达式的值赋给左边的运算数. $int1=10; $int1=$int1-6; //$int1=4 echo $int1,"<br>"; ...
- C++中的构造函数,拷贝构造函数和赋值运算
关于C++中的构造函数,拷贝构造函数和赋值运算,以前看过一篇<高质量C++/C编程指南>的文章中介绍的很清楚,网上能搜索到,如果想详细了解这方面的知识可以参看一下这篇文章. 常见的给对象赋 ...
- 对js原型简单的理解和图解
对js原型简单的理解和图解 最近在努力的学习js中,今天就抽了个空把自己理解的原型,记下一下在笔记中,以后自己查看,有空在会把原型链记录一下. 1.prototype prototype:是一个函数的 ...
- Java 基础【06】复合赋值运算
这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨. 嗯,好了.先看一段源代码 short value=2; value-=2; 源码就是上面这个样子的,我动手写的时候因为理解的问题 ...
- js连续赋值,你理解了吗
看一道有意思的题,也许你会自信满满地写下答案,会是正确的吗? }; var b = a; a.x = a = {n: }; console.log('a',a); console.log('b',b) ...
- python基础之赋值运算
之前的文章说明了变量的三大组成部分,详细说明了变量名与变量值,但是对于赋值这一块介绍相对较少,今天就来对这一部分进行补充,除了egon老湿所讲之外,本喵还参阅了<python3-cookbook ...
- 《剑指offer》面试题1:赋值运算函数
面试题1:赋值运算函数 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数 class CMyString { public: CMyString(char* pData = NU ...
- js参数arguments的理解
原文地址:js参数arguments的理解 对于函数的参数而言,如下例子 function say(name, msg){ alert(name + 'say' + msg); } say('xiao ...
随机推荐
- Android课程---关于Service的学习(后台运行)
MainActivity.java package com.hanqi.test2; import android.content.ComponentName; import android.cont ...
- GridControl读取xml和保存xml
using DevExpress.XtraGrid;// ...string fileName ="c:\\XtraGrid_SaveLayoutToXML.xml"; priva ...
- You are attempting to run the 32-bit installer on a 64-bit version of Window
您正试图在64位版本的窗口中运行32位安装程序. 系统有32位操作系统和64位操作系统的分别,相同的软件的安装也需要区分操作操作系统的位数. 解决办法:查看自己系统类型,根据类型下载安装相应位数的软件 ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- ajax的使用:例题、ajax的数据处理
需要注意的是,调用的封装的数据库,和jQuery的保存地址 一.注册 (1)写文本框来进行用户名的验证 <input type="text" id="uid&quo ...
- tornado 学习笔记9 Tornado web 框架---模板(template)功能分析
Tornado模板系统是将模板编译成Python代码. 最基本的使用方式: t = template.Template("<html>{{ myv ...
- jQuery 2.0.3 源码分析 Deferred概念
JavaScript编程几乎总是伴随着异步操作,传统的异步操作会在操作完成之后,使用回调函数传回结果,而回调函数中则包含了后续的工作.这也是造成异步编程困难的主要原因:我们一直习惯于“线性”地编写代码 ...
- 小谈MVC 模式
MVC (Modal View Controler) 本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使 ...
- Python第一天 - list\字符串截取
(一)list截取L =['Adam', 'Lisa', 'Bart'] print(L[0:3]) ======>['Adam'(idnex:0), 'Lisa'(index:1), 'Bar ...
- 前端学PHP之面向对象系列第三篇——三大特性
× 目录 [1]封装 [2]继承[3]多态 前面的话 php面向对象编程的三大特性是封装性.继承性和多态性.本文将介绍php的这三大特性 封装 封装就是把对象中的成员属性和成员方法加上访问修饰符( p ...