js 强转规范解读
js的强转是我们很容易遇到坑的一个地方 比如 == 会产生很有意思的事情(使用===还是最佳实践的) 或者+new Date()一个当前的数字时间戳 这里面都涉及到强转 下面分享下学习强转的过程
简单理解强转 强转是指强制将一种类型的对象或者实体转换成另一种的行为(也就是这种转换的行为不是你主动控制的 区别类型的显示转换) 在发生强转的时候,js总是将一个复杂的对象转化为一个基础的类型值
var num = 1111;
var b = "" + num;
typeof b; //string
var c = "10";
var d = +c;
typeof d; //number
js在实现强转的时候,会通过调用toString()或者valueOf()返回对象的默认值,这里面涉及到一个抽象操作ToPrimitive 下面是强转的流程
抽象操作ToPrimitive(input,PreferredType) --> 调用对象内部的[[DefaultValue]] ,[[DefaultValue]]接收PreferredType --> 调用对象的ValueOf()或者toString()方法
所以当我们在创建自定义对象的,希望在转换基本值的时候,对象能按照我们的要求去进行一些操作,就需要在对象的原型上实现toString()和valueOf()方法 并且确保他们能按照我们的意图进行调用
var person = function(name,age) {
this.name = name;
this.age = age;
};
person.prototype.toString = function() {
return 'hi' + this.name;
};
person.prototype.valueOf = function() {
return this.age;
};
var test = new person("haha",18);
console.log(+test); //18
console.log(test + ''); //18 在转换成字符串的时候和数字的时候 都调用了我们设置的valueOf方法 并不合理 问题出现在了toPrimitive中
下面是ES6中关于toPrimitive的描述

简单的理解就是它会根据hint也就是PreferredType调用[[DefaultValue]]方法,然后调用toString()或者valueOf()方法 为什么date对象上能实现可控的toString()和valueOf方法调用呢

在规范中对Date对象和Symbol对象进行了处理 所以他能按照我们的需要去调用toString()或者valueOf()方法 但是在自定义对象上呢 我们是无法传入hint值的,在没有hint值的情况下会默认hint值为“number”,就会导致上面的例子的出现 如果要达到我们的要求就需要一些小的技巧
插播 valueOf方法 在Object上的方法,返回对象的原始值,在js中许多的内置对象都重新定义了该方法 例如在数组对象上调用valueOf方法会返回数组的实例对象
var test = new person("haha",18);
console.log(+test); //
console.log([test] + ''); //hihaha
通过改写上面的例子 将test用数组进行包裹 在toPrimitive方法的时候 会返回数组对象 toPrimitive会继续调用返回基础值,导致对数组每一个元素的toString()方法的调用 所以达到了我们的要求
js 强转规范解读的更多相关文章
- html、css、js的命名规范
最佳原则 坚持制定好的代码规范. 无论团队人数多少,代码应该同出一门. 项目命名 全部采用小写方式, 以下划线分隔. 例:my_project_name 目录命名 参照项目命名规则: 有复数结构时,要 ...
- js的命名规范
js的命名规范 1.驼峰命名法:首字母是小写的,接下来的字母都以大写字符开头.例如: var testValue = 0; var oneValue = 10; 2. ...
- [JavaScript] 后端js的模块化规范CommonJs
CommonJs概述 主要是单个文件定义的变量,函数,类都是私有的,其他文件不可见,单位的作用域 通过 exports(modules.exports)对外暴露接口,通过 require 加载模块 n ...
- js的模块化规范
js的模块化规范常见的有:AMD,CMD,commonJS,UMD,es6 前期在没有模块化的时候,js文件十分庞大,于是就按功能抽离划分为多个js文件. 但是在html页面通过script的方式加载 ...
- JS详细图解全方位解读this
JS详细图解全方位解读this 对于this指向的理解中,有这样一种说法:谁调用它,this就指向谁.在我刚开始学习this的时候,我是非常相信这句话的.因为在一些情况下,这样理解也还算说得通.可是我 ...
- ULID规范解读与实现原理
前提 最近发现各个频道推荐了很多ULID相关文章,这里对ULID的规范文件进行解读,并且基于Java语言自行实现ULID,通过此实现过程展示ULID的底层原理. ULID出现的背景 ULID全称是Un ...
- 前端js的书写规范和高效维护的方案_自我总结使用的方案
作为程序员,人生最值得幸福的事有几件: 解决困扰了很长时间的问题 升职加薪 找个漂亮又靠谱的对象 深得领导的喜欢 带领团队冲锋陷阵 ... 哈哈,这些都是梦想,暂时想想就好了.这肯定和我说的东西不符合 ...
- js 模块化的规范
The Module Pattern,模块模式,也译为模组模式,是一种通用的对代码进行模块化组织与定义的方式.这里所说的模块(Modules),是指实现某特定功能的一组方法和代码.许多现 ...
- JS前端编码规范
转自<前端编码规范之JavaScript>,网址:http://www.cnblogs.com/hustskyking/p/javascript-spec.html 一个是保持代码的整洁美 ...
随机推荐
- The Installation and Compilation of OpenCASCADE
OpenCASCADE的编译 The Installation and Compilation of OpenCASCADE eryar@163.com 一. 安装OpenCASCADE 可以从Ope ...
- Hibernate注解
前言: 最近正在学习Hibernate通过注解(annotation)来管理映射关系,以前都是通过XML映射文件.下面拿个小例子说一下. 数据库物理模型: 数据库的描述: 一篇博客随笔可以分到不同的类 ...
- 安装Ubuntu时分区选择
最近购买来一台二手笔记本.型号是:Dell Latitude D520.回来之后就装上来Ubuntu12.04,开始是安装的UbuntuKylin 13.04.不知道是机器配置不行,还是本身系统有点卡 ...
- 使用VS Code开发ASP.NET 5 应用程序
本文简要地翻译了 https://code.visualstudio.com/Docs/runtimes/ASPnet5 并结合我的实践做了一些说明. 准备工作 1.安装VS Code https: ...
- boa + ajax + cgi ajax请求cgi
最近公司要做一个通讯管理机,然后需要和另外一个同事一起做,我们需要用到boa+Ajax+CGI,以前没试过与CGI交互,一开始发现问题挺大的,用ajax请求cgi,总是不返回数据,又或者请求回来的是c ...
- 用jekyll制作高大上的网站(二)——实际应用
最近公司要制作个文档库,直接就可以将jekyll应用到实际中. 模版使用了Jekyll Clean,这么模版相对内部简单一点,学习成本不会很大,而复杂的Minimal Mistakes就当作参考. 模 ...
- 1Z0-053 争议题目解析694
1Z0-053 争议题目解析694 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 694.As part of archiving the historical data, you ...
- MySQL学习(一)MySQLWorkbench(MySQL可视化工具)下载,安装,测试连接,以及注意事项
PS:MySQLWorkbench是MYSQL自带的可视化工具,无论使用哪个可视化工具,其实大同小异,如果想以后走的更远的话,可以考虑使用命令行操作数据库MYSQL.可视化工具让我们初学者更能理解数据 ...
- 做图表统计你需要掌握SQL Server 行转列和列转行
说在前面 做一个数据统计和分析的项目,每天面对着各种数据,经过存储过程从源表计算汇总后需要写入中间结果表以提高数据使用效率,那么此时就需要用到行转列和列转行. 1.列转行 数据经过计算加工后会直接生成 ...
- PHP之验证码的实现
简单的用PHP实现验证码: ?php /** *制作验证码 *1.启动session *2.设定标头 *3.创建画布 *4.创建颜色 *5.创建随机数并放到画布上 *6.将得到的若干随机数放入sess ...