JavaScript的值类型及类型转换


在JavaScript中,数据类型分为两类,即原始值引用值

原始值

是存储在栈中的简单数据段,它值直接存储在变量访问的位置。
原始值类型:Number、String、Boolean、undefined、null

  • undefined
    当变量 声明了但没有初始化 时候,该变量的默认值即为undefined
    var test ;
    console.log(test); //undefined
    
    没有声明 的变量,值虽然不是undefined,但是数据类型还是undefined
    var test ;
    console.log(typeof (test)); //undefined
    console.log(typeof (myTest)); //undefined
    
    函数无明确返回值时,默认返回值为null
    function test(){}
    console.log(test());
    
  • null
    与undefined的区别是,undefined表示未定义,但是null有值,只不过这个值是空。
    var demo = null;
    console.log(demo); // null
    var test;
    console.log(test); //undefined
    
    当函数返回一个对象,找不到这个对象时候,返回值为null
  • String
    在许多语言中,字符串都被看作引用类型,而非原始类型,因为字符串的长度是可变的。JavaScript打破了这一传统。

引用值

存储在堆中的对象,在变量处的值是一个指针,指向存储对象的内存处。
主要有数组array、对象object、函数function。

这两种类型到底有什么区别?我们来举个例子

var test = 111;
newTest = test;
Test = 222;
console.log(test); //111
console.log(newTest); //222

test值的改变对newTest没有影响。
test是原始值,他的值存在栈里,执行newTest = test,栈内开辟新空间,保存newTest的值,此后test再怎么改变与newTest无关。

var arr = [1,2,3];
newArr = arr;
arr.push(4);
console.log(arr);//[1, 2, 3, 4]
console.log(newArr);//[1, 2, 3, 4]

arr是引用值,他的变量名存在栈里,但值存在堆里,变量名指向的堆空间,执行newArr = arr,变量名newArr与arr指向相同的堆空间,所以arr的值改变,就导致newArr的值也改变。

var arr = [1,2,3];
newArr = arr;
arr = [1,2,3,4,5,6]
console.log(arr);// [1, 2, 3, 4, 5, 6]
console.log(newArr);//[1, 2, 3]

JavaScript类型转换

显式类型转换

typeof可以检验数据类型
只能返回 numner、string、boolean、undefined、object、function,并且typeof返回结果是string类型

NaN属于number类型

  console.log( typeof(typeof(123))); // string

转换为数字字符串允许开头结尾有空格,但是只要有非空格字符,字符串转换为数字的结果就是NaN

  • Number( ) 把其他类型的数据转换成数字类型的数据。
var demo = Number('123');
console.log(demo) // number123
demo = Number(true)
console.log(demo) // 1
demo = Number(NaN)
console.log(demo) // NaN
demo = Number(undefined)
console.log(demo) // NaN
var demo = Number("ooo");
console.log(demo) //NaN
var demo = Number(function(){});
console.log(demo) //NaN
  • parseInt(string, radix) 解析一个字符串,并返回一个整数
    string表示要被解析的字符串。
    radix表示要将字符串转化的进制。
    值介于 2 ~ 36 之间。 该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。 如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
    当参数string里面既包括数字字符串又包括其他字符串的时候,它会将看到其他字符串就停止了,不会继续转换后面的数字型字符串了。
  parseInt('123abc345') // 123
  parseInt('abc123') // NaN
  parseInt('123') // 123
  parseInt('abc') // NaN
  parseInt(true) // NaN
  • parseFloat( )将字符串转换成浮点类型的数字
    识别第一个小数点以及后面的数字,第二个小数点后的无法识别,遇到非数字字符串停止识别。

  • toString( )将任意数据类型转换为字符串
    与前几个不同的是,他是对象上的方法
    undefiend和null没有toString方法

    引用值类型(对象、函数、数组)转换为字符串,步骤如下

    1. 如果对象有toString(),调用 toString(),如果返回原始值,将这个值转换为字符串;如果返回的是复合类型或对象没有toString(),则调用 valueOf()
    2. 如果 valueOf()返回原始值类型,将这个值转换为字符串;
    3. 如果返回的是复合类型,则抛出一个类型错误异常。
  • Boolean( )把任何类型转换成布尔类型

  Boolean(0); // false
  Boolean(undefined); // false
  Boolean(null); // false
  Boolean(''); // false
  Boolean(NaN); // false

隐式类型转换

  • isNaN()
    检测数据是不是非数类型。
    先将你传的参数调用一下Number方法之后,再看看结果是不是NaN,不过这个方法可以检测NaN本身。
  isNaN(NaN); // true
  • ==

1,null和undefined,相等。
2,数字和字符串,转化为数字再比较。
3,如果有true或false,转换为1或0,再比较。
4,如果有引用类型,优先调用valueOf。
5,其余都不相等。

console.log(undefined == false); // false
console.log(null == false);      // false
console.log(0 == false);         // true
console.log(NaN == false);       // false
console.log("" == false);        // true
1 !== '1';     // true
1 !== 1;     // false
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 值类型转换将值从一种类型转换为另一种类型通常称为类型转换,这是显示的情况;隐式的情况称为强制类型转换。JavaSc...
    xpwei阅读 3,624评论 0 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,032评论 19 139
  • 昨天描绘了一个画面,“我跪在破碎的房间里想要收拾残骸,但是我不知道从哪里开始,无能为力,这种无力感让我觉得很难过。...
    无所事事的饭饭阅读 477评论 1 3
  • 新的一天,新的一切,满满的能量等待释放,加油吧!
    丶柒v阅读 152评论 0 0
  • 再一遍写我,有些不知所措 我丢了公交卡,丢了钱包 同时也丢了身份证,这个城市的借记卡和信用卡 我感觉自己成了无人领...
    Jonah_Wang阅读 175评论 0 0