为什么字符串类型可以调用构造函数String的方法,却又不是它的实例
从所周知,在js中定义一个字符串我们有两种办法:
var a = new String("a");
var a = "a";
第一种方法使用构造函数创建,作为String的实例,自然可以使用 String原型的方法,这个我们不讨论。
第二种方式,给变量a赋值一个原始类型string,它也可以使用String原型的方法,甚至也包含__proto__这个属性,那么看来原始类型string也是一个对象,也是String的实例咯?然而事实是这样吗?
我们通过简单的几行代码测试一下:
console.log(a.__proto__ === String.prototype) //true
首先是a的原型指向了String的原型,OK这个挺符合预期的。
console.log(a.constructor === String) //true
然后a的constructor属性指向了构造函数String,这个也是自然,毕竟constructor就是从String.prototype继承来的。
console.log(a instanceof String); //false
什么?为什么instanceof判断却说a不是String的实例或者说是原型链的一环,instanceof不就是沿着原型链去找吗,连a.__proto__ === String.prototype都成立了啊!
不卖关子了,其实我们所见并非所得:
在读取字符串的时候会创建一个对象,但是这个对象只是临时的,所以我们称它为临时对象,学术名字叫包装对象,说它临时,是因为我们在读取它的属性的时候,js会把这个string字符串通过new String()方式创建一个字符串对象,一旦引用结束,这个对象就被销毁了。
原来如此,怪不得会出现这么诡异的现象,为了验证上面这句话的正确性,我们可以尝试给a添加一个属性,如果a是一个实例对象,那么a的属性是可以修改的。
a.b = "b"; console.log(a.b) //undefined
证明了a不是一个对象。其他的原始类型如Number、boolean也并不是一个对象,它们都是通过包装对象来调用构造函数上的方法的。
最后引用《JavaScript权威指南》里面的一句话补充一下:
其实(包装对象)在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样的。
为什么字符串类型可以调用构造函数String的方法,却又不是它的实例的更多相关文章
- go中字符串类型string的用法
示例 // 字符串类型string的用法 package main import ( "fmt" "unsafe" ) func main() { // 字符串 ...
- day006 数字类型和字符串类型的内置方法
首先,为什么要有数据类型? 对于不同类型的变量,需要用不同的数据类型去描述. 数字类型的内置方法 数据类型又分为整形和浮点型.以下所述的内置方法均适用于这两个类型. 必须掌握的方法*** 数据类型有基 ...
- Java6 String.substring()方法的内存泄露
substring(start,end)在Java编程里面经常使用,没想到如果使用不当,会出现内存泄露. 要了解substring(),最好的方法便是查看源码(jdk6): /** * <blo ...
- 多线程调用有参数的方法---c# Thread 与 Task
C#实现多线程的方式:Task——任务 简介 .NET 4包含新名称空间System.Threading.Tasks,它 包含的类抽象出了线程功能. 在后台使用ThreadPool. 任务表示应完 ...
- JS构造函数内的方法与构造函数prototype属性上方法的对比
本文的目的是让大家理解什么情况下把函数的方法写在JavaScript的构造函数上,什么时候把方法写在函数的 prototype 属性上;以及这样做的好处. 为了阅读方便,我们约定一下:把方法写在构造函 ...
- java 字符串类型String
在本质上,字符串实际上一个char类型的数组,由java.lang.String类来表示,该类具有一系列的属性和方法,提供对字符串的一些操作.除此之外,java还提供了StringBuffer类来处理 ...
- JavaScript数据类型 String字符串类型
前言 javascript没有表示单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串 字符串String是javascript基本数据类型,同时javascript也支持 ...
- js最实用string(字符串)类型的使用及截取与拼接详解
var a = '世界上最远的距离不是天涯海角'; 一.通过字符获取位置或通过位置获取字符: //指定位置返回字符console.log(str.charAt(1));console.log(str[ ...
- redis:string字符串类型的操作
1. string字符串类型的操作: 1.1. set 设置单个值 语法:set key value [EX seconds] [PX milliseconds] [NX|XX] 注: EX seco ...
随机推荐
- E-SATA接口
1.VGA接口 VGA接口就是显卡上输出模拟信号的接口,也叫D-Sub接口,其实就是显示转移的接口,比如连接投影仪.连接电视等等.从外观上讲,VGA接口是一种D型接口,上面共有15针空,分成三排,每排 ...
- CentOS6 设置AliNetflow 环境
CentOS6 设置AliNetflow 环境 Install OS 这一步略过. 只要保证操作系统是CentOS6.4 并且网络通畅 Install Python2.7.8 设置YUM 我的网络环境 ...
- test markdown 写博客
欢迎使用 Cmd Markdown 编辑阅读器 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,Cmd Markdown 是我们给出的答案 -- 我们为记录思想 ...
- anaconda是个啥?
Anaconda具有跨平台(win/mac/linux).包管理(类似于pip).环境管理(类似于virtualenv)的特点,因此很适合快速在新的机器上部署Python环境 Anaconda利用工具 ...
- android 加密手机完毕后待机两分钟出现有频率的杂音
这个音效是code里面主动加的,是为了提醒end user输入PIN的一个提示音,也标志着加密手机动作的完毕. 详细位置是在alps\packages\apps\Settings\src\com\an ...
- java之Map源代码浅析
Map是键值对.也是经常使用的数据结构. Map接口定义了map的基本行为.包含最核心的get和put操作,此接口的定义的方法见下图: JDK中有不同的的map实现,分别适用于不同的应用场景.如线程安 ...
- Java 实现一个链表
public class MyList { static class Node {// 节点类 Object data; Node next; public Node(Object data) {// ...
- Codeforces Round #306 (Div. 2) A B C
题目链接:http://codeforces.com/contest/550 A 暴力一发. 代码: #include <iostream> #include <stdio.h> ...
- commons.fileupload 文件上传
编辑jsp页面获取文件 <html> <head> <base href="<%=basePath%>"> <title> ...
- zabbix 监控zookeeper
1.监控脚本如下:check_zookeeper.sh 1 2 #!/bin/bash echo mntr | nc 127.0.0.1 2182 | grep "$1" |awk ...