js中的原始值是什么?

在ECMAScript中,变量可以存放两种类型的值,即原始值和引用值.


原始值(primitive value):


    原始值是固定而简单的值,是存放在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置.


引用值(reference value):


    引用值则是比较大的对象,存放在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(pointer),指向存储对象的内存处.


    所有引用类型都集成自Object.




有哪些类型是原始类型呢?


    原始类型(primitive type)有以下五种类型:Undefined,Null,Boolean,Number,String;


原始值和对象的根本区别,原始值无法更改,数字,布尔值,字符串不可更改的。尽管字符串定义了许多方法,可以把字符串当做由字符构成的数组,但不管是slice(),substr(),substring()都是创建一个新的字符串。原始值是绝对不允许更改的。而对象确实可以更改的,就像数组。再者原始值之间的比较就是值得比较,只要是值相等,他们就可以用“==”判断,而对象是无法比较的,就算属性,方法完全一样,也是不相等的。对象的比较都是引用的比较,只有两个引用指向用一个对象时,他们才相等。


       对象转换原始值,所有的对象都继承了toString()和valueOf()方法。前者返回该对象的字符串,后者如果存在原始值,返回原始值,如果对象无法表示一个原始值,则返回该对象本身。


valueOf()


每个JavaScript固有对象的 valueOf 方法定义不同。
对象 返回值
Array 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。
Boolean Boolean 值。
Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function 函数本身。
Number 数字值。
Object 对象本身。这是默认情况。
String 字符串值。


Math 和 Error 对象没有 valueOf 方法。


------------------------------------------------------------------------------------------------------------------------------


一般来说,对象到字符串的转换经过了如下步骤:


1.如果对象具有toString()方法,则调用这个方法。如果它返回一个原始值,js将这个值转换成字符串,并返还这个字符串结果。


2.如果对象没有toString()方法,或者这个方法并不返回一个原始值,那么js将调用valueOf()方法。


3.否则,js无法从toString()或者valueOf()获得一个原始值,因此这时它将抛出一个类型错误异常。


 


一般来说,对象到数字的转换过程中,js做了同样类似的事情,但这里它会首先尝试使用valueOf()方法:


1.如果对象具有valueOf()方法,后者返回一个原始值,则js将这个原始值转换成数字,并返回这个数字。


2.否则,如果对象具有toString()方法,后者返回一个原始值,则js将转换并返回。


(首先js转换成相应的字符串原始值,再继续将这个原始值转换成相应的数字类型,再返回数字)


3.否则,js抛出一个类型错误异常。


 


 对象通过toString或valueOf方法转换为原始值,JS语言核心的内置类首先尝试使用valueOf(),再尝试使用toString()


一个小李子


“1” == true;


将返回true,转换形式是:true首先转换为1,然后再执行比较。接下来字符串“1”也转换成了数字1,相等,所以返回true


另外如:


var str = new String('hello,world');
console.log(typeof str); //'object'
console.log(typeof str.valueOf()); //'string'


 


对于所有非日期对象来说,对象到原始值的转换基本上是对象到数字的转换


(首先调用valueOf,但日期对象则使用对象到字符串的转换模式,但这种转换只执行一次就立即被使用,不会像上面所说的那般 先转成字符串再转成相应的数字类型)


比如说,js中“+"运算符可以进行数学加法和字符串连接操作。


如果他它的其中一个操作数是对象,则js将使用特殊的方法将对象转换成原始值,而不是使用其他算术运算符的方法执行对象到数字的转换,”==“运算符类似


和”==“一样,”<"与其他运算符也会做对象到原始值的转换,但要出去日期对象的特殊情形


“-“减号运算符把两个操作数都转换成数字


比如:
复制代码


var now = new Date();
console.log(now);  // Date {Sat Apr 04 2015 13:21:08 GMT+0800}
console.log(typeof (now+1));  //string
console.log((now+1));  //Sat Apr 04 2015 13:21:08 GMT+08001
console.log(typeof (now-1));  //number
console.log((now-1));  // 1428124868474
console.log(now == now.toString());  //true
console.log(now > now -1); //true


复制代码


var date = new Date(); 
var date_string = date.toString(); 
var date_value = date.valueOf(); 
alert(date == date_string); //true
alert(date == date_value); //false


 



  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值