Javascript基本类型回顾
本文是学习和总结ECMAScript5.1规范形成的。是对规范中所提及的Javascript类型进行剖析后的个人观点的表达(如有Bug望各位道友指正)。主要是各类型的实例方法,不包含任务构造函数的方法。剖析的切入点如下:
1. 是否可以继承
2.通用方法、非通用方法,以及通用方法的使用。
名词解释: 通用:表示此方法可以被其他类型调用,也就是this指针可以改变 非通用:不可被其他类型调用,this指针只能是当前类型
一、Function与Object
var Cn = new Function("alert('1');this.a='a';");
var _cn = new Cn(); //_cn:Object类型;Cn:Function类型,new的Function,他的类型都是Object
new Function和关键字function是相同的作用,创建一个Function的实例。
| 实例方法 | 是否通用 | 说明 |
| constructor | 非通用 | |
| toString | 非通用 | |
| toLocalString | 非通用 | 为派生类提供接口 |
| valueOf | 非通用 | |
| hasOwnProperty | 非通用 | 不考虑原型链 |
| isPrototypeOf | 非通用 | 判断对象是否存在于指定对象的原型链上 |
| propertyIsEnumerable | 非通用 | 不考虑原型链 |
二、Array可以继承
every返回第一个为false的元素
| 实例方法 | 是否通用 | 说明 |
| constructor | 非通用 | |
| toString | 通用 | |
| toLocaleString | 通用 | |
| concat | 通用 | |
| join | 通用 | |
| pop | 通用 | |
| push | 通用 | |
| reverse | 通用 | 反转数组 |
| shift | 通用 | 删除数据第一个位置的元素,并返回 |
| slice | 通用 | 返回start和end之间的元素,start不被包含 |
| sort | 通用 | |
| splice | 通用 | 删除数据元素,以索引下标开始,个数 |
| unshift | 通用 | 在数组第一个位置插入元素 |
| indexOf | 通用 | |
| lastIndeOf | 通用 | |
| every | 通用 | 返回第一个为false的元素 |
| some | 通用 | 返回第一个为true的元素 |
| forEach | 通用 | |
| map | 通用 | |
| filter | 通用 |
通用使用方法示例代码:
function CustomFn(){
this["0"] = "asfd";
this["1"] = "第二个";
this["2"] = "第三个";
this.length = 3;
}
var pt = CustomFn.prototype;
pt.join = Array.prototype.join;
pt.shift = Array.prototype.shift;
var cu = new CustomFn();
console.log(cu.join("-"));
cu.shift();
console.log(cu.join("-"));
注意:想要利用Array的通用方法,类的结果就得构建得像一个数组,所以我们必须满足数组两个必要的条件:
- 下标:用0,1,2是为了表示数组索引下标;
- 长度:length是为了表示数组的长度;
三、Number、String、Boolean、Date
String类型有些许的通用性方法,但Number、Boolean和Date却未能明确标记出通用性方法。方法细节此处就不存赘述,如想具体了解可查看ECMAScript5.1的规范。这里只给出一个Number使用String通用方法的示例代码:
function CustomNumber(){
}
var pt = CustomNumber.prototype;
pt.toString = function(){
return 134;
}
pt.ct = String.prototype.charAt;
var _num = new CustomNumber();
console.log(_num.ct(1));
Number.prototype.cCharAt = String.prototype.charCodeAt;
console.info((10).cCharAt(1));
注意点:
- 能被其他对象的引用的只有通用方法
- 重写基类的原型方法,如CustomNumber类的原型方法toString(重写的Object类的),为什么要重写toString,这个可从ecmaScript规范中获得,因为他在调用charAt、charCodeAt等方法是会先调用toString方法获取值。
- 类型转换:CheckObjectCoercible方法,内部还会调用ToObject方法,将基本类型转换为引用类型。
四、Error
用于显示或抛出程序运行时的异常信息,主要name、message等实例属性(可以设置的),Stack(只读,异常的堆栈信息)。
ECMAScript5.1派生类实现代码:
function Inherit(Sup, Chid){
Chid.prototype = Object.create(Sup.prototype); //作为函数或者类时的原型
Object.defineProperty(Chid,'constructor',{
value: Chid,
enumerable:false,
writable:true,
configurable:true
}); //构造函数
Chid.__proto__ = Sup; //作为对象的原型(构建原型链)
}
var CustomError = function(_error){
Inherit(_error, CustomError);
function CustomError(){
var applyCustructor = (CustomError.__proto__ || Object.getPrototypeOf(CustomError)).call(this); //执行父级的构造函数
//父类构造函数有返回值,就有返回值,否则就用this
var _this = ( typeof applyCustructor == 'object' || typeof applyCustructor == 'function' ) ? applyCustructor : this;
_this.name = 'sdf';
return _this;
}
return CustomError;
}(Error);
var _error = new CustomError();
throw _error;
重点理解:var applyCustructor = (CustomError.__proto__ || Object.getPrototypeOf(CustomError)).call(this);这句代码,表示执行CustomError原型上的构造函数(也就是Error),与var applyCustructor = Error.call(this);是等效的
ES6的派生类实现:
class CError extends Error{
constructor(){
super();
this.name = '子类';
}
}
var _e = new CError();
V8环境下运行的区别:
Javascript基本类型回顾的更多相关文章
- JavaScript事件类型
JavaScript事件类型 Web浏览器中可能发生的事件有很多类型.这里我将主要将下面几种常用的事件类型: UI事件 焦点事件 鼠标与滚轮事件 键盘与文本事件 复合事件 变动事件 HTML5事件 设 ...
- Flow: JavaScript静态类型检查工具
Flow: JavaScript静态类型检查工具 Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可 ...
- javascript 操作符类型隐性转换
javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...
- javascript学习-类型判断
javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...
- JavaScript的类型自动转换高级玩法JSFuck
0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!( ...
- 面向对象的JavaScript --- 动态类型语言
面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...
- javascript 字典类型的使用
javascript 字典类型的使用 1.使用Array: var arr = new Array(); arr["zs"] = "zhangsan"; ar ...
- javascript变量类型及作用域
javascript变量类型及作用域 一.简介 变量类型 ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型. 基本类型 基本类型指的是简单的数据段,5种基本数据类型:undef ...
- js课程 1-3 Javascript变量类型详解
js课程 1-3 Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...
随机推荐
- 三大家族(offset、scroll、client)
offset.scroll.client三大家族 offset家族 offsetWidth 与 offsetHeight offset 偏移 用于获取元素自身的位置和大小 offsetWidth和of ...
- pygame学习之绘制圆
import pygame from pygame.locals import * pygame.init() screen = pygame.display.set_mode((600, 500)) ...
- 研究比对搞定博客 canvas-nest.js
经过比对网站源码,发现大的差异,复制代码添加成功. 参考:https://www.cnblogs.com/kexing/p/7264767.html 申请js权限 编辑 具体编辑请自行实验, 附上 ...
- 小程序即时聊天(仅页面功能,未接websocket)
我们都知道小程序是不能直接操作dom的,所以做即时通讯聊天功能的时候也就不能像之前做的一样:点击发送的时候,拼接一个节点到页面上.话不多说,以下是效果和代码: -------------------- ...
- Redis数据库概述
Redis数据库概述 Redis是什么 redis是一个高性能的key-value存储系统.支持的value类型相对更多,包括string,list,set,zset(sorted set --有序集 ...
- python爬取房天下数据Demo
import requests from bs4 import BeautifulSoup res = requests.get('http://sh.esf.fang.com/chushou/3_3 ...
- TypeError: a bytes-like object is required, not 'str'
python bytes和str两种类型转换的函数encode(),decode() str通过encode()方法可以编码为指定的bytes 反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数 ...
- vs2012,打开早期版本窗体错误
<runtime> <NetFx40_LegacySecurityPolicy enabled="true"/></runtime>
- 转发 Learning Go — from zero to hero
原文:https://medium.freecodecamp.org/learning-go-from-zero-to-hero-d2a3223b3d86 Learning Go — from zer ...
- 查看 FormData 中已存在的值
var formData = new FormData(); formData.append('name','bob'); formData.append('sex','male'); formDat ...