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 强转规范解读的更多相关文章

  1. html、css、js的命名规范

    最佳原则 坚持制定好的代码规范. 无论团队人数多少,代码应该同出一门. 项目命名 全部采用小写方式, 以下划线分隔. 例:my_project_name 目录命名 参照项目命名规则: 有复数结构时,要 ...

  2. js的命名规范

                   js的命名规范   1.驼峰命名法:首字母是小写的,接下来的字母都以大写字符开头.例如: var testValue = 0; var oneValue = 10; 2. ...

  3. [JavaScript] 后端js的模块化规范CommonJs

    CommonJs概述 主要是单个文件定义的变量,函数,类都是私有的,其他文件不可见,单位的作用域 通过 exports(modules.exports)对外暴露接口,通过 require 加载模块 n ...

  4. js的模块化规范

    js的模块化规范常见的有:AMD,CMD,commonJS,UMD,es6 前期在没有模块化的时候,js文件十分庞大,于是就按功能抽离划分为多个js文件. 但是在html页面通过script的方式加载 ...

  5. JS详细图解全方位解读this

    JS详细图解全方位解读this 对于this指向的理解中,有这样一种说法:谁调用它,this就指向谁.在我刚开始学习this的时候,我是非常相信这句话的.因为在一些情况下,这样理解也还算说得通.可是我 ...

  6. ULID规范解读与实现原理

    前提 最近发现各个频道推荐了很多ULID相关文章,这里对ULID的规范文件进行解读,并且基于Java语言自行实现ULID,通过此实现过程展示ULID的底层原理. ULID出现的背景 ULID全称是Un ...

  7. 前端js的书写规范和高效维护的方案_自我总结使用的方案

    作为程序员,人生最值得幸福的事有几件: 解决困扰了很长时间的问题 升职加薪 找个漂亮又靠谱的对象 深得领导的喜欢 带领团队冲锋陷阵 ... 哈哈,这些都是梦想,暂时想想就好了.这肯定和我说的东西不符合 ...

  8. js 模块化的规范

           The Module Pattern,模块模式,也译为模组模式,是一种通用的对代码进行模块化组织与定义的方式.这里所说的模块(Modules),是指实现某特定功能的一组方法和代码.许多现 ...

  9. JS前端编码规范

    转自<前端编码规范之JavaScript>,网址:http://www.cnblogs.com/hustskyking/p/javascript-spec.html 一个是保持代码的整洁美 ...

随机推荐

  1. java IO流 之 字节流

    一.file类的常用操作 File file=new File("E:\\test\\javaIo"); System.out.println(file.isDirectory() ...

  2. spring mvc Error instantiating class ** with invalid types () or values (). Cause: java.lang.NoSuchMethodException:

    一般引起这种问题的原因是 bean和mapper里面的字段未对应上,或者 bean里面没有默认的构造函数引起的.我今天是后面的一个,自己写了带参数的构造函数引起的这个问题...

  3. webpack摸索(一)webpack-dev-server热模块替换

    webpack-dev-server 是生成在内存中的 本地开发: index.html <!DOCTYPE html> <html lang="en"> ...

  4. mysql导入导出sql文件

    window下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql2. ...

  5. js高程读书笔记(第4章--变量、作用域和内存)

    JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何总数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 1. ...

  6. EF-DbUpdateException解决方案

    图二:

  7. 模拟image的ajaxPrefilter与ajaxTransport处理

    ////////////////////////////////////////////////////////////////// // options 是请求的选项 // // originalO ...

  8. Hibernate学习之hibernate.cfg.xml

    <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hi ...

  9. Create Volume 操作(Part II) - 每天5分钟玩转 OpenStack(51)

    上一节我们讨论了 Cinder 创建 Volume 的第一部分,cinder-api 的操作,本节继续第二部分,cinder-scheduler 调度工作. cinder-scheduler 执行调度 ...

  10. 应用程序框架实战十三:DDD分层架构之我见

    前面介绍了应用程序框架的一个重要组成部分——公共操作类,并提供了一个数据类型转换公共操作类作为示例进行演示.下面准备介绍应用程序框架的另一个重要组成部分,即体系架构支持.你不一定要使用DDD这样的架构 ...