变量的值

news/2025/2/12 18:51:26

ECMAScript 的变量是松散类型的,也就是说可以保存任何类型的数据。数据的类型分为简单数据类型和复杂数据类型。简单数据类型有: Undefined、Null、Boolean、Number和 String;复杂数据类型只有一种,就是Object。在将一个值赋值给变量时,解析器会确定值的类型。如果是简单类型,直接保存在变量中,如果是复杂类型,则把值保存在内存中,而把值的引用保存在变量中。也就是说变量的值有两种:简单的数据类型的值或者复杂数据类型的引用。因此,在操作变量时,就会有所不同。

1、添加属性

变量的值是复杂数据类型时,可以简单的为其添加属性。这个很容易理解,而当变量的值是某些简单的数据类型时,为其添加属性也不会报错,但之后却不能访问,如下:

 
var person= "xiaoming";
name.age = 27;
alert(name.age); //undefined

这是因为JavaScript引擎在处理添加属性的代码时,会在内部临时创建一个对应包装类型(这里是String类型)的临时对象, 并把对基本类型的操作代理到对这个临时对象身上,但在操作完成之后,临时对象就扔掉了,下次访问时,重新建立新的临时对象,添加的属性并不会 保存。有时,在代码中直接调用基本数据类型的方法的方法也是同样的道理。因此,只能给复杂数据类型的值添加属性。

2、赋值变量的值

从一个变量向另一个变量复制值时,会为新的变量分配位置,然后把变量的值复制到该位置上。不管变量的中保存的是基本数据类型的值,还是复杂数据类型的引用,都是直接把变量中保存的值直接赋值并保存到新的位置上面。

简单的数据类型很好理解,复杂的数据类型可以参照下图:
图片描述

变量obj2复制的是obj1中保存的对象的引用,复制之后,obj1和obj2中分别保存一个指向该对象的引用。

3、传递参数

ECMAScript 中所有函数的参数都是按值传递的。也就是说在传递参数时,实际上就是把变量中保存的值复制了一遍,保存在对应的参数中,从而变成了函数内部的一个变量。这时,需要注意的一点时,对于简单的数据类型,新的变量(参数)和外部的变量已经没有联系了。而对于复杂数据类型,因为两个变量中保存的都是对象的引用,因此两个变量还是仅仅联系在一起的,如下:

var a = 3;
var o = { name:'xiaoming' };
function fn(obj, num){num += 10;o.name = 'hh';return num;
}
var res = fn();alert(res);     //13
alert(a);     //3
alert(o.name); //'hh'

4、检测类型

正如开头说的变量是松散的,为了确保代码可以正确的执行,很多时候都需要检测变量值的类型。变量的值是简单的数据类型时(null除外),只需要使用typeof操作符,就可以很简单的检测出来。但变量的值是复杂数据类型的引用时,就有点麻烦了,使用typeof始终只会返回‘object’。如果知识简单的检测,可以使用 instanceof 操作符。使用如下:

res = obj instanceof constructor

只要变量是给定复杂数据类型的实例,那么instanceof 操作符就会返回 true。需要说的一点是, 所有复杂数据类型的值都是 Object 的实例,使用这个操作符检测是不是Object构造函数的实例时,都会返回true。

使用这种方式检测在大多数情况下都是没有问题的,但当页面的中存在嵌套的框架或者在一些特殊的浏览器中就会出现问题。例如,在一个frame中定义了一个数组arr,而在最外层的window环境中检测,就会返回false。为了确保检测结果的正确,可以使用Object原声的toString方法,对于任何的复杂数据类型,这个方法都会返回“ [object NativeConstructorName]”格式的字符串,例如:

Object.prototype.toString.call([])          //"[object Array]"

https://dhexx.cn/news/show-3089414.html

相关文章

lnmp一键安装包 mysql,LNMP一键安装包-自动编译安装Nginx MySQL PHP memcached

适用环境:系统支持:CentOS-5 (32bit/64bit)、CentOS-6 (32bit/64bit)内存要求:≥128M安装了什么:1、Nginx-1.0.92、MySQL 5.1.593、PHP 5.2.174、ZendOptimizer 3.3.95、phpmyadmin 3.4.76、xcache-1.3.2(可选)7、memcached-1.4.9…

Java -verbose[:class|gc|jni] 转 ----JAVA源码分析

http://blog.csdn.net/tenderhearted/article/details/39642275 http://www.cnblogs.com/iceAeterNa/p/4876940.html 1.java -verbose:class 在程序运行的时候究竟会有多少类被加载呢,一个简单程序会加载上百个类的!你可以用verbose:class来监视&#xf…

与客户端对接用户信息的保存方式

在日常开发中,少不了与客户端进行通信,然而一些用户数据是怎么保存比较好的呢1.保存在服务器端 传给客户端sessionid ,客户端每次之后每次请求都需要传入该sessionid,服务器验证//调用httpPost.setHeader("Cookie", "JSESSIONID2F6161971…

php hr标签,hr - HTML 开发手册 - php中文网手册

HTML 标签 实例 当内容的主题发生变化时,使用 标签进行分隔: HTML HTML is a language for describing web pages..... .....HTML 标签实例html>php中文网(php.cn)HTMLHTML 是用于描述 web 页面的一种语言。CSSCSS 定义如何显示 HTML 元素。运行实例 …

8、非root权限下安装perl以及perl模块

转载:http://www.cnblogs.com/nkwy2012/p/6418669.html 转载自http://www.zilhua.com 在本博客中,所有的软件安装都在服务器上,且无root权限。理论上适合所有的用户。 我的安装目录 cd /home/zilhua/software 1、在官方网站下载新版本的源码包…

浏览器验证jre

为什么80%的码农都做不了架构师?>>> http://java.com/zh_CN/download/testjava.jsp 转载于:https://my.oschina.net/cccyb/blog/864561

linux php ldap 安装配置,linux下 ldap安装及使用

安装ldap:yum install -y openldap openldap-servers openldap-clients openldap-devel配置ldap:cd /etc/openldap/cp /usr/share/openldap-servers/slapd.conf.obsolete ./slapd.conf执行下面命令创建密文密码:slappasswd{SSHA}KxwI67Nyx7Dc…

oracle 10g 11g 12c区别

oracle 10g 11g 12c区别 转载于:https://www.cnblogs.com/xiaojianblogs/p/7446487.html

php 输入框默认值,php – nicEdit textarea的默认值

这是一个代码if (isset($_POST[flag])) {$lengthstrlen(trim($_POST[area]));echo "Length of abstract : ".$length;if (!strlen(trim($_POST[area]))){$abstractErrorMsg "Please enter the abstract of your article";echo $abstractErrorMsg;}}?>…

docker 实践(一)

docker 简介 容器虚拟化,比传统的虚拟化轻量2013年出现,发展非常迅猛Redhat在6.5版本开始支持docker使用go语言开发,基于apache2.0协议开源软件,项目代码在github维护容器虚拟化和传统虚拟化比较Docker的优势启动非常快&#xff0…