js基础 之 引用类型
引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,用于将数据和功能组织在一起
对象是某个特定引用类型的实例。新对象是使用new操作符后跟一个构造函数来创建的。构造函数本身就是一个函数,只不过该函数是用于创建新对象的目的而定义的,
·Object类型
目前为止,我们看到的大多是引用类型都是Obejct类型的实例。
var person = {name:'xx'}; 通过这种对象字面量定义对象时,实际上不会调用Object构造函数
·Array类型
·Date类型
·RegExp类型
·Function类型
函数很有意思,函数实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定
将函数理解为指针,也有助于理解为什么ECMAScript中为什么没有函数重载的概念。
函数声明与函数表达式:
<script>
demo1();
demo2(); //会报错
function demo1(){ }
var demo2 = function (){ }
</script>
解析器在向执行环境中加载数据时,对函数声明和函数表达式并非一视同仁。解析器会率先读取函数声明,并在其执行任何代码之前可用;至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
函数内部属性:
在函数内部,有两个特殊的对象:arguments 和 this
arguments : 它是一个类数组对象,包含着传入函数中的所有参数。虽然arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。一般是用在递归为避免与函数名耦合而使用这个属性。
this : 挡在网页的全局作用域中调用函数时,this对象引用的就是window
函数的属性和方法:
每个函数都包含两个属性 : length 和 prototype
length : 表示函数希望接收的命名参数的个数
prototype : 在ECMAScript 核心所定义的全部属性中,最耐人寻味的就要数 prototype属性了。对于ECMAScript中的引用类型而言,prototype 是保存它们所有实例方法的真正所在。换句话说,toString() 和 valueOf() 等方法实际上都保存在prototype名下,只不过是通过各自对象的实例访问罢了。在创建自定义引用类型以及实现继承时,prototype属性是极为重要的。在ECMAScript中,prototype属性是不可枚举的,因此使用for-in 无法枚举。
每个函数都包含两个非继承而来的方法: apply() 和 call() 。 这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。
·基本包装类型
为了方便操作基本类型值,ECMAScript还提供了3个特殊的引用类型:Boolean ,Number 和 String。这些类型与本章介绍的其他引用类型相似,但同时也具备与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据,
<script>
var s1 = "some text";
var s2 = s1.substring((2));
</script>
我们知道,基本类型值不是对象,因而从逻辑上讲它们不应该有方法(尽管如我们所愿,它们确实有方法)
为了让我们实现这种直观的操作,后台已经自动完成了一系列的处理。当第二行代码访问s1时,访问过程处于一种读取模式,也就是要从内存中读取这个字符串的值。而在读取模式中访问字符串时,后台会自动完成下列处理。
var s1 = new String("some text");
var s2 = s1s.substring(2);
s1 = null;
结果此番处理,基本的字符串值就变得跟对象一样了。而且,上面这三个步骤也适用于Boolean 和Number对应的布尔值和数字值
引用类型和基本包装类型主要区别就是对象的生存期。使用new 操作符创建的引用类型的实例,在执行流离开当前作用域之前一直都保存在内存中。而自动创建的基本包装类型的对象,则只存在于一行代码执行瞬间,然后立即销毁,这意味着我们不能在运行时为基本类型值添加属性和方法
var s3 = "texts";
s3.color = 'red';
console.log(s3.color); //undefined
为什么会这样?因为第二行创建的String对象在执行到第三行代码时已经销毁了。第三行代码又创建了自己的String对象,而该对象没有color属性
Object构造函数也会像工厂方法一样,根据传入值的类型返回相应基本包装类型的实例。例如
var obj = new Object("123");
console.log(obj); //String {"123"}
console.log(obj instanceof String); //true
把字符串传给Object构造函数,就会创建String的实例;而传入数值参数就会得到Number的实例,传入布尔值参数就会的带Boolean的实例。
·基本包装类型之Boolean类型
前面讨论过,布尔表达式中所有对象都会被转为true。所以我们建议永远不要使用Boolean对象,以免造成误解
<script>
var boo = new Boolean(false);
console.log(boo); // Boolean {false}
console.log(Boolean(boo)); // true
</script>
·基本包装类型之Number类型
方法:
toFixed() --- 按照指定的小数位返回数值
<script>
var num = 10.00001;
console.log(num.toFixed()); //10.00
</script>
注意 :
与Boolean类型类似,Number对象也以后台方式为数值提供了重要的功能。但与此同时,我们仍不建议直接实例化Number类型,而原因和显式的创建Boolean对象一样。具体来讲,就是在使用typeof
和instanceof 操作符测试基本类型数值和引用类型数值时,得到的结果完全不同
<script>
var num = 10.00001;
var num_2 = new Number(10.00001);
console.log(typeof num); // number
console.log(typeof num_2); // object
console.log(num instanceof Number ); // false
console.log(num_2 instanceof Number ); // true </script>
·基本包装类型之String类型
方法 :
slice()
substring()
substr()
indexOf()
push()
trim()
-------------------单体内置对象
ECMA-262对内置对象的定义是:youECMAScript实现,不依赖宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了。意思是说,开发人员不必显式的实例化内置对象,因为它们已经实例化了。前面我们已经介绍了大多数内置对象,例如Object , Array 和String 。ECMA-262还定义了两个单体内置对象:Global 和Match
·Global
Global(全局)对象可以说是EECMAScript中最特别的一个对象了,因为不管你从什么角度看,这个对象都是不存在的。它在某种意义上是作为一个终极‘兜底儿’对象。
换句话说,不属于任何其他对象的属性和方法,都是Global对象的属性和方法。事实上,没有全局变量或全局函数;所有在全局作用域定义的属性和函数,都是Global对象的属性。前面
介绍过的那些函数,诸如 isNaN() , parseInt() 实际上都是Global对象的方法。
Global对象还包含一些属性。例如:特殊值undefined,NaN 以及Infinity都是Global对象的属性。此外,所有原生引用类型的构造函数,像Object和function , 也都是Global对象的属性
ECMAScript严禁给undefined ,NaN 和 Infinity赋值,这样做即使在非严格模式下也会导致错误。
·window对象
ECMAScript 虽然没有指出如何直接访问Global对象,但Web浏览器都是将这个全局对象作为window对象的一部分加以实现的。因此,在全局作用域中声明的所有变量和函数,都成为了window对象的属性
注 : js中window对象除了扮演ECMAScript规定的Global对象的角色外,还承担了很多别的任务。详阅js高程第八章
js中,在没有明确给定this值的情况下,this 就是指向window对象
·Math对象
该对象是进行高级数学运算的对象,此处不再赘述
js基础 之 引用类型的更多相关文章
- js 基础数据类型和引用类型 ,深浅拷贝问题,以及内存分配问题
js 深浅拷贝问题 浅拷贝一般指的是基本类型的复制 深拷贝一般指引用类型的拷贝,把引用类型的值也拷贝出来 举例 h5的sessionStorage只能存放字符串,所以要存储json时就要把json使用 ...
- 前端面试题目汇总摘录(JS 基础篇)
JS 基础 JavaScript 的 typeof 返回那些数据类型 object number function boolean undefined string typeof null; // o ...
- day51 JS基础
复习 1.字体图标 用i标签, 设置类名, 与第三方字体图标库进行图标匹配 <link rel="stylesheet" href="font-awesome-4. ...
- js基础梳理-关于this常见指向问题的分析
首先,依然回顾<js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?>中的 3.执行上下文的生命周期 3.1 创建阶段 生成变量对象(Variable object, ...
- js基础知识点收集
js基础知识点收集 js常用基本类型 function show(x) { console.log(typeof(x)); // undefined console.log(typeof(10)); ...
- 前端工程师面试问题归纳(一、问答类html/css/js基础)
一.参考资源 1.前端面试题及答案整理(一) 2.2017年前端面试题整理汇总100题 3.2018最新Web前端经典面试试题及答案 4.[javascript常见面试题]常见前端面试题及答案 5.W ...
- js基础 js自执行函数、调用递归函数、圆括号运算符、函数声明的提升 js 布尔值 ASP.NET MVC中设置跨域
js基础 目录 javascript基础 ESMAScript数据类型 DOM JS常用方法 回到顶部 javascript基础 常说的js包括三个部分:dom(文档document).bom(浏览器 ...
- JS基础-该如何理解原型、原型链?
JS的原型.原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对 ...
- JS基础-全方面掌握继承
前言 上篇文章详细解析了原型.原型链的相关知识点,这篇文章讲的是和原型链有密切关联的继承,它是前端基础中很重要的一个知识点,它对于代码复用来说非常有用,本篇将详细解析JS中的各种继承方式和优缺点进行, ...
随机推荐
- private、public、this关键字
private关键字 概念:私有的,一种权限修饰符,用来修饰类的成员 特点:被修饰的成员只能在本类中访问 用法: - 1. private 数据类型 变量名: - 2. private 返回值类型 方 ...
- STL-map/multimap 简述
#include <iostream> #include <cstdio> #include <map> using namespace std; int main ...
- C#中System.ServiceProgress报错
场景 在C#中检索本地计算机所有服务时,使用 System.ServiceProcess.ServiceController[] services = System.ServiceProcess.Se ...
- Dom中的一些接口
节点都是单个对象,有时需要一种数据结构,能够容纳多个节点.DOM 提供两种节点集合,用于容纳多个节点:NodeList和HTMLCollection.这两种集合都属于接口规范.许多 DOM 属性和方法 ...
- tensorflow数据集加载
本篇涉及的内容主要有小型常用的经典数据集的加载步骤,tensorflow提供了如下接口:keras.datasets.tf.data.Dataset.from_tensor_slices(shuffl ...
- webkit 技术内幕 笔记 三
浏览器内核及特性 在浏览器中,一个很重要的模块,是将页面转变成可视化的图像结果,这就是浏览器的内核,通常被称作渲染引擎.渲染:就是根据描述或者定义构建数学模型,通过模型生成图像的过程.浏览器的渲染引擎 ...
- ubuntu安装pyenv
安装依赖包 bash {.line-numbers} sudo apt-get update sudo apt-get install build-essential python-dev pytho ...
- CentOS进行yum操作时不能访问国外镜像的解决方案
1. 例如执行yum update,经常报错“Cound not resolve host: xxxxx”,一般都是yum源是使用的国外镜像,国内访问很不好.这时可以将源手动替换为国内的清华大学源,或 ...
- centos7下top free vmstat 命令详情
top:https://www.cnblogs.com/makelu/p/11169270.html
- Mariadb Galera Cluster 搭建集群
1.安装MariaDB 和Galera 见另外一篇博客 2.环境修改 2.1 防火墙和SELinux 这里不做说明,参照网上教程,和官方的配置 2.2. 创建用于节点同步的账号 [root@local ...