基本类型和引用类型,执行环境和作用域
2019独角兽企业重金招聘Python工程师标准>>>
一、理解基本类型和引用类型的值
ECMAScript变量包含两种不同数据类型的值:基本类型值 和 引用类型值。
基本类型值指的是简单的数据段,而引用类型的值指那些可能由多个值构成的对象
引用类型的值是保存在内存中的对象,javascript不允许直接访问内存中的位置,也就是不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。引用类型的值是按引用访问的,基本类型是按值访问的,因为可以操作保存在变量中的实际的值。
动态的属性
定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值。但对保存到变量的不同类型值的操作是不一样的。对于引用类型的值,可以添加,改变和删除其属性和方法,但是,不能给基本类型的值添加属性等操作。
var person = new Object(); //引用类型值
person.name = "小明";
alert(person.name); //小明var name = "小明"; //基本类型值
name.age = 25;
alert(name.age); //undefined
复制变量值
如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到新变量分配的位置上。
var num1 = 2;
var num2 = num1;
num2的值会是2,这个值只是num1的值的一个副本,与num1的值2是完全独立的,这两个变量可以参与任何操作而不会相互影响。
当从一个变量向一个变量复制引用类型的值,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中,但这个值的副本实际是个指针,而这个指针指向存在堆中的一个对象。也就是说,两个值实际上引用的是同一个对象。因此,改变其中一个变量,另一个变量也会受到影响。
var obj1 = new Object();
obj1.name= "one";
var obj2 = obj1;
alert(obj2.name); // oneobj2.name = "two";
alert(obj1.name); //two //改变了obj2.name,obj1.name也被改变
传递参数
把函数外部的值复制给函数内部的参数,就像把值从一个变量复制到另一个变量。访问变量有按值和按引用两种方式,而参数只能按值传递。
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(命名参数)。
在向参数传递引用类型的值时,会把这的值在内存中的地址复制给一个局部变量,这个局部变量发生变化会反映在函数的外部。
function add(num){num += 10;return num;
}
var count = 20;
var result = add(count);
alert(count); //20
alert(result); //30
误区:在局部作用中修改的对象会在全局作用域中反映出来,就说明参数是按引用传递的 (X)
function setName(obj){obj.name = "Tom";obj = new Object(); //重新定义对象obj.name = "Jim"; //定义不同值的name属性
}
var person = new Object();
setName(person);
alert(person.name); // Tom//即使函数内部修改了参数的值,原始引用仍然保持不变
如果person是按引用传递的,那么person就会自动被修改成为指向name属性为”Jim“的新对象,但是,在外部访问person.name时,值仍然是”Tom“
检测类型
检测一个变量是不是基本数据类型用 typeof 操作符,typeof操作符确定一个变量是字符串/数值/布尔值/undefined ,
如果变量值是一个对象或null,则返回“object”
instanceof操作符检测是个什么类型的对象,如果变量是给定引用类型对象,instanceof操作符就会返回true
A instanceof Object;
B instanceof Array;
C instanceof RegExp;
……
在检测一个引用类型值和Object构造函数时,instanceof操作符始终会返回true,当然,如果使用instanceof操作符检测基本类型的值,则该操作符始终会返回false,因为基本类型不是对象 。
二、理解执行环境及作用域
执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的一个执行环境。在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的,全局执行环境直到应用程序退出时才会被销毁。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的用途,是保证 对执行环境有权访问的 所有变量和函数 的有序访问。
var color = "blue";function changeColor(){var anotherColor = "red";function swapColor(){var tempColor = anotherColor;anotherColor = color;color = tempColor;//这里可以访问color、anotherColor、temperColor}//这里可以访问color、anotherColorswapColor();}//这里只能访问colorchangeColor();
以上代码涉及3个执行环境:全局环境,changeColor()的局部环境和swapColor()的局部环境。内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境的任何变量和函数。这些环境之间是有次序的,每个环境都可以向上搜索作用域链,以查询变量和函数名,但任何环境都不能通过向下搜索作用域链而进入另一个执行环境。
延长作用域链
当执行流进入下列任何一个语句时,作用域链就会得到加长:
◇ try-catch 语句的 catch 块
◇ with 语句
这两个语句都会在作用域链的前端添加一个变量对象,对with语句来说,会将指定的对象添加到作用域链中。对catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。
详细说明
javascript没有块级作用域
◇声明变量
function add(num1,num2){var sum = num1 +num2; //局部变量return sum;}var result = add(10,20);alert(result); //30alert(sum); //访问错误
虽然结果值从函数返回,但变量sum是局部变量,函数外部是访问不到的。若不用 var声明,那么sum自动加入全局环境,这样一来外部可以访问。
◇查询标识符
查询与给定名字的标识符,如果在局部环境中找到了该标识符,搜索过程停止,如果在局部环境中没有找到,则沿作用域向上搜索。直到找到为止。
var color = "blue";function getColor(){var color = "red";return color;}alert(getColor()); //red
转载于:https://my.oschina.net/bigfunny/blog/658371
基本类型和引用类型,执行环境和作用域相关推荐
- Javascript高级程序设计——基本类型和引用类型的值
ECMAScript中的变量有两种不同的数据类型的值: 基本类型:基本类型的值是简单的数据段.包括:Undefined.Null.Number.Boolean.String五种 引用类型:引用类型的值 ...
- java面向对象(类与对象,局部变量成员变量,基本类型和引用类型作为参数传递)...
一.类和对象的区别 类是对某一类事物的抽象描述,而对象用于表示现实中该类事物的个体 可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系.类用于描述 ...
- Java Native Interface 二 JNI中对Java基本类型和引用类型的处理
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 Java编程里会使用到两种类型:基本类型(如 ...
- javascript变量中基本类型和引用类型的详解解读
前言: Javascript语言中的变量和其他语言的变量有很大区别,javascript松散类型的本质,决定了它只是在特定时间时间保存特定值得名字而已.由于不存在定义某个变量必须保存何种数据类型值的规 ...
- JavaScript执行环境及作用域(一)——执行环境栈和作用域链机制
2019独角兽企业重金招聘Python工程师标准>>> 执行环境是JavaScript中最为重要的一个概念,每个执行环境都有一个与之关联的变量对象,执行环境中所有的变量和函数都保存在 ...
- 基本类型和引用类型的值 函数的传递参数
ECMAScript中函数的传参都是按值传递的. 不管是传基本类型的值还是引用类型的值都是按值传递,访问变量则分按值和按引用两种方式. 向参数传递基本类型的值 被传递的值会被复制(对应文章<基本 ...
- 闭包、执行环境、作用域链
闭包是指有权访问另一个函数作用域中的变量的函数,创建的常见方式就是在一个函数内部创建另一个函数. 我们来理解下执行环境和作用域链: 1.执行环境有全局执行环境和函数执行环境之分. 2.每次进入一个新的 ...
- javaScript执行环境、作用域链与闭包
一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...
- javascript中基本类型和引用类型的区别分析
大多数人系统学习过的程序设计语言,在这些语言的学习过程中最早学到的几个要点之一就是值类型和引用类型的区别.下面我们来看一下在 JavaScript 中基本数据类型(Primitive Types)和引 ...
- JavaScript基本类型和引用类型
目录 介绍 背景 JavaScript数据类型 基本类型 基本类型的行为如何? 使用typeof运算符 语法类型 为什么null返回对象? 参考类型 创建对象 对象的行为如何? 销毁对象 基本类型和引 ...
最新文章
- linux nginx php 目录权限,Nginx环境中配置网站目录权限设置
- python从入门到精通怎么样-Python 从入门到精通:一个月就够了
- python重复import_Python module重复载入的问题
- RHCS套件实现高可用负载均衡集群(一)
- 赛博朋克世界的声景塑造 — 以游戏《底特律:成为人类》为例 (第一部分)
- 快速的找出元素是否在list中 python
- 读取本地图片存入数据库
- 新泽西州男子因无牌运营比特币交易所或面临5年监禁
- 看完这篇 HTTP,跟面试官扯皮就没问题了
- ZooKeeper学习第一期---Zookeeper简单介绍
- 冒险岛单机版mysql_冒险岛单机版
- U磁盘检测和大量收集量产工具
- 【按键精灵手机助手】将变量和文字合并为一个字符串并打印输出
- 人机交互期末复习要点
- spark graphx的Triangle三角形计数算法使用示例
- 佳沛奇异果猕猴桃扫盲
- python实现四种基本图形的面积计算 :圆形,长方形,正方形,梯形。
- Ubuntu 18.04使用百度网盘笔记
- Web网站HTML打开QQ聊天窗口示例
- Tello无人机的使用笔记之dji-sdk/Tello-Python
热门文章
- java虚拟机内存存储一个对象_java虚拟机在java堆中对象内存分配、布局、访问
- java打包----“Artifacts”
- 知识图谱构建工具_自动构建知识图谱
- Ubuntu系统 -- 初始化配置与基础操作
- 2dpsk调制解调实验matlab_贼详细的8PSK调制与解调详细过程
- 关于动态规划的一点学习感想
- 前端技术栈---Vue(1)安装与初始化
- CSS3学习笔记--line-height:150%与line-height:1.5的真正区别
- AngularJS开发指南6:AngularJS表单详解
- 本地上支持apache多站点访问