1和new Number(1)有什么区别

author: @Tiffanysbear

总结,两者的区别就是原始类型和包装对象的区别。

什么是包装对象

对象Number、String、Boolean分别对应数字、字符串、布尔值,可以通过这三个对象把原始类型的值变成(包装成)对象:

var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);

我们来看下实际的v1、v2、v3是什么呢?

typeof v1;// "object"
typeof v2;// "object"
typeof v3;// "object" v1 === 123; // false
v1 == 123; // true

可以理解的是,v1此时是对象,===比较的是内存地址,因此跟数字Number 123不相等;可是为什么v1 == 123得到的值会是true呢?

那这就是包装对象在使用时的问题了。再来理解一下什么是原始类型。

什么是原始类型

比如123这类就是原始类型,原始类型并不是一个对象,因此并没有对象具有的一些属性和方法;但是为什么能调用(123).toFixed()这些方法呢?

原因就是这些方法都是像包装对象"借用"来的,toFixed方法是在Number对象原型上的方法。

(123).toFixed === Number.prototype.toFixed // true
"123".indexOf === String.prototype.indexOf // true

JS求值

JS在求值运算时,总是会求出原始资料的值,而不是用对象。如下面的例子:

var a = new Number(122);
var b = a + 33; // 155
typeof b; // number

但是要注意 new Boolean 的用法,只有当 new Boolean 的参数值为 null 或者 undefined 时,求值转换的原始资料的值才是false,其他情况都是true;

!!(new Boolean(false)) // true

所以尽量不要使用 new Boolean 这个包装对象进行赋值,否则会产生一些误会。

运算时调用 valueOf 和 toString 的优先级

先说下结论:

1、进行对象转换时(alert(e2)),优先调用 toString 方法,如没有重写 toString 将调用 valueOf 方法,如果两方法都不没有重写,但按 Object 的 toString 输出。

2、进行强转字符串类型时将优先调用 toString 方法,强转为数字时优先调用 valueOf。

3、在有运算操作符的情况下,valueOf的优先级高于toString。

以下是三个例子

第一个:

let e2 = {
n : 2,
toString : function (){
console.log('this is toString')
return this.n
},
valueOf : function(){
console.log('this is valueOf')
return this.n*2
}
}
alert(e2) // 2 this is toString
alert(+e2) // 4 this is valueOf
alert(''+e2) // 4 this is valueOf
alert(String(e2)) // 2 this is toString
alert(Number(e2)) // 4 this is valueOf
alert(e2 == '4') // true this is valueOf
alert(e2 === 4) //false ===操作符不进行隐式转换

第二个:

let e3 = {
n : 2,
toString : function (){
console.log('this is toString')
return this.n
}
}
alert(e3) // 2 this is toString
alert(+e3) // 2 this is toString
alert(''+e3) // 2 this is toString
alert(String(e3)) // 2 this is toString
alert(Number(e3)) // 2 this is toString
alert(e3 == '2') // true this is toString
alert(e3 === 2) //false ===操作符不进行隐式转换

第三个:

Object.prototype.toString = null;
let e4 = {
n : 2,
valueOf : function(){
console.log('this is valueOf')
return this.n*2
}
}
alert(e4) // 4 this is valueOf
alert(+e4) // 4 this is valueOf
alert(''+e4) // 4 this is valueOf
alert(String(e4)) // 4 this is valueOf
alert(Number(e4)) // 4 this is valueOf
alert(e4 == '4') // true this is valueOf
alert(e4 === 4) //false ===操作符不进行隐式转换

1和new Number(1)有什么区别的更多相关文章

  1. 单词number 和 numeral 的区别

    原文: http://blog.sina.com.cn/s/blog_72cd06360100vn7t.html be of 的用法,相当于表征特征或属性的形容词. 简单地说,“of + 名词”等于“ ...

  2. 关于 Number() parsint() abs() 的区别

    1. parseInt(‘’)      parseInt() 函数可解析一个字符串,并返回一个整数. 如果第一个字符不是数字或者负号,parseInt() 就会返回NaN 2.Number()    ...

  3. JavaScript中Number(),parseInt()和parseFloat()区别

    parseInt() 函数可解析一个字符串,并返回一个整数; parseFloat() 函数可解析一个字符串,并返回一个浮点数, 以上都是截取转换,具体代码如下: alert(parseInt(&qu ...

  4. Number()和new Number()的区别以及一种简单实现

    看MDN Beginners文档的时候注意到了这种用法 var n1 = Number(123); , 冒出的第一个疑问就是和 var n2 = new Number(123); 有什么区别呢? 首先 ...

  5. 【Stirling Number】

    两类Stirling Number的简介与区别(参考自ACdreamer的CSDN) Stirling Number I --- s(n,k):将n个物体排成k个非空循环排列(环)的方法数. 递推式: ...

  6. JavaScript 与 PHP 的语法区别

    1. 基本类型 php的基本类型分别: .基本数据类型:整型.小数(float/double).字符串.布尔类型 .复合类型:数组.对象 .特殊类型:Null,资源类型 JavaScript的基本类型 ...

  7. [LeetCode] 313. Super Ugly Number 超级丑陋数

    Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...

  8. javascript 类型转换。

    学校js感觉好漫长,断断续续,要坚持每天都能学到点,总结了下数据类型的转换. Javascript的变量是松散类型的,它可以存储Javascript支持的任何数据类型,其变量的类型可以在运行时被动态改 ...

  9. [转]Java中导入、导出Excel

    原文地址:http://blog.csdn.net/jerehedu/article/details/45195359 一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样 ...

随机推荐

  1. 关于重写equals()和hashCode()的思考

    最近这几天一直对equals()和hashCode()的事搞不清楚,云里雾里的. 为什么重写equals(),我知道. 但是为什么要两个都要重写呢,我就有点迷糊了,所以趁现在思考清楚后记录一下. 起因 ...

  2. Spring 入门程序

    1.0 导包的时候要注意: 以上的第一个是.class文件 以上的第二个是文件的解释性页面. 以上的第三个是.java文件 2.0 配置文件需要导入依赖(有dtd 依赖,也有xsd依赖) ²  从be ...

  3. BZOJ 2460:元素(贪心+线性基)

    题目链接 题意 中文题意 思路 线性基学习 题目要求选价值最大的并且这些数异或后不为0,可以考虑线性基的性质:线性基的任意一个非空集合XOR之和不会为0.那么就可以贪心地对价值从大到小排序,加入线性基 ...

  4. POJ 1986:Distance Queries(倍增求LCA)

    http://poj.org/problem?id=1986 题意:给出一棵n个点m条边的树,还有q个询问,求树上两点的距离. 思路:这次学了一下倍增算法求LCA.模板. dp[i][j]代表第i个点 ...

  5. django基础知识之模板:

    模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...

  6. django基础知识之模型查询:

    查询集表示从数据库中获取的对象集合 查询集可以含有零个.一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主 ...

  7. MySQL主从、主主、半同步节点架构的的原理及实验总结

    一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...

  8. 扩展了一些String常用的方法.

    using System; using System.Diagnostics; using System.Security.Cryptography; using System.Text; using ...

  9. IntelliJ Idea 常用快捷键总结-0 #<间断性更新中...>,部分有示例

    IntelliJ Idea 常用快捷键总结-0 <间断性更新中...>,部分有示例 自动补齐代码 常用的有for循环体,fori可以输出循环语句: eg: public void test ...

  10. Elasticsearch(二)集群设置

    Elasticsearch支持多播和单播自动发现节点,但多播已经不被大多数操作系统支持,并且安全性不高,这里主要用单播发现节点,配置如下 discovery.zen.ping.multicast.en ...